Wir sind dort gelandet, wo wir angefangen haben!…

29

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:

Bildbeschreibung hier eingeben

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 , 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:

Bildbeschreibung hier eingeben

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:

Bildbeschreibung hier eingeben

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:

Bildbeschreibung hier eingeben

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:

Bildbeschreibung hier eingeben

Testfall 6:

String-Eingabe: "XyX"
Zeicheneingabe:'X'

Ausgabe:

XyX
 XX
  X
XyX

Hier ist der gleiche Testfall mit den farbigen Pfaden der beiden X:

Bildbeschreibung hier eingeben

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:

Bildbeschreibung hier eingeben

Kevin Cruijssen
quelle
Wenn die Zeichenfolge also ein Vielfaches von 3 des Zeichens enthält, enthält die Ausgabe möglicherweise weniger Zeilen als die Länge der Zeichenfolge?
Neil
@Neil Ich bin mir nicht sicher, ob es ein Vielfaches von 3 ist. Ich weiß nur, dass höchstens 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).
Kevin Cruijssen
@Neil jede Zeichenfolge mit dem Zeichen nur 3 Mal in einer Reihe wird 3 Zeilen drucken, wie lang es ist
Asone Tuhid
Dürfen zwischen zwei gedruckten Zeilen neue Zeilen eingefügt werden?
Asone Tuhid
@AsoneTuhid Sorry aber nein. Es ist mir egal, wie viele Zeilen vor oder nach der gesamten erwarteten Ausgabe nach- oder nachgestellt werden, aber ich erlaube keine Zeilen dazwischen. Die diagonalen Linien wären auch nicht mehr korrekt.
Kevin Cruijssen

Antworten:

1

Stax , 24 Bytes

»v↕*δó‼Γ█|q┬YM╨|·£↕fßßZo

Führen Sie es online aus und debuggen Sie es

Dies ist die ASCII-Darstellung desselben Programms.

YxP|Ic{{i3%v-x%%mb-!Czny&PWxP

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.

Y                               Store character in y.  Now the inputs are x and y.
 xP                             Print x.
   |Ic                          Get all indices of y in x. Make a copy.
      {                   W     Loop until cancelled.
       {        m               Map index array using block.
        i3%v-                   Subtract i%3-1 from each element. i is the loop index.
             x%%                Modulo len(x)
                 b-!            Is the mutated array set-equal to the original?
                    C           If so, cancel W loop
                     zny&P      Print a string with y at all specified indices
                           xP   Finally, print x again
rekursiv
quelle
8

Perl 5 , -plF 101 100 99 98 97 96 Bytes

Ersetzen Sie das \0durch 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.

#!/usr/bin/perl -plF
say;say$$l=~y/\0/ /runtil--$l,(s:\Q${\<>}:$$l|=v0 x((++$#$l%3*$l-$l+"@-")%@F).$&;v0:oreg^$$l)eq$_

Der Code Golf Perl Textmarker denkt #einen Kommentar zu starten. Wie naiv 😈

Probieren Sie es online!

Wie es funktioniert

$list 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+"@-")%@FDies ist die aktuelle Position plus Zeilennummer (negativ) mal -1, 0, 1(zyklisch). Konstruieren Sie einen String mit , dass viele Male \0durch das Zielzeichen folgt und ordass in einem Akkumulator $$l(die einen anderen Akkumulator für jeden ist $lund der Grund $lzählt nach unten statt nach oben , weil $1, $2etc sind schreibgeschützt). Bezieht $#$lsich jedes Mal in der Schleife auf ein anderes Array. Das Ergebnis ist die $ldritte Zeile, jedoch mit \0Leerzeichen.

Die Zielzeichen in der ersten Zeichenfolge werden durch ersetzt, \0sodass Sie die ursprüngliche Zeichenfolge mit "Löchern" (mit \0) an den ursprünglichen Positionen des Zielzeichens erhalten. Wenn Sie dies xormit 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 \0durch Leerzeichen ersetzt.

Wenn die Schleife endet, gibt die -pOption 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 \QPräfix verbirgt sich vor allen Zeichen, die in einem regulären Ausdruck besonders sind (wie .und *). Das \Eist implizit. Der oModifikator 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).

Tonne Hospel
quelle
Ich glaube nicht, dass Sie ein Null-Byte direkt setzen können, aber Sie könnten es in Bash oder so etwas ausführen .
FryAmTheEggman
@FryAmTheEggman Danke, das ist ein schöner Trick. Aber ich glaube nicht, dass ich mich darum kümmern werde. Die Leute müssen mir nur vertrauen, dass das funktioniert, wenn sie es nicht selbst ausprobieren wollen :-)
Ton Hospel
Ganz fair, aber ich werde den Kommentar hinterlassen, damit die Leute ihn sehen können. Schönes Golf, übrigens :)
FryAmTheEggman
4

Python 2 , 199 193 191 Bytes

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;break
 print''.join((' '+c)[i in j]for i in r(l))

Probieren Sie es online!


Wenn die Schleife über eine Ausnahme beendet werden kann:

Python 2 , 187 Bytes

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;q
 print''.join((' '+c)[i in j]for i in r(l))

Probieren Sie es online!


  • -4 Bytes dank Jonathan Frech
  • -2 Bytes dank Lynn
TFeld
quelle
Mögliche 189 Bytes (Verlassen der Schleife über eine Ausnahme).
Jonathan Frech
Sie können ein Paar Parens (j[i]-i%3+1)%lfür zwei Bytes einfügen.
Lynn
2

C (gcc) , 261 Bytes

i,j,l,k;g(L,t,r,c)char**L;{L[r++][c]=k;c-=t?t-1?:0:-1;l<r||g(L,t,r,c<0?l-1:c%l);}f(S,K){char*s=S,*L[i=1+(l=strlen(s))];for(k=K;i--;)for(L[i]=calloc(j=l,1);j--;)L[i][j]=32;for(puts(s);s[++i];)s[i]-k||g(L,++j%3,0,i);for(i=1;strcmp(*L,L[i]);)puts(L[i++]);puts(s);}

Probieren Sie es online!

Steadybox
quelle
2

JavaScript (Node.js) , 197 - 194 Byte

s=>c=>{(C=console.log)(s);w=0;g=[];while(~(w=s.indexOf(c,w)))g.push(w++);h=(H=_=>g.map(x=>A[x]=c,A=Array(l=s.length).fill` `)&&A.join``)();while(h!=(y=H(g=g.map((x,i)=>(l-~x-i%3)%l))))C(y);C(s)}

Probieren Sie es online!

Übernimmt Eingaben in Currying-Syntax, dh f(s)(c).

Überhaupt nicht perfekt, aber ich brauche JS. Viele Funktionen in Funktion.

Shieru Asakoto
quelle
2

Ruby , 189 176 171 156 150 146 144 137 Bytes

->s,c,r=0..k=s.size,b=[p,s]{d=0;g=s.tr c,n=' '*k;l=r=r.map{|i|l||c==s[i]?(n[z=(i+1-d%3)%k]=g[z]=c;d+=1;z):p}-b;g==s||b<<n&&redo;puts b,s}

Probieren Sie es online!

Asone Tuhid
quelle