Schrift
[thread]8770[/thread]

Rätsel der Woche 2007/4: viel Spaß beim Rätseln

Leser: 2


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Ishka
 2007-02-20 03:15
#74418 #74418
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Momentan habe ich 11 Aufgaben vorrätig. Vorschläge für neue Rätsel nehme ich immer gerne an (bitte als Mail und als Betreff für Vorschläge rdw-vorschlag enthalten lassen (in klein).
RDW 2007/4 - Raetsel der Woche Nummer 4 des Jahres 2007
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Regeln:
~~~~~~~
       * Bitte nicht vor Ablauf der ersten 72 Stunden (= drei Tage)
         nach Veröffentlichung Hinweise, Spoiler, Lösungen oder
         Lösungsteile posten!

       * Verständnisfragen dürfen selbstverständlich auch vor
         Ablauf der drei Tage in diesem Thread gestellt
         werden. Diskussionen über Lösungsansätze gehören aber
         nicht hierher.

       * Die Verwendung von Modulen ist generell erlaubt, wird jedoch
         das ganze Problem von einem Modul erschlagen, so macht das
         die Lösung langweilig -- und das ist nicht unbedingt der
         Sinn dieser Rätsel.

       * Erst wenn die drei Tage abgelaufen sind, werden Lösungen in
         das Wiki:Wiki gestellt und hier verlinkt.

       * Sobald die Lösungen veröffentlicht wurden darf hier
         natürlich über sie diskutiert werden.

       * Die Lösungen sollten nicht unbedingt von jedem Einzelnen
         gepostet, sondern vor allem per E-Mail an mich geschickt
         werden, damit ich sie testen, "bewerten"  und zusammenfassen
         kann. Die Adrese dafür lautet:

          stephan <---Punkt---> barth <---At---> gmx <---Punkt---> de

         Im Betreff sollte 'RDW' (also wirklich RDW und nicht Rätsel der
         Woche oder andere Ausformulierungen) und die Nummer des Rätsels
         stehen. Hilfreich wäre neben dem Quelltext der Benutzername
         im Forum sowie Perl- und OS-Version (siehe auch perl -v).


Die Aufgabe:
~~~~~~~~~~~~
        Gib zu einer gegebenen Zahl möglichst wenige Quadratzahlen aus,
           deren Summe diese Zahl ergibt.

Beispiel:
~~~~~~~~~
        Beispiel:
           Eingabe:
           7
           Ausgabe:
           4+1+1+1
           Eingabe:
           23
           Ausgabe:
           9+9+4+1
           Eingabe:
           179
           Ausgabe:
           121+49+9
\n\n

<!--EDIT|Ishka|1171934199-->
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
vayu
 2007-02-20 11:14
#74419 #74419
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
soo ... ist bestimmt nicht die beste/richtige, aber es tut.\n\n

<!--EDIT|vayu|1171966881-->
murphy
 2007-02-21 13:58
#74420 #74420
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Gibt es für dieses Problem eigentlich eine "intelligente" mathematische Lösung? Mir ist bislang nur eine Lösung eingefallen, die verschiedene Varianten durchprobiert.
When C++ is your hammer, every problem looks like your thumb.
Taulmarill
 2007-02-21 14:13
#74421 #74421
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Also ich habe eine recht gute Lösung gefunden, die schnell ein gutes Ergebnis ausgibt. Ob das immer das beste ist, ist aber nicht gesichert. Um immer die beste Lösung zu finden fällt mir im Moment auch nur Brute-Force ein.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
esskar
 2007-02-21 14:17
#74422 #74422
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=murphy,21.02.2007, 12:58]Gibt es für dieses Problem eigentlich eine "intelligente" mathematische Lösung? Mir ist bislang nur eine Lösung eingefallen, die verschiedene Varianten durchprobiert.[/quote]
ja, es gibt einige sätze darüber - soweit ich mich da erinnere.
z.b. kann bewiesen werden, dass jede natürliche Zahl als Summe von höchstens X (das X verrate ich jetzt nicht) Quadratzahlen darstellbar ist
und es gibt auch ne mathematische formel, die dir diese quadratzahlen auch berechnen kann!
vayu
 2007-02-21 14:19
#74423 #74423
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
es gibt das sogenannte "YYYYYYY Problem" das sich damit beschäftigt dass eine Zahl mit maximal X Quadraten auszudrücken ist evtl auch weniger.

allerdings war mir das irgendwie ein bisschen zu hoch muss ich gestehen ^^
hab mir die Dokumente zwar mal zu gemüte geführt aber das zu implementieren fehlt mir echt die Zeit.

ich habs per "Brute Force" realisiert. Allerdings auch nur 2 verschiedene Ansätze hergenommen.

edit: hab die Namen und die anzahl quadrate mal entfernt, durch esskars post angeregt :P\n\n

<!--EDIT|vayu|1172060511-->
murphy
 2007-02-22 20:26
#74424 #74424
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Hmm, ich bin ja kein Experte in Zahlentheorie, aber alles was mir bisher eingefallen ist, um eine Zahl additiv in Quadrate zu zerlegen, braucht entweder eine volle Primfaktorisierung der Zahl, ist ein Brute-Force-Ansatz oder liefert nicht garantiert die minimale Anzahl von Summanden.

Nun ist zwar die Lösung über eine Faktorisierung theoretisch sehr befriedigend, aber irgendwie nicht viel schneller als eine schlaue Brute-Force-Methode -- hat hier irgendwer schon eine perfekte Lösung, die schnell und garantiert minimal ist?
When C++ is your hammer, every problem looks like your thumb.
topeg
 2007-02-22 22:03
#74425 #74425
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Die eigendliche Berechnung machen weniger als 15 Zeilen. Alles weitere ist nur Ästetik. :-)
Ishka
 2007-02-27 05:36
#74426 #74426
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wie üblich habe ich die abgegebenen Lösungen ins Wiki:Wiki gestellt.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
docsnyder
 2007-02-27 10:33
#74427 #74427
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oops!

Habe mit Entsetzen festgestellt, dass meine Lösung für einige Eingaben kein Ergebnis liefert und möchte hier die Korrektur nachschieben:
Code: (dl )
map { print if ( $sums{$_}++ == 1 ) } @{$res[$min]};

ersetzen durch:
Code: (dl )
map { print if ( ! $sums{$_}++ ) } @{$res[$min]};


Gruss, Doc
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-02-20 03:15.