Eingang
Eine nicht negative Ganzzahl n
und eine nicht leere Zeichenfolge, s
die nur alphanumerische Zeichen und Unterstriche enthält _
. Das erste Zeichen von s
ist nicht _
. Die Unterstriche von s
werden als Leerzeichen interpretiert, die mit anderen Zeichen gefüllt werden können.
Wir definieren eine unendliche Folge von "unendlichen Strings" wie folgt. Die Saite wird nur unendlich oft wiederholt. Für alle wird die Zeichenfolge erhalten, indem die Leerzeichen mit den Zeichen von gefüllt werden , sodass das erste von durch , das zweite von durch usw. ersetzt wird. Da der erste Buchstabe von nicht ist , wird schließlich jedes Leerzeichen gefüllt, und wir bezeichnen durch die unendliche Zeichenfolge, in der jedes durch seinen endgültigen Wert ersetzt wurde.s1 = s s s...
s
k > 1
sk+1
sk
s1
_
sk
s1[0]
s1[1]
s
_
s∞
_
Ausgabe
Die ersten n
Zeichen als Zeichenfolge.s∞
Beispiel
Betrachten Sie die Eingänge n = 30
und s = ab_c_
. Wir haben
s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...
Wir ersetzen die Lücken vons1
s1
s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...
Wir ersetzen wieder die Leerzeichen, was zur Folge hats1
s3 = abacbabaccabbcaabbc_abcccabacbab_cc...
Eine weitere Substitution:
s4 = abacbabaccabbcaabbcaabcccabacbabbcc...
Daraus können wir bereits die ersten 30 Zeichen ableiten , von denen sinds∞
abacbabaccabbcaabbcaabcccabacb
Dies ist die richtige Ausgabe.
Regeln
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Absturz bei falscher Eingabe ist akzeptabel.
Testfälle
0 "ab__" -> ""
1 "ab__" -> "a"
3 "ab__" -> "aba"
20 "ab" -> "abababababababababab"
20 "ab__" -> "abababababababababab"
20 "ab_" -> "abaabbabaabaabbabbab"
30 "ab_c_" -> "abacbabaccabbcaabbcaabcccabacb"
50 "ab_a_cc" -> "abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"
50 "abc____" -> "abcabcaabcbcaaabcbcbcabcaaababccbcbabccabcabcaaaba"
Antworten:
Pyth, 17
Die Eingabe sollte mit der Zeichenfolge in der ersten Zeile und der Länge in der zweiten Zeile in STDIN erfolgen. Beispielsweise:
Probieren Sie es hier aus.
Erläuterung:
quelle
APL
2928es wird wie folgt verwendet:
Erläuterung:
Tryapl.org
quelle
⍣≡
ist eine gute Idee. Vielleicht sollte ich versuchen, dies auf J zu portieren ...CJam,
262420 Bytes4 Bytes gespart dank Peter.
Teste es hier. Nimmt die Zeichenfolge an erster und
n
zweiter Stelle von STDIN.Sie können alle Testfälle ausführen, indem Sie sie unverändert in die Eingabe
-> output
einfügen (einschließlich der, wenn Sie möchten) und das folgende Testkabel verwenden (wodurch die Reihenfolge für den Code umgekehrt wird):Erläuterung
Das Ergebnis wird am Ende des Programms automatisch ausgedruckt.
Ein Hinweis zu
[\]
:[
Erinnert sich im Prinzip an die aktuelle Größe des Stapels und]
sammelt alles bis zur letzten gespeicherten Größe in einem Array. Wenn die Größe des Arrays jedoch die zwischenzeitlich gespeicherte Größe unterschreitet, wird der Start des Arrays entsprechend angepasst. Jetzt könnten Sie denken, dass das Vertauschen der beiden obersten Array-Elemente die Array-Größe überhaupt nicht beeinflusst, aber\
tatsächlich zwei Werte aufnimmt und sie dann in umgekehrter Reihenfolge verschiebt. Dies ist es, was den Start des Arrays um zwei nach unten drückt. Dies[\]
ist der kürzeste Weg, um die beiden obersten Stapelelemente in ein Array einzubinden. Manchmal ist es ziemlich ärgerlich, sie in umgekehrter Reihenfolge zu sammeln, aber in diesem Fall ist es genau das, was ich brauche.quelle
_'_#)
g
mitI*
. Funktioniert für mich in GolfScript.Python 3, 110 Bytes
Benötigt ein bisschen mehr Golf, aber hier ist ein bisschen Wahnsinn. Liest
n
danns
STDIN ein.Der spaßige Teil besteht darin, in der Zuweisung der Schleife, die wir kopieren
b
, zu beginnen,b
während eines Listenverständnisses zu blättern . Wenn die Aufgabe umgekehrt wäre, würde es nicht funktionieren!quelle
k, 30
quelle
Java - 162
174Es kommt nicht jeden Tag vor, dass ich beim Golfen in Java eine do / while-Schleife benutze: D
Dies iteriert nur und füllt Leerzeichen aus, wenn sie kommen. Es geht einfach so lange weiter, bis nichts mehr
_
im Ergebnis ist.Mit Zeilenumbrüchen:
quelle
Java 8, 238
Weniger golfen:
quelle
Rubin, 60
Verkettet
s
sich selbstn
mal und generiert dannn
Kopien des Codes, der die Unterstriche ersetzts
, wertet diese Kopien aus und gibt die erstenn
Zeichen des Ergebnisses zurück. Da in jeder Schleife mindestens ein Unterstrich entfernt wird, erhalten wir garantiertn
unterstrichfreie Zeichen.quelle
f
und läuftputs f[10,"ab_"]
, bekomme ich folgende Fehlermeldung:in 'eval': undefined method 'next' for #<Array:...
. Es scheint jedoch zu funktionieren, wenn die Zeichenfolge keine Unterstriche enthält.String#chars
zwischen Ruby 1.9.3 und Ruby 2.0 geändert. In Ruby 1 wird ein Enumerator zurückgegeben, wenn kein Block vorhanden ist, in Ruby 2 ein Array. Sie kann versionsunempfindlich gemacht werden, indemchars
aufeach_char
4 weitere Nettobytes Code umgestellt wird.Python 2, 75
Das erwartet Eingaben wie
(30,"ab_c_")
.In Python erlauben Strings keine Zuweisung. Das Ersetzen der Leerzeichen durch das gewünschte Zeichen ist daher schwierig. Man kann dies umgehen, indem man in eine Liste konvertiert und zurück, aber ich fand es kürzer, nur die Ausgabezeichenfolge von Grund auf neu zu generieren und die gewünschten Zeichen nacheinander hinzuzufügen.
Die Ausgabe, die erstellt wird
S
, beginnt leer. Wir durchlaufen dies
mehrfach kopierten Zeichen der Eingabe , um einen Kreis zu simulieren. Wir prüfen über den Booleschen Wert, ob es sich um ein Leerzeichen handeltb
. Wir prüfen die Gleichheitx=='_'
und nicht den Vergleich, da der Unterstrich zwischen Groß- und Kleinbuchstaben liegt.Wenn das Zeichen kein Leerzeichen ist, fügen wir es einfach hinzu
S
. Wenn es leer ist, fügen wir den nächsten unbenutzten Buchstaben der bisherigen Ausgabe hinzuS
. Wir verfolgen verbrauchte Buchstaben anhand eines Indexzeigersc
, der bei 0 beginnt und jedes Mal inkrementiert wird, wenn wir auf ein Leerzeichen stoßen.Am Ende drucken wir die ersten
n
Zeichen der resultierenden ZeichenfolgeS
.Wir müssen
S[c:c+b]
anstelle des kürzeren verwenden,b*S[c]
da letzteres einen Fehler außerhalb der Grenzen ausgibt, wenn esS
leer beginnt undc
0 ist. Es spielt keine Rolle, da garantiert ist, dass das erste Zeichen vons
nicht leer ist. DiesS[c]
wird also niemals benötigt. aber der Code weiß es nicht. Das Umdrehen desor
Kurzschlusses könnte das auch lösen, kostet aber mehr Zeichen.Python 2, 83
Ein Pyth-zu-Python-Port der isaacg-Lösung , der das Ersetzen verwendet
split
undzip
durchführt:Es stellte sich heraus, dass benannte Methoden in Python überraschenderweise sehr lang sind. Aber es kann vielleicht verbessert werden, indem man zusammen
s
unds.split('_')
in kürzerer Weise riffelt .quelle
Haskell
(93)67Ich habe seit einiger Zeit keine Haskell mehr geschrieben,
daher kann dies wahrscheinlich um ein Vielfaches verkürzt werden.aber es war so gut, dass wir es kürzen und verbessern mussten!Verwendung:
quelle
Charge - 425
Verliere ich
Batch hat Einschränkungen - das akzeptiere ich. Beispielsweise; Ich musste eine for-Schleife verwenden, um eine einzelne Variable in einem verwendbaren Format zu erhalten, da die Syntax der Variablenanalyse eingeschränkt war.
for %%b in (!c!)do...
existiert nur, damit ich verwenden kann%%b
!c!
die Zeichenfolge bearbeiten anstatt sie zu verwenden!s:~%%b,1!
, und haben die Variablen zur richtigen Zeit erweitern.Es gibt ein paar ziemlich grundlegende Dinge, die ich tun könnte, um weiter Golf zu spielen, aber wahrscheinlich nicht unter 400 Bytes. Ich werde bald einen weiteren Riss haben.
quelle
ECMAScript 6, 78
Beginnt mit einer leeren Zeichenfolge und ersetzt sie bei jedem Auftreten eines Unterstrichs durch das Zeichen im nächsten Index der aktuellen Zeichenfolge.
quelle
Python 2 -
9997 BytesDa 4 Python-basierte Einsendungen nicht ausreichen ...
Beispiel:
quelle
ECMAScript 6,
93912 Zeichen aus der ersten Version rasiert.
quelle
C # - 162
Ich habe die Geobits-Lösung gestohlen und in C # geändert
1 char besser, damit du Geobits verbessern kannst;)
quelle