Nous avons fini là où nous avons commencé!…

29

Défi:

Contribution:

Vous prenez deux entrées:
- Une chaîne contenant uniquement de l'ASCII imprimable (à l'exclusion des espaces, des tabulations ou des nouvelles lignes)
- Un caractère ASCII imprimable

Sortie:

La première ligne contiendra l'entrée de chaîne. Chaque ipremière occurrence de -modulo-3 de ce personnage se déplacera dans une direction sud-est; chaque ioccurrence de -modulo-3 se déplacera dans une direction sud; et chaque itroisième occurrence de -modulo-3 se déplacera dans une direction sud-ouest. Vous continuerez jusqu'à ce que les caractères soient sur le point d'être à leur position de départ initiale (ce qui signifie qu'il s'enroulera d'un côté à l'autre si nécessaire), puis vous imprimerez à nouveau la dernière ligne avec l'entrée de chaîne dans Terminez-le. (Notez que tous les cas de test se retrouveront à leur entrée initiale après au plus des length(input)lignes, y compris la ligne contenant l'entrée de fin. Cela peut être plus tôt cependant, comme on le voit dans ce premier cas de test ci-dessous, avec une longueur de 14, mais se terminant après 9.)

Tout cela peut être assez vague, alors voici un exemple:

Cas de test 1:

Entrée chaîne: Entrée "This_is_a_test"
caractère:'s'

Sortie:

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

Voici le même cas de test avec les chemins colorés des trois s:

entrez la description de l'image ici

où le premier 's'suit la voie verte dans une direction sud-est; le second 's'suit le chemin jaune en direction du sud; et le troisième 's'suit le chemin bleu clair dans une direction sud-ouest. (S'il y en avait un quatrième, 's'il irait à nouveau dans une direction sud-est, comme on peut le voir dans certains des autres cas de test ci-dessous.)

Règles du défi:

  • Les entrées ne contiendront que de l'ASCII imprimable (à l'exclusion des espaces, des tabulations et des nouvelles lignes)
  • Les formats d'E / S sont flexibles. Peut être une chaîne délimitée par une nouvelle ligne, une matrice de caractères, etc. Votre appel.
  • Il est possible que le caractère donné ne soit pas présent dans la chaîne, auquel cas vous êtes autorisé à sortir la chaîne d'entrée une ou deux fois (c'est "test", 'a'-à- dire que vous pouvez avoir l'une ou l'autre de ces sorties comme sortie possible: "test\ntest"/ "test").
  • Les espaces de tête sont obligatoires; les espaces de fin sont facultatifs. Une ou plusieurs nouvelles lignes de début / fin sont autorisées.

Règles générales:

  • C'est le , donc la réponse la plus courte en octets l'emporte.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, fonctions / méthode avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code.
  • Veuillez également ajouter une explication si nécessaire.

Cas de test / autres exemples:

Cas de test 2:

Entrée chaîne: Entrée "abcabcabcabcabc"
caractère:'b'

Sortie:

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

Voici le même cas de test avec les chemins colorés des cinq a:

entrez la description de l'image ici

Cas de test 3:

Entrée chaîne: Entrée "only_two_paths?"
caractère:'o'

Sortie:

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?

Voici le même cas de test avec les chemins colorés des deux o:

entrez la description de l'image ici

Cas de test 4:

Entrée de chaîne: "lollollollollol"
entrée de caractères:'l'

Sortie:

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

Voici le même cas de test avec les chemins colorés des dix l:

entrez la description de l'image ici

Cas de test 5:

Entrée de chaîne: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
entrée de caractères:'C'

Sortie:

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

Voici le même cas de test avec les chemins colorés des sept C:

entrez la description de l'image ici

Cas de test 6:

Entrée de chaîne: "XyX"
entrée de caractères:'X'

Sortie:

XyX
 XX
  X
XyX

Voici le même cas de test avec les chemins colorés des deux X:

entrez la description de l'image ici

Cas de test 7:

Entrée de chaîne: "aaaa"
entrée de caractères:'a'

Sortie:

aaaa
aa  
aaa 
 aaa
aaaa

Voici le même cas de test avec les chemins colorés des quatre a:

entrez la description de l'image ici

Kevin Cruijssen
la source
Ainsi, lorsque la chaîne contient un multiple de 3 du caractère, la sortie peut avoir moins de lignes que la longueur de la chaîne?
Neil
@Neil Je ne sais pas si c'est un multiple de 3, je n'ai pas beaucoup enquêté. Tout ce que je sais, c'est que length(input)tout correspond à nouveau, mais cela peut être plus tôt, comme le prouve le premier cas de test. Mais il semble que vous ayez bien raison sur le multiple de 3 parties (même si je ne suis pas sûr à 100%).
Kevin Cruijssen
@Neil toute chaîne dont le caractère n'apparaît que 3 fois de suite affichera 3 lignes aussi longues soient
elles
Les nouvelles lignes de fin sont-elles autorisées entre 2 lignes imprimées?
Asone Tuhid
@AsoneTuhid Désolé mais non. Je ne me soucie d'aucune quantité de nouvelles lignes de fin ou de début avant ou après la sortie attendue entière, mais je ne permettrai pas entre les lignes. Les lignes diagonales ne seraient plus aussi correctes.
Kevin Cruijssen

