Siamo finiti da dove abbiamo iniziato! ...


29

Sfida:

Ingresso:

Prendi due input:
- Una stringa contenente solo ASCII stampabile (esclusi spazi, tabulazioni o nuove righe)
- Un carattere ASCII stampabile

Produzione:

La prima riga conterrà l'input della stringa. Ogni prima i-modulo-3 prima occorrenza di questo personaggio si sposterà in direzione sud-est; ogni ioccorrenza di -modulo-3 secondi si sposterà in direzione sud; e ogni iterzo evento -modulo-3 si sposterà in direzione sud-ovest. Continuerai fino a quando i caratteri stanno per essere di nuovo nella loro posizione iniziale iniziale (il che significa che si avvolgerà da una parte all'altra, se necessario), quindi stamperai di nuovo l'ultima riga con l'input di stringa su finiscilo. (Si noti che tutti i casi di test finiranno al loro input iniziale dopo al massimo le length(input)righe, inclusa la riga che contiene l'input finale. Può essere prima però, come visto in questo primo caso di test di seguito, con una lunghezza di 14, ma termina dopo 9.)

Questo può essere abbastanza vago, quindi ecco un esempio:

Caso di prova 1:

Input di stringa: Input di "This_is_a_test"
carattere:'s'

Produzione:

This_is_a_test
    s s    s  
     ss   s   
      s  s    
      sss     
      sss     
      s  s    
     ss   s   
    s s    s  
This_is_a_test

Ecco lo stesso test case con i percorsi colorati dei tre s:

inserisci qui la descrizione dell'immagine

dove il primo 's'segue il sentiero verde in direzione sud-est; il secondo 's'segue il sentiero giallo in direzione sud; e il terzo 's'segue il sentiero azzurro in direzione sud-ovest. (Se ce ne fosse un quarto 's', andrebbe di nuovo in una direzione sud-est, che può essere visto in alcuni degli altri casi di test di seguito.)

Regole della sfida:

  • Gli input conterranno solo ASCII stampabili (esclusi spazi, tabulazioni e nuove righe)
  • I formati I / O sono flessibili. Può essere una stringa delimitata da una nuova riga, una matrice di caratteri, ecc. La tua chiamata.
  • È possibile che il carattere specificato non sia presente nella stringa, nel qual caso ti è permesso di produrre la stringa di input una o due volte (cioè "test", 'a'puoi avere uno di questi come output possibile: "test\ntest"/ "test").
  • Gli spazi guida sono obbligatori; gli spazi finali sono facoltativi. Sono consentite una o più nuove righe iniziali / finali.

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la tua risposta valgono regole standard , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Sono vietate le scappatoie predefinite .
  • Se possibile, aggiungi un link con un test per il tuo codice.
  • Inoltre, si prega di aggiungere una spiegazione, se necessario.

Casi di prova / altri esempi:

Caso di prova 2:

Input di stringa: Input di "abcabcabcabcabc"
carattere:'b'

Produzione:

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

Ecco lo stesso test case con i percorsi colorati dei cinque a:

inserisci qui la descrizione dell'immagine

Caso di prova 3:

Input di stringa: Input di "only_two_paths?"
carattere:'o'

Produzione:

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?

Ecco lo stesso test case con i percorsi colorati dei due o:

inserisci qui la descrizione dell'immagine

Caso di prova 4:

Input stringa: "lollollollollol"
input carattere:'l'

Produzione:

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

Ecco lo stesso test case con i percorsi colorati dei dieci l:

inserisci qui la descrizione dell'immagine

Caso di prova 5:

Input stringa: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
input carattere:'C'

Produzione:

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

Ecco lo stesso test case con i percorsi colorati dei sette C:

inserisci qui la descrizione dell'immagine

Caso di prova 6:

Input stringa: "XyX"
input carattere:'X'

Produzione:

XyX
 XX
  X
XyX

Ecco lo stesso test case con i percorsi colorati dei due X:

inserisci qui la descrizione dell'immagine

Caso di prova 7:

Input stringa: "aaaa"
input carattere:'a'

Produzione:

aaaa
aa  
aaa 
 aaa
aaaa

Ecco lo stesso test case con i percorsi colorati dei quattro a:

inserisci qui la descrizione dell'immagine


Quindi quando la stringa contiene un multiplo di 3 del carattere, l'output potrebbe avere meno righe della lunghezza della stringa?
Neil

@Neil Non sono sicuro che sia un multiplo di 3, non l'ho studiato molto. Tutto quello che so è che al massimo length(input)tutto combacia di nuovo, ma può essere prima come dimostra il primo caso di test. Ma sembra che tu abbia davvero ragione sul multiplo di 3 parti (anche se non sono sicuro al 100%).
Kevin Cruijssen,

@Neil qualsiasi stringa con il carattere che appare solo 3 volte di seguito stamperà 3 righe per quanto sia lungo
Asone Tuhid

Sono consentite nuove righe finali tra 2 righe stampate?
Solo Tuhid,

@AsoneTuhid Siamo spiacenti ma no. Non mi interessa alcuna quantità di tracce finali o iniziali di nuove righe prima o dopo l'intero output previsto, ma non le consentirò tra le righe. Anche le linee diagonali non sarebbero più corrette ..
Kevin Cruijssen,

Risposte:


1

Stax , 24 byte

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

Eseguilo ed esegui il debug online

Questa è la rappresentazione ASCII dello stesso programma.

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

Ottiene gli indici di tutto il personaggio, quindi li muta fino a quando non sono impostati in modo uguale agli indici originali. Per ogni modifica, genera una stringa con il carattere in quegli indici.

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

8

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

Sostituisci il \0con un byte 0 letterale per ottenere 96. Notare che il collegamento Try It Online ha 97 byte perché non sembra possibile inserire lì un carattere letterale 0.

#!/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$_

L'evidenziatore di codice golf perl pensa di #iniziare un commento. Che ingenuo 😈

Provalo online!

Come funziona

$lè un contatore per quale riga dopo la prima siamo attivi (conta però il conto alla rovescia, quindi ad es. -3 per 3 righe sotto la stringa superiore). Dopo aver stampato la stringa iniziale una volta ripetutamente, procede come segue.

Cerca nella prima stringa le occorrenze del carattere target e calcola a quale offset deve apparire: (++$#$l%3*$l-$l+"@-")%@Fqual è la posizione corrente più il numero di riga (negativo) volte -1, 0, 1(ciclico). Costruisci una stringa con tante volte \0seguita dal carattere target e orquella in un accumulatore $$l(che è un accumulatore diverso per ciascuno $le il motivo $lconta alla rovescia anziché verso l'alto perché $1, $2ecc. Sono di sola lettura). Si $#$lriferisce allo stesso modo a un array diverso ogni volta attraverso il loop. Il risultato è la $llinea th ma con \0invece di spazi.

I caratteri target nella prima stringa vengono sostituiti da \0così si finisce con la stringa originale con "fori" (con \0) nelle posizioni originali del carattere target. Se xorcon l'accumulatore i fori vengono riempiti se e solo se l'accumulatore ha i caratteri target nelle posizioni originali, il risultato sarà la stringa originale. Viene utilizzato per terminare il ciclo. Se il ciclo non è ancora finito, stampare l'accumulatore con \0sostituito dallo spazio.

Quando il ciclo termina l' -popzione, ancora una volta stampa la prima stringa e il programma è terminato .

Il personaggio bersaglio viene raccolto in un modo piuttosto complicato. Le ${\<>}converte una linea di lettura da STDIN a un riferimento che viene quindi immediatamente dereferenziato e sostituito nella regex. Il \Qprefisso sfugge a tutti i caratteri speciali in una regex (come .e *). Il \Eè implicita. Il omodificatore fa sì che la parte di ricerca non venga mai più valutata ma ripetuta in tutte le corrispondenze successive (il che è positivo poiché non c'è più nulla su STDIN).


Non penso che tu possa mettere direttamente un byte null, ma potresti eseguirlo in bash o qualcosa del genere.
FryAmTheEggman

@FryAmTheEggman Grazie, è una bella schivata. Ma non credo che mi darò fastidio. La gente dovrà solo fidarsi di me che funziona se non vogliono provarlo da soli :-)
Ton Hospel

Completamente giusto, ma lascerò il commento in modo che le persone possano vederlo. Bel golf, a proposito :)
FryAmTheEggman

4

Python 2 , 199 193 191 byte

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))

Provalo online!


Se il loop può uscire tramite un'eccezione:

Python 2 , 187 byte

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))

Provalo online!


  • -4 byte grazie a Jonathan Frech
  • -2 byte grazie a Lynn

Possibili 189 byte (uscita dal loop tramite un'eccezione).
Jonathan Frech

È possibile rilasciare una coppia di parentesi (j[i]-i%3+1)%lper due byte.
Lynn

2

C (gcc) , 261 byte

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);}

Provalo online!


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)}

Provalo online!

Accetta input nella sintassi del curry, ad es f(s)(c).

Non è affatto perfetto, ma ho bisogno di JS. Molte funzioni in funzione.


2

Rubino , 189 176 171 156 150 146 144 137 byte

->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}

Provalo online!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.