Herausforderung:
Eingang:
Sie können zwei Eingaben vornehmen:
- Eine Zeichenfolge, die nur druckbares ASCII enthält (ohne Leerzeichen, Tabulatoren oder Zeilenumbrüche).
- Ein druckbares ASCII-Zeichen
Ausgabe:
Die erste Zeile enthält die Zeichenfolge-Eingabe. Jedes i
-modulo-3 erste Vorkommen dieses Charakters bewegt sich in südöstlicher Richtung; Jedes i
-modulo-3-Sekunden-Vorkommen bewegt sich in südlicher Richtung. und jedes i
-modulo-3 dritte Vorkommen bewegt sich in südwestlicher Richtung. Sie fahren fort, bis sich die Zeichen wieder an ihrer ursprünglichen Anfangsposition befinden (was bedeutet, dass sie bei Bedarf von einer Seite zur anderen umlaufen), und drucken dann die letzte Zeile mit der Zeichenfolge-Eingabe erneut aus Beende es. (Beachten Sie, dass alle Testfälle bei ihrer ursprünglichen Eingabe nach höchstens length(input)
Zeilen enden , einschließlich der Zeile, die die nachgestellte Eingabe enthält. Sie kann jedoch, wie in diesem ersten Testfall unten gezeigt, mit einer Länge von 14 früher sein, endet jedoch nach 9.)
Das mag alles ziemlich vage sein, also hier ein Beispiel:
Testfall 1:
String-Eingabe: "This_is_a_test"
Zeicheneingabe:'s'
Ausgabe:
This_is_a_test
s s s
ss s
s s
sss
sss
s s
ss s
s s s
This_is_a_test
Hier ist der gleiche Testfall mit den farbigen Pfaden der drei s
:
wo der erste 's'
dem grünen Pfad in südöstlicher Richtung folgt; der zweite 's'
folgt dem gelben Pfad in südlicher Richtung; und der dritte 's'
folgt dem hellblauen Pfad in südwestlicher Richtung. (Wenn es ein viertes geben 's'
würde, würde es wieder in südöstlicher Richtung verlaufen, was in einigen der folgenden Testfälle zu sehen ist.)
Herausforderungsregeln:
- Die Eingaben enthalten nur druckbare ASCII-Zeichen (ohne Leerzeichen, Tabulatoren und Zeilenumbrüche).
- E / A-Formate sind flexibel. Kann eine durch Zeilenumbrüche getrennte Zeichenfolge, Zeichenmatrix usw. sein. Ihr Anruf.
- Es ist möglich, dass das angegebene Zeichen in der Zeichenfolge nicht vorhanden ist. In diesem Fall können Sie die Eingabezeichenfolge entweder ein- oder zweimal ausgeben (dh, Sie
"test", 'a'
können eines dieser Zeichen als mögliche Ausgabe haben:"test\ntest"
/"test"
). - Führende Leerzeichen sind Pflichtfelder; Leerzeichen sind optional. Eine oder mehrere führende / nachfolgende neue Zeilen sind zulässig.
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie ggf. auch eine Erklärung hinzu.
Testfälle / weitere Beispiele:
Testfall 2:
String-Eingabe: "abcabcabcabcabc"
Zeicheneingabe:'b'
Ausgabe:
abcabcabcabcabc
b b b b b
bbb bb
b b
bbb bb
b b b b b
b b b b
b b b b b
bb b bb
b b b
bb bbb
b b bbb
b b b b
b bb bb
b b bb b
abcabcabcabcabc
Hier ist der gleiche Testfall mit den farbigen Pfaden der fünf a
:
Testfall 3:
String-Eingabe: "only_two_paths?"
Zeicheneingabe:'o'
Ausgabe:
only_two_paths?
o o
o o
o o
o o
o o
oo
o
oo
o o
o o
o o
o o
o o
o o
only_two_paths?
Hier ist der gleiche Testfall mit den farbigen Pfaden der beiden o
:
Testfall 4:
String-Eingabe: "lollollollollol"
Zeicheneingabe:'l'
Ausgabe:
lollollollollol
lll ll ll
ll ll ll
l ll ll ll ll
lll l ll l ll
llllll ll ll
l l ll ll
ll lll ll
l l l lll ll l
ll l ll l l
l l l l llll l
ll lll lll
l l l ll
ll lll lllll
l l l ll l ll
lollollollollol
Hier der gleiche Testfall mit den farbigen Pfaden der Zehn l
:
Testfall 5:
String-Eingabe: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
Zeicheneingabe:'C'
Ausgabe:
AbCdEeDcBaAbCdEeDcBa_CCCCC
C C C C C
C C C C CCC
C C C C C C C
C C C C C C C
C C C C C C C
C C C C C C C
C C C C C C C
C C C CC C C
C C CC C C
C C CC C C
C C CC C
CC CC C C
CC CC C C
C C CC C C
C C CC C C C
C C C C C C
C C CC C C C
C C C C C C C
C C C C C C C
C C C C C CC
C C C C C C
C C C C CCC
C C C CCCC
C C C C
C C CCCCC
AbCdEeDcBaAbCdEeDcBa_CCCCC
Hier ist der gleiche Testfall mit den farbigen Pfaden der Sieben C
:
Testfall 6:
String-Eingabe: "XyX"
Zeicheneingabe:'X'
Ausgabe:
XyX
XX
X
XyX
Hier ist der gleiche Testfall mit den farbigen Pfaden der beiden X
:
Testfall 7:
String-Eingabe: "aaaa"
Zeicheneingabe:'a'
Ausgabe:
aaaa
aa
aaa
aaa
aaaa
Hier ist der gleiche Testfall mit den farbigen Pfaden der vier a
:
length(input)
alles wieder zusammenpasst, aber es kann früher sein, wie der erste Testfall beweist. Aber es scheint, dass Sie in Bezug auf das Vielfache von 3 richtig liegen (obwohl ich mir nicht zu 100% sicher bin).Antworten:
Stax , 24 Bytes
Führen Sie es online aus und debuggen Sie es
Dies ist die ASCII-Darstellung desselben Programms.
Es werden die Indizes aller Zeichen abgerufen und dann mutiert, bis sie den ursprünglichen Indizes entsprechen. Geben Sie bei jeder Änderung eine Zeichenfolge mit dem Zeichen an diesen Indizes aus.
quelle
Perl 5 ,
-plF
10110099989796 BytesErsetzen Sie das
\0
durch ein 0-Byte-Literal, um 96 zu erhalten. Beachten Sie, dass der Try It Online-Link 97 Byte enthält, da es anscheinend nicht möglich ist, dort ein 0-Byte-Literal einzugeben.Der Code Golf Perl Textmarker denkt
#
einen Kommentar zu starten. Wie naiv 😈Probieren Sie es online!
Wie es funktioniert
$l
ist ein Zähler für die Zeile nach der ersten, in der wir uns befinden (er zählt jedoch abwärts, z. B. -3 für 3 Zeilen unter der obersten Zeichenfolge).Durchsuchen Sie die erste Zeichenfolge nach Vorkommen des Zielzeichens und berechnen Sie, an welchem Versatz es erscheinen soll:
(++$#$l%3*$l-$l+"@-")%@F
Dies ist die aktuelle Position plus Zeilennummer (negativ) mal-1, 0, 1
(zyklisch). Konstruieren Sie einen String mit , dass viele Male\0
durch das Zielzeichen folgt undor
dass in einem Akkumulator$$l
(die einen anderen Akkumulator für jeden ist$l
und der Grund$l
zählt nach unten statt nach oben , weil$1
,$2
etc sind schreibgeschützt). Bezieht$#$l
sich jedes Mal in der Schleife auf ein anderes Array. Das Ergebnis ist die$l
dritte Zeile, jedoch mit\0
Leerzeichen.Die Zielzeichen in der ersten Zeichenfolge werden durch ersetzt,
\0
sodass Sie die ursprüngliche Zeichenfolge mit "Löchern" (mit\0
) an den ursprünglichen Positionen des Zielzeichens erhalten. Wenn Sie diesxor
mit dem Akkumulator tun, werden die Löcher genau dann gefüllt, wenn der Akkumulator die Zielzeichen an den ursprünglichen Positionen enthält. Das Ergebnis ist also die ursprüngliche Zeichenfolge. Damit wird die Schleife beendet. Wenn die Schleife noch nicht beendet ist, drucken Sie den Akku mit\0
durch Leerzeichen ersetzt.Wenn die Schleife endet, gibt die
-p
Option den ersten String erneut aus und das Programm ist beendet.Der Zielcharakter wird auf ziemlich knifflige Weise aufgenommen. Das
${\<>}
konvertiert eine von STDIN gelesene Zeile in eine Referenz, die dann sofort dereferenziert und in den regulären Ausdruck eingesetzt wird. Das\Q
Präfix verbirgt sich vor allen Zeichen, die in einem regulären Ausdruck besonders sind (wie.
und*
). Das\E
ist implizit. Dero
Modifikator bewirkt, dass der Suchteil nie wieder ausgewertet wird, sondern nur in allen nachfolgenden Übereinstimmungen wiederholt wird (was gut ist, da auf STDIN nichts mehr vorhanden ist).quelle
Python 2 ,
199193191 BytesProbieren Sie es online!
Wenn die Schleife über eine Ausnahme beendet werden kann:
Python 2 , 187 Bytes
Probieren Sie es online!
quelle
(j[i]-i%3+1)%l
für zwei Bytes einfügen.C (gcc) , 261 Bytes
Probieren Sie es online!
quelle
JavaScript (Node.js) ,
197 -194 ByteProbieren Sie es online!
Übernimmt Eingaben in Currying-Syntax, dh
f(s)(c)
.Überhaupt nicht perfekt, aber ich brauche JS. Viele Funktionen in Funktion.
quelle
Ruby ,
189 176 171 156 150 146 144137 BytesProbieren Sie es online!
quelle
Gelee , 33 Bytes
Probieren Sie es online!
Aufruf als Funktion. (dyadischer Link)
Ich habe einige 33-Byte- Alternativen gefunden , aber keine wirkliche Verbesserung.
quelle