Geben Sie bei einer Eingabezeichenfolge, die nur aus Buchstaben besteht, die Schrittgröße zurück, die die Mindestanzahl von Schritten ergibt, die erforderlich sind, um alle Buchstaben in der angegebenen Reihenfolge über ein umschließendes Alphabet zu lesen, beginnend bei einem beliebigen Buchstaben.
Nehmen Sie zum Beispiel das Wort dog
. Wenn wir eine Schrittgröße von 1 verwenden, erhalten wir:
defghijklmnopqrstuvwxyzabcdefg Alphabet
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
defghijklmnopqrstuvwxyzabcdefg Visited letters
d o g Needed letters
Für insgesamt 30 Schritte.
Wenn wir jedoch eine Schrittgröße von 11 verwenden, erhalten wir:
defghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg
^ ^ ^ ^ ^ ^
d o z k v g Visited letters
d o g Needed letters
Für insgesamt 6 Schritte. Dies ist die minimale Anzahl von Schritten, daher ist das Rückgabeergebnis für dog
die Schrittgröße; 11
.
Testfälle:
"dog" -> 11
"age" -> 6
"apple" -> 19
"alphabet" -> 9
"aaaaaaa" -> 0 for 0 indexed, 26 for 1 indexed
"abcdefga" -> 1 or 9
"aba" -> Any odd number except for 13
"ppcg" -> 15
"codegolf" -> 15
"testcase" -> 9
"z" -> Any number
"joking" -> 19
Regeln
- Die Eingabe ist eine nicht leere Zeichenfolge oder ein Array von Zeichen, die nur aus den Buchstaben
a
bis bestehenz
(Sie können zwischen Groß- und Kleinschreibung wählen). - Die Ausgabe kann 0-indiziert (dh der Bereich
0-25
) oder 1-indiziert (1-26
) sein. - Wenn es einen Gleichstand gibt, können Sie eine beliebige Schrittgröße oder alle davon ausgeben
- Das ist Code-Golf , also gewinnt die niedrigste Anzahl von Bytes für jede Sprache!
Antworten:
Kohle , 41 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. 0-indiziert. Erläuterung:
Überfliege die 26 Stufengrößen. (Eigentlich schleife ich hier über das Kleinbuchstaben und verwende die Indexvariable.)
Durchlaufen Sie jedes Zeichen der Eingabe nach dem ersten.
Schleifen Sie 26-mal und generieren Sie die Zeichenfolge, indem Sie 26 Schritte bei der angegebenen Schrittgröße ausführen, beginnend mit dem vorherigen Zeichen der Eingabe (0-indiziert).
Suchen Sie die Position des aktuellen Zeichens der Eingabe in dieser Zeichenfolge oder -1, falls nicht gefunden.
Nimm die Summe aller Positionen, es sei denn, eine wurde nicht gefunden. In diesem Fall verwende -1.
Speichern Sie die Summen.
Finden Sie die minimale nicht negative Summe.
Finden Sie die erste Schrittweite mit dieser Summe und geben Sie sie aus.
quelle
JavaScript, 143 Bytes
Probieren Sie es online!
Dank Shaggy werden
[...Array(26).keys()]
9 Bytes eingespart.quelle
Jelly ,
282623 BytesDer Ausgang ist 0-indiziert. Die Eingabe ist ein Bytestring und kann in jedem Fall erfolgen, jedoch in Großbuchstaben viel schneller.
Die Eingabe eines einzelnen Buchstabens muss in einem speziellen Gehäuse erfolgen und kostet 2 Byte. ._.
Probieren Sie es online!
Beachten Sie, dass dies ein Brute-Force-Ansatz ist. Bei Eingaben mit vier oder mehr Buchstaben tritt bei TIO eine Zeitüberschreitung auf. Die Testsuite wird vorangestellt
_39
für "Effizienz".Wie es funktioniert
quelle
Gelee , 17 Bytes
Die Eingabe ist ein Bytestring für STDIN, die Ausgabe ist 1-indiziert.
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (Node.js) ,
123 121 116114 ByteProbieren Sie es online!
Kommentiert
s[k++ >> 5]
quelle
Ruby ,
12111411210810289 BytesProbieren Sie es online!
0-indiziert. Nimmt die Eingabe als Array von Zeichen.
Dank ASCII-only für Golfideen im Wert von 12 Bytes.
quelle
p,=*s
Trick, aber ich bin mir nicht so sicher über die theoretische Robustheit einer Lösung mit einer hartcodierten Strafpunktzahl ... Also habe ich die Konstante auf unendlich geändert (obwohl Ihr Wert noch 2 Byte weniger zulässt) ).Python 2 ,
230222216194169 BytesProbieren Sie es online!
-22 Bytes von tsh
-39 Bytes von Jo King
Ältere Version mit Erklärung:
Probieren Sie es online!
Dies wäre in einer Sprache mit einer Primzahl von Buchstaben kürzer (würde keineDiese Vorlage verwendet jetztfloat('inf')
Behandlung von Endlosschleifen erfordern ). Tatsächlich würde diese Übermittlung immer noch die für die Verarbeitung von Zeichenfolgen wie "aaa" benötigen.26*len(s)
als Obergrenze verwendet, wodurch Endlosschleifen gestoppt werden.Diese Einreichung ist 0-indiziert (gibt Werte von 0 bis einschließlich 25 zurück).
f
Nimmt einen String (n in Großbuchstaben) und gibt den optimalen Alphabetschritt zurückt
ist eine Hilfsfunktion, die die Zeichenfolge und ein schrittweises Alphabet verwendet und die Anzahl der zum Beenden der Zeichenfolge erforderlichen Sprünge zurückgibt (oder26*len(s)
wenn dies nicht möglich ist).quelle
while a!=A(c)and S<len(s)*26:
Sie und Sie können entfernenif a==i:return float('inf')
, dalen(s)*26
die Obergrenze jeder Antwort ist.Rot , 197 Bytes
Probieren Sie es online!
quelle
05AB1E (Legacy) ,
332726 ByteVerwendet die ältere Version, da es einen Fehler zu geben scheint, wenn Sie das Ergebnis nach einer verschachtelten Karte in der neuen Version 05AB1E ändern / verwenden möchten.
0-indizierte Ausgabe.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Python 3 ,
191178162 BytesDanke an alle für all eure Tipps! das sieht viel mehr nach Golf aus.
Probieren Sie es online!
Und mein Originalcode, wenn jemand interessiert ist.
Wandelt das Wort in eine Liste von ASCII-Werten um und durchläuft dann die Schrittgrößen 0 bis 25, wobei überprüft wird, wie viele Schritte erforderlich sind, um die Liste zu erschöpfen (es gibt eine Obergrenze, um Endlosschleifen zu stoppen).
Die Anzahl der Schritte wird der Liste hinzugefügt. A .
Nach der großen for-Schleife wird der Index des kleinsten Werts in a gedruckt. Dies ist gleich dem Wert von i (der Schrittgröße) für die Iteration der Schleife QED.
quelle
range(26)
ist genug - Sie müssen den Start nicht angeben, da 0 die Standardeinstellung ist;a.append(n)
könnte seina+=[n]
; Die erste Zeile wäre kürzer als die Kartew=list(map(ord,input()))
(tatsächlich könnten Sie mit Ihrem aktuellen Algorithmus in Py2 auch den Zeilenumbruch fallen lassenlist(...)
). vermeiden zusätzliche Abstand / Zeilenumbrüche so weit wie möglich (zB keine Notwendigkeit für neue Zeilen in oneliners:if p>122:p-=26
)n>99
sieht auch verdächtig aus, ist das eine willkürliche Konstante, die aus der Endlosschleife ausbricht? Dann sollte es wohl so etwas wie 26 * len (w) sein, da man nie weiß, wie groß die Eingabe sein wird.list(...)
Übrigens kann man das in Py3 noch loswerden und auch eins extraif
: 165 Bytes . Werfen Sie auch einen Blick auf dieses Thema mit den Tipps . Ich bin sicher, dass Sie Ihre Fähigkeiten mit den Ratschlägen von dort erheblich verbessern werden!while p!=c and n>len(w)*26:
letzte if-Anweisung für -8 Bytes entfernen.n+=1
undp+=i
in separaten Zeilenn+=1;p+=i
auf eine setzen.