Unter der Annahme, dass A = 1, B = 2 ... Z = 26 und der Wert eines Wortes die Summe dieser Buchstabenwerte ist, ist es möglich, einige Wörter in zwei Teile zu teilen, so dass sie gleiche Werte haben.
Zum Beispiel kann "wordsplit" wie folgt in zwei Teile zerlegt werden: ordsl wpit, weil o + r + d + s + l = w + p + i + t.
Dies war eine Herausforderung, die uns mein Computerlehrer gegeben hat - es ist anscheinend eine alte Herausforderung der Lionhead Studios. Ich habe es in Python gelöst und werde meine Antwort in Kürze veröffentlichen.
Herausforderung: Das kürzeste Programm, das alle möglichen Teilungen mit gleichen Punktzahlen auflisten kann. Beachten Sie, dass für jede Buchstabengruppe nur einer aufgelistet werden muss - ordsl wpit ist beispielsweise dasselbe wie rdosl wtip. Es ist einfacher, sie in der Reihenfolge aufzulisten, in der sie im Wort kommen.
Bonus:
- Wenn Sie Paare markieren, bei denen beide Wörter gültige englische Wörter sind (oder eine Permutation der Buchstaben ist), verwenden Sie eine Wortliste. (Dies kann durch Platzieren eines Sternchens neben jeder oder einer anderen Methode erfolgen, aber machen Sie es deutlich.)
- Hinzufügen der Option zum Entfernen von Duplikaten (dies sollte nicht die Standardeinstellung sein.)
- Unterstützung von mehr als zwei Teilungen, z. B. drei, vier oder sogar n-Wege-Teilungen.
Antworten:
Perl, 115
118123Laufen Sie mit
perl -nE '<code goes here>'
. Dieses 'n' wird in der Codegröße gezählt.Respaced:
Mit Kommentaren und Variablennamen:
Einige der verwendeten Tricks:
1..1<<@_
deckt den gleichen Bitbereich ab wie0..(1<<@_)-1
, ist jedoch kürzer. (Beachten Sie, dass die Betrachtung des Problems aus größerer Entfernung, einschließlich der mehrfachen Bereichsgrenzen, ohnehin nicht zu einer falschen Ausgabe führen würde.)64-ord$_[$_]
statt Addierenord$_[$_]-64
gewinnt ein unsichtbares Zeichen: Da es mit einem Trennzeichen endet, wird das Leerzeichen davor gesetztfor
unnötig.cond ? var1 : var2 = new_value
.&&
und||
werden anstelle von richtigen conditionals verwendet.$l-$r
ist kürzer als$l!=$r
quelle
J (109)
Ausgabe für
wordsplit
:Erläuterung:
1!:1[1
: lese eine Zeile von stdin([{~(i.@!A.i.)@#)
: Holen Sie sich alle Permutationen"1
: für jede Permutation:(96-~a.&i.)
: Buchstabenwerte erhalten}.@(split~&.>i.@#@>)@<
: Teilen Sie jede Permutation der Partituren an jedem möglichen Platz auf, außer vor der ersten und nach der letzten Zahl>(>@(=/@:(+/"1&>)&.>)#[)
: Sehen Sie, welche Permutationen übereinstimmende Hälften haben, und wählen Sie diese aus{&a.@(96&+)&.>
: Verwandle die Partituren wieder in Buchstaben~.(/:{[)
: Entfernen Sie triviale Variationen (zBordsl wpit
undordsl wpti
)quelle
{a,bc}
bereits gefunden wurden, entfernen,{a,cb}
aber nicht entfernen{bc,a}
. (Und natürlich bin ich nicht beleidigt, wenn ich tatsächlich jemandes Antwort / hatte / duplizierte, würde ich es vorziehen, wenn jemand darauf hinwies.)c99 - 379 notwendige Zeichen
Der Ansatz ist ziemlich offensichtlich. Es gibt eine Funktion, die ein Wort nach einer Maske summiert und eine, die es auch nach einer Maske druckt. Eingabe von der Standardeingabe. Eine Kuriosität ist, dass die Druckroutine Leerzeichen für Buchstaben einfügt, die nicht in der Maske enthalten sind. Eine Registerkarte wird verwendet, um die Gruppen zu trennen.
Ich mache keinen der Bonusgegenstände und kann auch nicht einfach konvertiert werden, um sie zu unterstützen.
Lesbar und kommentiert:
Validierung
quelle
Rubin: 125 Zeichen
Probelauf:
quelle
Mathematica
123111Findet alle Teilmengen von Wörtern, die 1/2 der "ascii total" des Wortes haben
d
. Findet dann die Ergänzungen dieser Teilmengen.d = "WORDSPLIT"
quelle
J, 66 Zeichen
Verwenden Sie Ziffern von base2-Zahlen, um jede mögliche Teilmenge auszuwählen.
quelle
Meine Lösung ist unten. Es ist ein fast Anti-Golf in seiner Größe, aber es funktioniert sehr gut. Es unterstützt n-Wege-Teilungen (obwohl die Rechenzeit für mehr als 3 Teilungen sehr lang wird) und das Entfernen von Duplikaten.
Beispielausgabe:
quelle
Lua - 195
Die Eingabe muss in Großbuchstaben erfolgen:
quelle
Python - 127
und hier eine n-split Version mit 182 Bytes ohne Duplikate:
Eingabe ist zB:
quelle