PROBLEM
Finde mit zwei Worten den Gewinner in einem digitalen Wurzelkampf .
Definieren Sie die digitale Wurzel eines Wortes folgendermaßen:
- Jedem Buchstaben des Alphabets ist eine Zahl zugeordnet: A = 1, B = 2, C = 3, ..., Z = 26
- Addieren Sie die Werte für jeden Buchstaben, um das Wort zu addieren. Nehmen wir zum Beispiel "CAT". C + A + T = 3 + 1 + 20 = 24
- Addieren Sie alle einzelnen Ziffern, aus denen das Ergebnis besteht: 24 => 2 + 4 = 6
- Wiederholen Sie Schritt 3, bis Sie eine einzelne Ziffer erreicht haben. Diese einzelne Ziffer ist die digitale Wurzel des Wortes.
Regeln:
- Ein Gewinner wird erklärt, wenn seine digitale Wurzel größer als die andere ist.
- Wenn die digitalen Stammwerte gleich sind, kürzen Sie die Wörter, indem Sie jede Instanz des Buchstabens mit dem höchsten Wert aus beiden Wörtern entfernen und neu berechnen.
- Wiederholen Sie die Schritte 1 und 2, bis ein Gewinner gefunden wurde oder eines der Wörter nur noch einen Buchstaben (oder keine Buchstaben) enthält.
- Wenn die digitalen Wurzelwerte nach Durchlaufen des Verkürzungsprozesses gleich sind, wird das längere Wort zum Gewinner erklärt.
- Wenn die Wörter gleich lang sind und nach der Verkürzung kein Gewinner gefunden wird, wird kein Gewinner ermittelt.
Besondere Regeln:
- Bei der Berechnung der digitalen Wurzel selbst ist die Verwendung des Moduls nicht zulässig . Es kann überall verwendet werden.
- Angenommen, Wörter bestehen nur aus Großbuchstaben - keine Interpunktion, keine Leerzeichen usw.
EINGANG
Ziehen Sie die Wörter durch stdin (durch Kommas getrennt). Methodenparameter, oder wie Sie wollen. Stellen Sie in Ihrer Lösung oder im Code klar, wie die Wörter analysiert oder vorbereitet werden.
AUSGABE
Zeigen Sie das gewinnende Wort an. Wenn es keinen Gewinner gibt, zeige "STALEMATE" an.
Beispiele:
Eingabe: CAN, BAT
CAN = 18 = 9
BAT = 23 = 5
Ausgang: CAN
Eingabe: ZOO, NO
ZOO = 56 = 11 = 2
NO = 29 = 11 = 2
OO = 30 = 3
N = 14 = 5
Ausgang: NEIN
UPDATE : Die Eingabe muss mit stdin mit den Wörtern als durch Kommas getrennte Zeichenfolge gelesen werden.
UPDATE : Einige Beispiele zum Testen hinzugefügt.
UPDATE : Das Entfernen des höchstwertigen Buchstabens im Falle eines Unentschieden wurde geklärt - dies ändert auch die Stoppbedingung geringfügig - Wenn ein Wort einen Buchstaben oder null Buchstaben lang ist, wird der Kürzungsvorgang gestoppt
quelle
Antworten:
J 100
läuft so:
Eingaben werden noch nicht genau wie gewünscht akzeptiert.
quelle
APL (Dyalog) (
9186)Erklärung (in der Reihenfolge der Ausführung):
⎕ML←3
: setze ML auf 3 (dies macht⊂
unter anderem die mittlere Partition aus).G←Z⊂⍨','≠Z←⍞
: Eingabe lesen, durch Komma trennen, in G speichern und an die Funktion übergeben.+/¨⎕A∘⍳¨⍵
: Berechnen Sie die Punktzahl für jedes Wort. (⎕A
ist eine Liste mit dem Alphabet.)Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨
: Berechne die digitale Wurzel für jede Punktzahl (indem du alle Ziffern summierst, solange es noch mehr als eine Ziffer gibt) und speichere sie in Z.Z≡∪Z
: Wenn alle Punkte eindeutig sind ...:G[↑⍒Z]
: ... dann das Wort mit der höchsten Punktzahl (aus der ursprünglichen Liste) ausgeben.⋄1∊↑¨⍴¨⍵:'STALEMATE'
: andernfalls (wenn es einen Gleichstand gibt), wenn eines der Wörter die Länge 1 hat, wird STALEMATE ausgegeben.⋄∇1∘↓¨⍵
: Ansonsten entfernen Sie den ersten Buchstaben von jedem Wort und führen Sie die Funktion erneut aus.quelle
Rubin - 210
Tests:
quelle
d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}
."If the words are of equal length and no winner is found after going through the shortening process, no winner is declared."
Haskell, 205 Zeichen
Probeläufe:
w
, importiertes älteres, kürzeres Modulquelle
',':b
→_:b
(-2), wenn Sie nicht zu sehr mit der Mehrzeilenverarbeitung verbunden sindinteract$unlines.map([...]).lines
→putStr.[...]=<<getLine
(-11), wenn Sie sich erlauben, die Ausgabe zu lockernputStr
→print
(-1). Ich hasse diese Negationsoperation, die so viele Zeichen benötigt, aber ich kann keinen Weg finden, sie zu umgehen.Perl, 224,
225,229Grundlegendes Golfen (noch nichts Schlaues):
Perl 5.10 und höher kann mit
perl -M5.010 <file>
oder ausgeführt werdenperl -E '<code here>'
quelle
K 106
Verwendet die Ausnahmebehandlung, um Stapelfehler abzufangen, die zu einer Pattsituation führen.
quelle
VBA (
242462)Es stellte sich heraus, dass der folgende Code nicht mit der Spezifikation übereinstimmte, sodass ich überarbeiten und viel Länge hinzufügen musste (siehe oben). : - / Das kann vielleicht weiter gespielt werden, aber es ist schon ziemlich kompakt und ich bezweifle, dass ich es wieder auf ein konkurrenzfähiges Ergebnis bringen kann.
Das Original (siehe unten) hat den Buchstaben mit dem höchsten Wert nicht aus den Wörtern entfernt, als es einen Gleichstand gab.
quelle
Das hat mir wirklich Spaß gemacht und ist mein erster Beitrag. Obwohl es alt ist, ist mir aufgefallen, dass niemand eine PHP-Version erstellt hat.
534 Zeichen.
Jetzt bin ich mir nicht sicher, nach welchen Regeln ich anfangen soll, also habe ich mit $ f = 'CAN, CBN' als Eingabe begonnen. Ich hoffe das war richtig. Ich habe alle Tests bestanden, obwohl es nicht besonders elegant ist. Ich muss jetzt wirklich ein bisschen schlafen, aber es hat mir großen Spaß gemacht, das herauszufinden - danke für ein tolles Puzzle.
Codiert auf http://codepad.org/ZSDuCdin
quelle
$f=trim(fgets(fopen('php://stdin')));
für die Aufnahme der Eingabe verwenden.$w=fgetcsv(STDIN);
funktioniert besser.D: 326 Zeichen
Mehr leserlich:
quelle
Mathematica
Einige Details fehlen noch
quelle
Mathematica
220207Nachdem ich dies geschrieben hatte, bemerkte ich, dass dies der gleichen Argumentation folgt, die Belisarius benutzte:
Verwendung
Da die Antwort nicht wettbewerbsfähig ist (weil sie so langwierig ist), habe ich mich für ein Eingabeformat entschieden, das für Mathematica besser geeignet ist.
quelle
CoffeeScript - 335
Nicht so glücklich mit diesem wie ich gewesen sein könnte, aber ich werde es trotzdem aufstellen. Die tatsächliche Bewertung ist sehr präzise (
y
Funktion), aber dieif
s zum Vergleichen der Ergebnisse (inz
) werden ziemlich lang.Um es zu benutzen, rufe
z
mit deinen zwei Wörtern an (zBz 'FOO','BAR'
). Es werden beide Wörter gewertet und das Wort mit der höheren Punktzahl zurückgegeben. Wenn es ein Unentschieden ist, wird es mit den geänderten Wörtern wiederkehren (die Originale behalten, um schließlich zurückzukehren, daher die zusätzlichen zwei Parameter), die es von dem erhältx
Funktion .Das entsprechende (erweiterte) Javascript für Interessenten:
quelle
Schläger 479 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
PHP,
339(nicht spezifizierbar),410382359339337 BytesEDIT 1 : +71 Bytes. Verwenden Sie
STDIN
anstelle vonfopen('php://stdin','r');
und kurze Tags. Auch volle Übereinstimmung mit der Spezifikation.EDIT 2 : -28 Bytes. Verwenden Sie
fgetcsv(STDIN)
anstelle vonexplode(',',trim(fgets(STDIN)))
, und verwenden Siefor
Schleife anstelle vonwhile
Schleife.EDIT 3 : -23 Bytes. Zusammengeführte Funktionen
a
undb
für Schleifen zusammengeführt.EDIT 4 : -20 Bytes. Verwandelte sich
c
von einer rekursiven in eine Schleife. Entfernen Sie dann die Funktionc
und fügen Sie ihren Code in den globalen Namespace ein.EDIT 5 : -2 Bytes. Danke an @Titus für die
-r
Flagge.quelle
-r
FlaggeJAVA
quelle
C ++, 473 (Ich leihe mir ein Eisen aus)
Ich bin sicher, ich könnte es irgendwie verkürzen, aber ich bin müde.
Bearbeiten: ursprünglich verwendetes Befehlszeilenargument, geändert zur Verwendung von cin. Es ist wahrscheinlich ein paar Zeichen länger, aber ich bin zu müde, um es zu erzählen.
quelle
Python: 383 Zeichen
führe die Funktion aus
c('CAN','BAT')
:quelle
F #,
559533530 BytesNoch nicht konkurrenzfähig. Ich bin sicher, c kann ebenso wie die letzten paar Zeilen kürzer gemacht werden. Hier tut es auch weh, keinen einfacheren Zugriff auf Befehlszeilenargumente zu haben.
Probieren Sie es online!
Ungolfed-Version
quelle
PHP,
296 281267 BytesLaufen Sie mit
-n
oder versuchen Sie es online (TiO enthält eine Aufschlüsselung).Im Februar 2011 war die aktuelle PHP-Version 5.3.5; also konnte ich nicht
[$a,$b]=fgetcsv(...)
und so)count_chars
Inlinesubstr
Aber keiner hätte viel gespart; es macht also nicht viel aus.
Die teuersten Dinge waren (natürlich) die Schleifen und Regel Nr. 4 (
40 -36 Bytes).quelle