Einführung
Arithmetisches Gefängnis ist eine spezielle Einrichtung, die positive ganze Zahlen einkerkert. In letzter Zeit haben die positiven ganzen Zahlen jedoch versucht, zu entkommen. Aus diesem Grund haben die Wächter beschlossen, einige der positiven Ganzzahlen zu eliminieren , um eine Nachricht an die anderen Ganzzahlen zu senden. Sie haben einen Softwareentwickler beauftragt, ein Programm zu schreiben, um herauszufinden, welche ganzen Zahlen für eine maximale Wirkung zu eliminieren sind.
Eingabebeschreibung
Die Eingabe erfolgt über STDIN, Befehlszeilenargumente oder eine Benutzereingabefunktion (z. B. raw_input
). Sie können es nicht als Funktionsargument oder vorinitialisierte Variable haben (z. B. erwartet dieses Programm die Eingabe in eine Variable x
).
Die erste Eingabezeile enthält eine einzelne positive Ganzzahl, n
wobei 8 >= n >= 3
. Daran schließen sich n
Zeilen mit n
Zeichen aus der Menge an [1,2,3,4,5,6,7,8,9]
. Hier ist eine Beispieleingabe:
5
22332
46351
65455
24463
65652
Ausgabebeschreibung
Die Wärter möchten Zahlen streichen, damit die folgenden Bedingungen erfüllt sind:
- In jeder Zeile und Spalte des resultierenden Gitters wird keine Nummer zweimal angezeigt.
- Es dürfen keine zwei eliminierten Zahlen horizontal oder vertikal benachbart sein.
- Die überlebenden Zahlen müssen eine orthogonal zusammenhängende Gruppe bilden - es wird möglich sein, von jeder überlebenden Zahl zu jeder anderen überlebenden Zahl zu gelangen, die sich nur horizontal und vertikal bewegt und niemals eine eliminierte Zahl kreuzt.
Geben Sie die Eingabe aus (minus der ersten Zeile), wobei die eliminierten Zahlen durch ersetzt werden #
.
Es kann mehr als eine Lösung geben. In diesem Fall können Sie eine beliebige Lösung ausgeben.
Möglicherweise gibt es auch keine Lösung. Wenn dies der Fall ist, geben Sie die Zeichenfolge aus no answer
.
Hier ist eine mögliche Ausgabe für die Beispieleingabe:
#2#3#
46351
6#4#5
24#63
#56#2
Beispiel Ein- und Ausgänge
Für jeden Eingang gibt es mehrere Ausgänge. Diese Ausgänge sind also nur Beispiele.
Eingang:
5
46551
51565
32654
14423
43244
Ausgabe:
46#51
#156#
326#4
1#423
#324#
Eingang:
7
7183625
1681563
5238564
8786268
1545382
3814756
5325345
Ausgabe:
71#362#
#6815#3
5238#64
#7#62#8
154#382
3814756
#325#4#
Eingang:
8
21534768
75196287
68392184
96244853
44865912
76516647
89751326
43698979
Ausgabe:
21#34768
#5196287
683#21#4
9#24#853
#4865912
7#51#64#
89751326
436#8#7#
Eingang:
4
2222
2331
3112
1322
Ausgabe:
no answer
prompt
keine mehrzeilige Eingabe zulässt.Antworten:
Ruby,
346344329316 Bytes, slteswDas ist Code-Golf, nicht Code-schnell, also ...
Verwenden Sie es wie folgt:
Das Flag
-W0
ist nicht notwendig, aber ich schlage vor, dass Sie es entweder hinzufügen, um Warnungen zu deaktivieren oder umzuleitenstderr
...Sagen Sie mir, ob Sie genug Geduld hatten, um es an den Beispielen für n = 6,7,8 auszuführen
Änderungsprotokoll
each
⇨map
Dank an @NotThatCharlesregexp
, ähnlich wie bei @NotThatCharles, ob nebeneinander liegende Löschungen und identische Ziffern mit zwei Sekunden angegeben sindquelle
\d
ist kürzer als[^#]
in der vorletzten Zeile;M.times.to_a
ist länger als(0..M-1).to_a
M.times.to_a
aber 1 Byte kürzer als(0..M-1).to_a
;)(0...M).to_a
funktioniert auch und ist gleich lang.Ruby -
541 ...,394Der grundlegende Algorithmus ist eine rekursive Tiefensuche nach Duplikaten, um sie zu bestätigen, indem Sie Zeile 1, dann Spalte 1, dann Zeile 2 usw. durchsehen und überprüfen, ob zwei Nachbarn nicht getötet wurden und das Gitter verbunden ist (das ist die
break if
Klausel in dort und das bisschen, das davor kommt).Einige nette Tricks:
if w[1]
ist viel kürzer alsif !w.one?
und wenn Sie wissen, dass es mindestens ein Mitglied gibt, ist es das gleiche Ergebnis.Ebenso
[0]
ist kürzer alsany?
wenn es keinen Block gibt, unds[j]
ist eine nette Abkürzung fürj<s.size
(technisch ist es eher wiej.abs<s.size
)Und
y%N+(y/N).i
ist viel kürzer alsComplex(y%N,y/N)
Wenn es zwei komplizierte Bedingungen gibt, um Zeichenfolgen zu generieren, kann es auch kürzer sein,
[cond1?str1a:str1b,cond2?str2a:str2b]*''
als alle Parens oder#{}
s in hinzuzufügen .Ungolfing und Erklärung:
(Dies ist aus der 531-Byte-Version. Ich habe Änderungen vorgenommen. Vor allem habe ich seitdem den Aufruf zum Produkt beseitigt - löse jeweils nur eine Ziffer pro Zeile / Spalte, und J ist jetzt nur ein Array, indiziert durch Ganzzahlen Alle Koordinaten sind nur Ganzzahlen.)
H
berechnet NachbarnN
ist die Größe des RastersK
sind die Schlüssel zur Karte (komplexe Zahlen)J
ist die Eingabekarte (Gefängnis)k
sind die nicht getöteten SchlüsselQ
ist die hauptsächliche rekursive MethodeDer Code wird ausgeführt mit:
Änderungsprotokoll
394 haben @ blutoranges Vorschlag unten hinzugefügt und viel mehr Manipulation herausgenommen
408 Ausgabe nochmals überarbeitet. Verwenden Sie auch
.min
statt,.inject(:+)
da ich sowieso nur eine Zeile nehme.417 kürzere Ausgangsberechnung
421 ließen komplexe Zahlen fallen. Verwenden Sie einfach ganze Zahlen. Speichern Sie ein Bundle
450 weitere Eingabeverbesserungen
456 Eingabeverbesserungen
462 inkrementelle Verbesserungen - esp.
find
nichtselect
475 ließ
u
den Row / Col Dupe Builder fallen und zerquetschte ihn503 lösen Sie jeweils nur eine doppelte Ziffer pro Zeile / Spalte.
530 verwenden
map &:pop
stattvalues
531 Ziehe das Lambda heraus, aus dem das Dupes-Array besteht
552 oops! eine Anforderung verpasst
536 geringfügig verbesserte Population von Dupes Array (was früher war
d
)541 initial
quelle
break
die anstelle von verwendet werden könnenreturn
, wird möglicherweise ein weiteres Byte gespeichert. Ich mag diesen, viele Tricks und viel schneller.a
nur einmal verwendet wird, könnte man das machenJ=gets(p).split*''
. Haben Sie CLI-Argumente ausprobiert, siehe meine Antwort?HTML + JavaScript ( ES6 ) 459
Verwenden eines HTML-Textbereichs, um mehrzeilige Eingaben zu erhalten.
Führen Sie zum Testen das Snippet in Firefox aus. Vergrößern Sie den Textbereich, wenn Sie möchten, fügen Sie die Eingabe in den Textbereich ein (Achtung: exakte Eingabe, keine zusätzlichen Leerzeichen in einer Zeile), und klicken Sie auf die Tabulatortaste. Das Ergebnis wird angehängt.
Methode: Ein rekursiver Tiefenserarch. Es findet nicht optimale Lösungen für alle Testfälle in Sekunden (es ist Gode Golf, aber eine gültige Antwort sollte für häufige Testfälle enden)
Erster Versuch
Methode: Ein Depth First Serarch, nicht rekursiv, unter Verwendung eines Benutzerstapels.
Die Funktion könnte leicht in einer Breitensuche umgewandelt werden, chaging
l.pop
zul.shift
, so eine Warteschlange statt einen Stapel verwendet wird , aber es ist zu langsam , und ich bin nicht sicher , kann es eine optimale Lösung trotzdem finden.Code-Snippet anzeigen
quelle