Réponses:

1

Stax , 24 octets

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

Exécutez-le et déboguez-le en ligne

Il s'agit de la représentation ascii du même programme.

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

Il obtient les indices de tous les caractères, puis les mute jusqu'à ce qu'ils soient égaux aux indices d'origine. Pour chaque changement, sortez une chaîne avec le caractère à ces indices.

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
récursif
la source
8

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

Remplacez le \0par un littéral 0 octet pour obtenir 96. Notez que le lien Try It Online contient 97 octets car il ne semble pas possible d'y saisir un caractère littéral 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$_

Le surligneur de golf perl code pense #commencer un commentaire. Quelle naïveté 😈

Essayez-le en ligne!

Comment ça marche

$lest un compteur pour quelle ligne après la première nous sommes (il compte cependant, donc par exemple -3 pour 3 lignes en dessous de la chaîne du haut). Après avoir imprimé la chaîne initiale une fois, il fait à plusieurs reprises ce qui suit.

Recherchez dans la première chaîne les occurrences du caractère cible et calculez à quel décalage il doit apparaître: (++$#$l%3*$l-$l+"@-")%@Fquelle est la position actuelle plus le nombre de lignes (négatif) fois -1, 0, 1(cyclique). Construisez une chaîne avec ce nombre de fois \0suivi du caractère cible et orcela dans un accumulateur $$l(c'est-à-dire un accumulateur différent pour chacun $let la raison $ldécompte au lieu d'augmenter, car $1, $2etc. sont en lecture seule). Fait simultanément $#$lréférence à un tableau différent à chaque fois dans la boucle. Le résultat est la $le ligne mais avec \0au lieu d'espaces.

Les caractères cibles de la première chaîne sont remplacés par de \0sorte que vous vous retrouvez avec la chaîne d'origine avec des "trous" (avec \0) aux positions d'origine du caractère cible. Si vous xoravec l'accumulateur, les trous sont remplis si et seulement si l'accumulateur a les caractères cibles dans les positions d'origine, le résultat sera donc la chaîne d'origine. Cela est utilisé pour terminer la boucle. Si la boucle n'est pas terminée, imprimez l'accumulateur avec \0remplacé par l'espace.

Lorsque la boucle se termine, l' -poption imprime à nouveau la première chaîne et le programme est terminé.

Le personnage cible est capté d'une manière assez délicate. Le ${\<>}convertit une ligne lue depuis STDIN en une référence qui est ensuite immédiatement déréférencée et substituée dans l'expression régulière. Le \Qpréfixe échappe à tous les caractères spéciaux dans une expression régulière (comme .et *). Le \Eest implicite. Le omodificateur fait que la partie de recherche n'est plus jamais évaluée mais simplement répétée dans toutes les correspondances suivantes (ce qui est bien car il n'y a plus rien sur STDIN).

Ton Hospel
la source
Je ne pense pas que vous puissiez mettre un octet nul directement, mais vous pouvez l'exécuter dans bash ou quelque chose.
FryAmTheEggman
@FryAmTheEggman Merci, c'est une belle esquive. Mais je ne pense pas que je vais déranger. Les gens devront simplement me faire confiance que cela fonctionne s'ils ne veulent pas l'essayer eux-mêmes :-)
Ton Hospel
Complètement juste, mais je vais laisser le commentaire pour que les gens puissent le voir. Bon golf, d'ailleurs :)
FryAmTheEggman
4

Python 2 , 199 193 191 191 octets

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

Essayez-le en ligne!


Si la boucle peut sortir via une exception:

Python 2 , 187 octets

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

Essayez-le en ligne!


  • -4 octets grâce à Jonathan Frech
  • -2 octets grâce à Lynn
TFeld
la source
189 octets possibles (sortie de la boucle via une exception).
Jonathan Frech
Vous pouvez supprimer une paire de parens (j[i]-i%3+1)%lpour deux octets.
Lynn
2

C (gcc) , 261 octets

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

Essayez-le en ligne!

Steadybox
la source
2

JavaScript (Node.js) , 197 194 octets

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

Essayez-le en ligne!

Prend des entrées dans la syntaxe de curry, c.-à-d f(s)(c).

Pas parfait du tout, mais j'ai besoin de JS. Beaucoup de fonctions en fonction.

Shieru Asakoto
la source
2

Rubis , 18917617115650150146144137 octets

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

Essayez-le en ligne!

Asone Tuhid
la source