Mein Freund und ich haben dieses Spiel, das wir mit Worten spielen. Es ist ein lustiger Zeitvertreib, bei dem Buchstaben in einem Wort "gelöscht" werden, bis nichts mehr übrig ist. Ich bin es wirklich leid, dass er so viel schneller ist als ich, also ist es deine Aufgabe, es umzusetzen und mich ihn endlich schlagen zu lassen. Da ich das Programm so einfach wie möglich ausblenden muss, muss es natürlich so klein wie möglich sein.
Wie funktioniert dieses Spiel?
Das Spiel ist ein ziemlich einfacher Algorithmus. Es reduziert eine alphabetische Zeichenfolge, bis sie nicht mehr weiter reduziert werden kann, wodurch es zu einer Art Hash wird. Das eigentliche Spiel, das wir Menschen machen, ist sehr schwer zu implementieren, aber es kann in den folgenden Algorithmus vereinfacht werden:
Sie beginnen damit, das Alphabet in zwei Hälften zu falten und die beiden Teile wie folgt auszurichten:
a b c d e f g h i j k l m
z y x w v u t s r p q o n
Ausgehend von der Mitte weisen Sie dann der oberen Hälfte die positiven Ganzzahlen und der unteren die negativen Ganzzahlen zu:
a b c d e f g h i j k l m
13 12 11 10 9 8 7 6 5 4 3 2 1
z y x w v u t s r p q o n
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Dann nehmen Sie Ihre Zeichenfolge (wir werden sie verwenden hello world
) und ignorieren alle nicht alphabetischen Zeichen. Übersetzen Sie sie:
h e l l o w o r l d
6 9 2 2 -2 -10 -2 -5 2 10
Dann summieren Sie die Buchstabenwerte. Diejenigen, die im vorherigen Diagramm aufgereiht sind (z. B. d
und w
, l
und o
), werden aufgehoben, während sich die anderen summieren.
sum(6 9 2 2 -2 -10 -2 -5 2 10 )=12
12 ist die Zahl für b
, so dass der Hash hello world
ISTb
Für ein Wort, das vollständig gelöscht wird (z. B. love
), geben Sie das "0-Zeichen" aus : -
. Beachten Sie, dass in der Eingabe -
weiterhin ignoriert wird. Es ist nur in der Ausgabe wichtig.
Wenn der Betrag der Zahl größer als 13 ist, dann beginnen zu verdoppeln Sie auf den nach oben a
ist und die z
's nehmen Sie grundsätzlich so viele a
‚s oder z
‘ s fit in die Zahl und nehmen , was wie so in den letzten Brief gelassen wird:
code golf: 43.
Passend für 3 a
und hat 4 übrig:
aaa 4: j
result: aaaj
Hinweis: Dieser Teil ist im Grunde genommen divmod
außer, dass er gegen Null rundet, nicht -infinity
(z. B. -43 würde zu 3 z
und und a, -4
was p
so ist zzzp
).
Hinweis: Der Bindestrich kommt nicht, wenn das a
oder z
die perfekt passen, nur wenn es genau ist 0
.
Erläuterungen:
- Der Hash ist Groß- und Kleinschreibung
- Standardlücken sind nicht erlaubt
- E / A kann in jedem Format vorliegen, das nicht zu ausgefallen, stdin, stdout, Befehlszeilenargument, Funktion usw. ist.
- Dies ist Code-Golf, so dass die kürzeste Größe in Bytes gewinnt.
Beispiele:
hello world --> b
love --> -
this is an example --> aak
hello *&*(&(*&%& world --> b
good bye --> ae
root users --> zzs
love
ist leer ...Antworten:
CJam, 46 Bytes
Probieren Sie es online aus oder testen Sie die Testsuite online .
Erläuterung
Der Algorithmus funktioniert wie erwartet: Lesen Sie die Eingabe, konvertieren Sie sie in Kleinbuchstaben, ordnen Sie jedes Zeichen einem Wert zu, summieren Sie die Werte und drucken Sie Zeichen und passen Sie die Summe entsprechend an, bis die Summe Null ist. Die wahrscheinlich interessanteste Optimierung (obwohl nur zwei Bytes eingespart werden) besteht darin, dass stattdessen negierte Zeichenzuordnungen verwendet werden, da dies das Austauschen von Subtraktionsargumenten zur Korrektur des Vorzeichens bei der Berechnung des zugeordneten Werts und das erneute Auswechseln beim erneuten Zuordnen zu einem Buchstaben aufgrund des Subtraktion eines negierten Wertes, der durch Addition ersetzt werden kann.
quelle
Pyth,
797877656158quelle
@Jz
anstelle vonf}YJz
Es gibt wahrscheinlich mehr, aber ich muss jetzt schlafen. Viel Glück;)@
!Clip 10 , 87
quelle
R, 258 Bytes
Dies muss der gröbste R-Code aller Zeiten sein. Ich dachte, R könnte eine anständige Wahl sein, da es einen Vektor aller Buchstaben "a" bis "z" als eingebaute globale Variable hat. Aber es stellt sich heraus, dass der Rest ein Chaos ist.
Ungolfed + Erklärung:
Dadurch wird ein unbenanntes Funktionsobjekt erstellt, das eine Zeichenfolge als Eingabe akzeptiert und den zugehörigen Hashwert zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=function(s){...}
.Beispiele:
Probieren Sie es online aus!
Fragen? Ich werde gerne weitere Erklärungen abgeben. Vorschläge? Vorschläge sind mehr als willkommen!
quelle
Haskell, 171 Bytes
Testlauf:
So funktioniert es:
l
ist eine Nachschlagetabelle von Buchstaben zum entsprechenden Wert. Suchen Sie alle Zeichen in der Eingabezeichenfolge und verwerfen Sie die nicht gefundenen. Summiere die resultierende Liste. Abhängig von der Summep
druckt-
oder vielleicht zuerst einigea
s oderz
s und schließlich (umgekehrt) den Brief vonl
.quelle
R - 200
quelle