User since
2003-08-04
7321
Artikel
ModeratorIn
RDW #A - Raetsel der Woche Nummer A
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Regeln: * Bitte nicht vor Ablauf der ersten 120 Stunden ( = fünf Tage ) nach
~~~~~~~ Veroeffentlichung Hinweise (Spoiler) oder Loesungen veroeffent-
lichen!
* Wenn diese Zeit abgelaufen ist, werde ich einen Thread mit passen-
dem Titel erstellen, in dem die Loesungen gepostet werden und dis-
kutiert werden koennen.
* Die Loesungen sollten nicht nur gepostet, sondern auch an mich ge-
mailt werden, damit ich sie testen, "bewerten" und zusammenfassen
kann. Die Adrese dafuer lautet:
esskar <---AT---> perl <---MINUS---> community <---DOT---> de
Im Betreff sollte 'RDW' und die Nummer des Raetsels stehen. Hilf-
reich waere neben dem Quellcode der Username im Forum sowie Perl-
und OS-Version, falls Du diese kennst.
* Verstaendnisfragen duerfen in diesem Thread gestellt werden, aber
Tipps und (Teil-) Loesungen sind hier unerwuenscht.
* Ich werde die eingeschickten Programme im Netz zur Verfuegung
stellen, so dass gerade lange Quellcodes nicht (komplett)
gepostet werden muessen.
* Zur Verwendung von Modulen: Ich moechte diese nicht generell aus-
schliessen, aber wenn quasi die komplette Aufgabe durch die Ver-
wendung eines Moduls ersetzt werden kann, ist dies vielleicht nicht
der Sinn der Aufgabe gewesen.
Aufgabe: Alle sichtbaren Rechtecke bestimmen
~~~~~~~~
(Dieser Vorschlag stammt von mir, Fragen bitte an mich richten =)
Schreibe eine Funktion rdw_a die als Parameter ein
Array unbestimmter Größe von Array-Referenzen
nimmt. Jede Array-Referenz enthält vier Zahlen
(unsigned integer/natürliche Zahlen), die für die
Koordinaten eines Recteckes stehen. Nun soll die Funktion die Anzahl der
sichtbaren Rechtecke zurückgeben, würde man sie zeichnen.
Es werden keine doppelten Rechtecke in der Liste vorkommen!
Alle Rechtecke werden eine Fläche haben!
Beispiel1: Gegeben sind zwei Rechtecke: A(0,0, 5,5) und B(3,3, 7,7).
Würde man diese Rechtecke in ein Koordinatensystem zeichnen, würden 3 Rechtecke
sichtbar: einmal A, B und das durch die Überlappung von A mit B entstehende.
Beispiel2: Aus A(1,3, 2,0) und B(0,2, 3,1) entstehen 11 Rechtecke!
Hauptbewertungskriterium ist speed.
Damit noch klar ist, wie der Funktionsaufruf von rdw_a auszusehen hat, hier nochmal
obige Beispiele:
rdw_a([0, 0, 5, 5], [3, 3, 7, 7]);
rdw_a([1, 3, 2, 0], [0, 2, 3, 1]);
Viel Spass. :)
User since
2003-08-04
5872
Artikel
ModeratorIn
> Beispiel2: Aus A(1,3, 2,0) und B(0,2, 3,1) entstehen 11 Rechtecke!
Wie denn? Ich "seh" nur fünf.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite
User since
2004-02-19
1750
Artikel
BenutzerIn
nunja, die fehlenden 6 entstehen dadurch, dass man aus den passenden linien zweier nebeneinader liegenden kleinen rechtecke ein grösseres machen kann u.s.w.
also die beiden rechtecke
[1,3, 0,2], [1,2, 1,2]
würde zu folgendem ergebniss führen:
[1,3, 2,2], [1,3, 2,1], [1,3, 2,0], [1,2, 2,1], [1,2, 2,0], [1,1, 2,0]
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
User since
2003-08-04
7321
Artikel
ModeratorIn
|---|
| 1 |
| |
|------------|
| 4 | 2 | 5 |
|------------|
| |
| 3 |
|---|
1. 1
2. 2
3. 3
4. 4
5. 5
6. 1 und 2
7. 2 und 3
8. 1 und 2 und 3
9. 4 und 2
10. 2 und 5
11. 4 und 2 und 5\n\n
<!--EDIT|esskar|1103128602-->
User since
2003-08-04
5872
Artikel
ModeratorIn
Ich hab mal ein Programm zum Anzeigen der Rechtecke geschrieben, ich hoffe das gilt nicht als Spoiler:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/perl
use strict;
use warnings;
use Tk;
main();
exit;
sub main {
my $mw = MainWindow->new();
$mw->title('RDW #A - Betrachter');
# Anzeigefeld:
my $cnv = $mw->Canvas(-background => 'white',
-state => 'disabled',
-width => 500,
-height => 500,
-relief => 'flat',
-cursor => 'crosshair',
)
->pack(-side => 'bottom',
-expand => 1,
-fill => 'none',
);
# Eingabefeld und Button:
my $f = $mw->Frame(-relief => 'groove',
-borderwidth => 2,
)
-> pack(-side => 'top',
-expand => 1,
-fill => 'x',
);
my $ent = $f->Entry(-width => 75,
)
->pack (-side => 'left',
-expand => 1,
-fill => 'x',
-anchor => 'w',
);
my $btn = $f->Button(-text => 'Anzeigen',
-command => [ \&show, $mw, $cnv, $ent ],
)
->pack (-side => 'top',
-expand => 1,
-fill => 'x',
);
$mw->bind ('<Return>', sub{$btn->invoke()} );
$mw->bind ('<Escape>', sub{$mw->destroy()} );
$ent->focus();
MainLoop();
}
sub show {
my ($mw, $cnv, $ent) = @_;
$cnv->delete('all'); # canvas leeren
(my $rect = $ent->get()) =~ tr~[] ~~d; # müll wegwerfen
my @koord = split /,/, $rect;
unless (@koord > 3 and @koord % 4 == 0) {
print "\a";
return;
}
# Koordinatentransformation:
my ($smin, $smax) = (15, 490);
my $min;
my $max;
$min = $max = $koord[0];
for (@koord) {
$min = $_ if $_ < $min;
$max = $_ if $_ > $max;
}
my $faktor = ($smax-$smin) / ($max-$min);
$_ = int(($_-$min)*$faktor) + $smin for @koord;
# Rechtecke einzeichnen:
while (@koord) {
my $xmin = shift @koord;
my $ymin = 500 - (shift @koord);
my $xmax = shift @koord;
my $ymax = 500 - (shift @koord);
$cnv->createRectangle($xmin, $ymin, $xmax, $ymax);
}
}
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite
User since
2003-08-04
7321
Artikel
ModeratorIn
[quote=Crian,15.12.2004, 16:54]Ich hab mal ein Programm zum Anzeigen der Rechtecke geschrieben, ich hoffe das gilt nicht als Spoiler:[/quote]
nö und danke
ich hoffe es ist nicht zu schwer.
war mir nicht sicher und hab diesmal 5 tage zeit gegeben.
wenn man etwas scharf nachdenkt, ist es gar nicht so schwer.
User since
2003-08-04
14371
Artikel
ModeratorIn
Ich hoffe, dass ich spätestens am Samstag in der Vorlesung etwas Zeit finde, mich der Aufgabe zu widmen. Die scheint mir sehr interessant zu sein!
User since
2003-08-04
5872
Artikel
ModeratorIn
Ich finde es auch sehr interessant, aber ich fürchte Weihnachtsstreß + Weihnachtsball werden mich von einer Beteiligung abhalten ... naja mal sehen ;)
(Zum Anzeigeprogramm: Man kann einfach die hier geposteteten Parameter für die rdw-Funktion per Copy & Paste da ins Eingabefeld kopieren und Return drücken. Mit etwas Glück werden die Rechtecke dann angezeigt ;-)
[quote=esskar,15.12.2004, 17:38]wenn man etwas scharf nachdenkt, ist es gar nicht so schwer.[/quote]
Arrgghh ... *horror* ... wenn einem schon gesagt wird, es wäre leicht, wenn man nur schlau genug ist, wächst der Erwartungsdruck ins Unermessliche ;-)\n\n
<!--EDIT|Crian|1103129238-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite