Erstellen Sie einen bidirektionalen Gematria-Rechner für eine bestimmte Folge von Unicode-Zeichen als Alphabet.
Gematri-was?
Gematria ist ein System zur Zuweisung numerischer Werte zu Symbolen, das von alten Griechen entwickelt und von alten Juden übernommen wurde. Es ist ähnlich wie ASCII oder Unicode, es ist nur nicht linear ... Siehe folgende Tabelle (die vollständige Tabelle finden Sie unter dem obigen Link):
Index Letter Letter name Value
--------------------------
0 א "Alef" 1
1 ב "Bet" 2
...
8 ט "Tet" 9
9 י "Yud" 10
10 כ "Kaf" 20
...
17 צ "Tsady" 90
18 ' "Kuf" 100
19 ר "Resh" 200
...
Die Namen der Buchstaben sind nicht wichtig, nur ihr Index im "Array" des Alphabets und der jeweilige numerische Wert. Das hebräische Alphabet hat nur 22 Buchstaben (ohne "letzte" Buchstaben), daher beträgt der maximal verfügbare Wert 400.
Wenn wir dieses System dem englischen Alphabet (AZ) ausleihen, erhalten wir A = 1, B = 2 ... L = 30 ... U = 300 ... Z = 800.
Zwei Dinge müssen wir wissen.
Eines der wichtigsten Merkmale dieses Systems ist die Berechnung des "Gematria-Werts" eines Wortes durch Aufsummieren der Buchstabenwerte. (Einige sagen, dass es eine mystische Verbindung zwischen Wörtern oder Phrasen gibt (wenn der Wert des Raums Null ist) - die denselben Gematria-Wert haben).
Jede nicht negative Ganzzahl kann in Symbolen dargestellt werden. Zum Beispiel (und bleiben wir vorerst beim englischen Alphabet) ist der Wert von 32 LB (L = 30 + B = 2). Der Wert von 1024 ist ZTKD (800 + 200 + 20 + 4. Beachten Sie, dass ZSSKD ebenfalls 1024 ist, dies ist jedoch keine rechtliche Darstellung, da es komprimiert werden kann).
Die Herausforderung
Schreiben Sie ein Programm / eine Funktion / ein Code-Snippet in der Sprache Ihrer Wahl, das zuerst mit einem Alphabet eingerichtet wird (siehe API unten), und akzeptieren Sie dann ein Argument. Dieses Argument kann eine Ganzzahl oder ein Wort / eine Phrase sein. Wenn es sich um eine Ganzzahl handelt, sollte Ihr Programm seine Darstellung in den Alphabetsymbolen ausgeben / zurückgeben - die am stärksten komprimierte (siehe (2) oben). Wenn es sich um ein Wort oder eine Phrase handelt, sollte Ihr Programm den Gematria-Wert ausgeben / zurückgeben (indem Sie die Werte der Symbole summieren, ohne Leerzeichen zu zählen, siehe (1) oben).
API
Ihr Programm / Ihre Funktion sollte 3 Argumente akzeptieren. Sie können sie von STDIN abrufen oder als Funktionsargumente sogar davon ausgehen, dass es sich um Variablen handelt, die vor Ihrem Funktionsaufruf programmgesteuert initialisiert wurden.
- Erstes Argument - das erste Zeichen (in Unicode) des Alphabets.
- Zweites Argument - das letzte Zeichen (in Unicode) des Alphabets.
- Drittes Argument - Eine Ganzzahl, die in Symbolen dargestellt werden soll, ODER eine Phrase, die durch das angegebene Alphabet erstellt wird.
Ausgabe- / Rückgabewert: Abhängig vom dritten Argument, wie oben erläutert.
Annahmen
- Die ersten beiden Argumente sind immer jeweils ein Zeichen lang, und das zweite ist immer größer als das erste.
- Die Sequenz (erste bis letzte, einschließlich) enthält niemals einen der Werte 30-39 (die die Ziffern 0-9 darstellen), andernfalls wird das dritte Argument mehrdeutig. BEARBEITEN: Es enthält auch kein Leerzeichen, da Leerzeichen in Phrasen als Nullen gezählt werden.
- Das dritte Argument, falls es sich um eine Phrase handelt, darf nur Leerzeichen und Buchstaben des angegebenen Alphabets enthalten. Eine leere Zeichenfolge ist keine gültige Eingabe (Sie können davon ausgehen, dass sie nicht leer ist). Wenn es sich um eine Ganzzahl handelt, können Sie davon ausgehen, dass es sich um eine positive Ganzzahl handelt.
Beispiele
Input Output
A Z CODE GOLF 175
a s 512 sssssjb
A B 7 BBBA
≐ ⊐ ≤≫ ≥ 1700
Wertung
Score = upvotes - length/100.0
Ihr Code sollte kurz, aber vor allem beliebt sein. Negative Ergebnisse können ebenfalls mitspielen. Der Gewinner ist die Antwort mit der höchsten Punktzahl in einer Woche, 29.11.2014 19:20:00 UTC.
Antworten:
CJam,
807570 Bytes, Upvotes - 0,7Testen Sie es hier.
Dies ist ein vollständiges Programm, das Eingaben von STDIN entgegennimmt und das Ergebnis an STDOUT druckt.
Ich bin mir nicht sicher, wie ich hier auf Popularität schießen soll, also spiele ich einfach Golf und hoffe, stattdessen eine einigermaßen beeindruckende Codegröße zu erhalten. ;)
Ich glaube, dass die Int-zu-String-Konvertierung noch verbessert werden kann, aber ich sehe es momentan nicht.
Vielen Dank an Optimizer, der mich an die festgelegte Schnittmenge erinnert hat und dass leere Arrays falsch sind.
Im zweiten Fall verbleibt das Ergebnis auf dem Stapel, der am Ende des Programms automatisch gedruckt wird.
quelle
Java 7, Score = Upvotes - 3.97
Yay!!! Java!!! Die weltweit beliebteste Golfsprache. Was, du kannst tatsächlich in Java Golf spielen ??? Nun, es ist so, als würde man einen Bulldozer zum Putten verwenden.
a
wird voraussichtlich das erste Zeichen enthalten.b
wird voraussichtlich das letzte Zeichen enthalten.c
wird voraussichtlich die Eingabezeichenfolge haben.Hier ist die Funktion Golf:
Hier wird es mit Strukturcode eingerückt:
Hier ist es komplett erweitert:
quelle
APL (positive Stimmen - 1,05)
Dies ist eine Funktion, die die beiden Zeichen links und das zu konvertierende Argument rechts verwendet:
Ungolfed Version:
quelle
Haskell, 188 Bytes; Upvotes - 1.88
Dies ist ein ausgewachsenes STDIN-to-STDOUT-Programm, das stark im Golfsport spielt. EDIT: Jetzt in weniger als 200 Bytes! EDIT2: Ein Byte mit @ stolzhaskellers Vorschlag gespeichert.
Es erstellt die unendliche Liste von Werten
x = [1,2,3,4,5,6,7,8,9,10,20,30,..]
in der ersten Zeile und führt E / A in der dritten Zeile aus. Der Wert eines Buchstabensc
ist angesichts des Bereichs[a..b]
der Wert an der Positionlength [a..c] - 1
vonx
. In der zweiten Zeile verzweigen wir in den ersten Buchstabenu
des dritten Arguments und summieren entweder seine Gematria-Werte (wennu
es sich nicht um eine Ziffer handelt) oder konstruieren gierig ein Wort mit dem angegebenen Wert (wennu
es sich um eine Ziffer handelt).Ungolfed Version mit besser lesbaren Variablennamen:
quelle
{}
aus der where-Klausel für einen Ein-Byte-Gewinn entfernenCJam, 70 Bytes, #Upvotes - 0.7
Dies setzt voraus, dass eine gültige Eingabe übergeben wird. Übernimmt Eingaben von STDIN wie in der API-Spezifikation angegeben und druckt das Ergebnis an STDOUT.
Beispiele:
Probieren Sie es hier online aus
Blockweise Erklärung :
quelle