Momentan habe ich 14 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/7 - Raetsel der Woche Nummer 7 des Jahres 2007
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Regeln:
~~~~~~~
* Bitte nicht vor Ablauf der ersten sieben Tage nach Veröffentlichung
Hinweise, Spoiler, Lösungen oder Lösungsteile posten!
* Verständnisfragen dürfen selbstverständlich auch vor Ablauf der
sieben 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 sieben Tage abgelaufen sind, werden Lösungen in
das Wiki gestellt und hier verlinkt.
* Sobald die Lösungen veröffentlicht wurden darf hier
natürlich über sie diskutiert werden.
* Sofern das Programm Parameter bekommt, diese bitte vollständig,
sofern nicht explizit anders gefordert, mittels @ARGV auslesen, damit
die Lösungen besser (und vor allem einfacher) vergleichbar sind.
* Die Lösungen sollten nicht von jedem Einzelnen gepostet, sondern
per E-Mail an mich geschickt werden, damit ich sie testen,
"bewerten" und zusammenfassen kann. Die Adresse dafür lautet:
ishka <---Minus---> rdw <---At---> kettenbruch <---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:
~~~~~~~~~~~~
Schreibe ein Programm, das ein gegebenes, unvollständig
gelöstest, Sudoku-Rätsel vollständig löst, sofern das möglich ist
und mit einer passenden Warnung abbricht, wenn in der Angabe
Widersprüche sind. Das zu lösende Sudokurätsel wird dem
Program als erster Parameter übergeben, als fortlaufender
String von 81 Zeichen, wobei noch nicht belegte Felder durch
einen Punkt dargestellt werden. Die 81 Zeichen sind so zu
verstehen, daß das Sudoku-Quadrat damit Zeilenweise aufgefüllt wird.
Sudoku-Regeln:
Sudoku spielt auf einem 9x9-Feld.
Ein vollständig gelöstes Sudoku-Feld hat in jeder Zeile und jeder
Spalte jede Ziffer von 1 bis 9 genau einmal. Ferner sind in jedem
der 9 nicht-überlappenden Teilblöcken von je 3x3 Kästchen
Größe nochmal jede Ziffer einmal vorhanden.
In einem ungelösten Sudoku-Rätsel sind noch nicht alle Ziffern
eingetragen.
Ziel ist es, alle Ziffern einzutragen, so daß nach den oben
genannten Regeln keine Widersprüche entstehen.
Beispiel:
folgender String
123456789234567891345678912...........
...........................................
stellt folgendes Quadrat dar:
123456789
234567891
345678912
.........
.........
.........
.........
.........
.........
@ARGV=('1.3..6.89456.89123.891.3456231645.785649.831289.3
126.5312.648976458..2319782.1564' ) ;
Ausgabe:
123456789
456789123
789123456
231645978
564978312
897312645
312564897
645897231
978231564\n\n
<!--EDIT|Ishka|1174440814-->
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}