Acabamos por onde começamos!…

29

Desafio:

Entrada:

Você recebe duas entradas:
- Uma sequência contendo apenas ASCII imprimível (excluindo espaços, tabulações ou novas linhas)
- Um caractere ASCII imprimível

Saída:

A primeira linha conterá a entrada de string. Toda iprimeira ocorrência desse módulo se moverá na direção sudeste; toda iocorrência de módulo-3 segundos se moverá na direção sul; e cada iterceira ocorrência de módulo 3 se moverá na direção sudoeste. Você continuará até que os caracteres estejam na posição inicial inicial novamente (o que significa que ele se agrupará de um lado para o outro, se necessário) e, em seguida, imprimirá a última linha com a entrada de sequência novamente para Termine isso. (Observe que todos os casos de teste terminam na entrada inicial após o máximo de length(input)linhas, incluindo a linha que contém a entrada à direita. No entanto, pode ser mais cedo, como visto no primeiro caso de teste abaixo, com um comprimento de 14, mas terminando após 9.)

Tudo isso pode ser bastante vago, então aqui está um exemplo:

Caso de teste 1:

Entrada de string: Entrada de "This_is_a_test"
caractere:'s'

Saída:

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

Aqui está o mesmo caso de teste com os caminhos coloridos dos três s:

insira a descrição da imagem aqui

onde o primeiro 's'segue o caminho verde na direção sudeste; o segundo 's'segue o caminho amarelo na direção sul; e o terceiro 's'segue o caminho azul claro na direção sudoeste. (Se houvesse um quarto 's', seguiria na direção sudeste novamente, o que pode ser visto em alguns dos outros casos de teste abaixo.)

Regras do desafio:

  • As entradas conterão apenas ASCII imprimível (excluindo espaços, tabulações e novas linhas)
  • Os formatos de E / S são flexíveis. Pode ser uma cadeia de caracteres delimitada por nova linha, matriz de caracteres, etc. Sua chamada.
  • É possível que o caractere fornecido não esteja presente na string; nesse caso, você pode emitir a string de entrada uma ou duas vezes (ou seja, "test", 'a'pode ter um destes como saída possível: "test\ntest"/ "test").
  • Espaços principais são obrigatórios; espaços à direita são opcionais. Uma ou várias novas linhas iniciais / finais são permitidas.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, adicione uma explicação, se necessário.

Casos de teste / mais exemplos:

Caso de teste 2:

Entrada de string: Entrada de "abcabcabcabcabc"
caractere:'b'

Saída:

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

Aqui está o mesmo caso de teste com os caminhos coloridos dos cinco a:

insira a descrição da imagem aqui

Caso de teste 3:

Entrada de string: Entrada de "only_two_paths?"
caractere:'o'

Saída:

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?

Aqui está o mesmo caso de teste com os caminhos coloridos dos dois o:

insira a descrição da imagem aqui

Caso de teste 4:

Entrada de string: "lollollollollol"
entrada de caracteres:'l'

Saída:

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

Aqui está o mesmo caso de teste com os caminhos coloridos dos dez l:

insira a descrição da imagem aqui

Caso de teste 5:

Entrada de string: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
entrada de caracteres:'C'

Saída:

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

Aqui está o mesmo caso de teste com os caminhos coloridos dos sete C:

insira a descrição da imagem aqui

Caso de teste 6:

Entrada de string: "XyX"
entrada de caracteres:'X'

Saída:

XyX
 XX
  X
XyX

Aqui está o mesmo caso de teste com os caminhos coloridos dos dois X:

insira a descrição da imagem aqui

Caso de teste 7:

Entrada de string: "aaaa"
entrada de caracteres:'a'

Saída:

aaaa
aa  
aaa 
 aaa
aaaa

Aqui está o mesmo caso de teste com os caminhos coloridos dos quatro a:

insira a descrição da imagem aqui

Kevin Cruijssen
fonte
Então, quando a sequência contém um múltiplo de 3 do caractere, a saída pode ter menos linhas que o comprimento da sequência?
911 Neil
@ Neil Não tenho certeza se é um múltiplo de 3, não o investiguei muito. Tudo o que sei é que, no máximo, length(input)tudo coincide novamente, mas pode ser mais cedo, como o primeiro caso de teste prova. Mas parece que você está realmente certo sobre o múltiplo de 3 partes (embora eu não tenha 100% de certeza).
Kevin Cruijssen 7/03/19
@Neil qualquer string com o personagem que aparece apenas 3 vezes seguidas irá imprimir 3 linhas o tempo que é
asone Tuhid
É permitido rastrear novas linhas entre 2 linhas impressas?
asone Tuhid
@AsoneTuhid Desculpe, mas não. Não me importo com nenhuma quantidade de novas linhas à direita ou à frente antes ou depois de toda a saída esperada, mas não permitirei as entrelinhas. As linhas diagonais não seria correcto mais bem ..
Kevin Cruijssen

Respostas:

1

Stax , 24 bytes

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

Execute e depure on-line

Esta é a representação ascii do mesmo programa.

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

Ele obtém os índices de todos os caracteres e os modifica até que eles sejam iguais aos índices originais. Para cada alteração, imprima uma sequência com o caractere nesses índices.

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
recursivo
fonte
8

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

Substitua \0por um literal de 0 byte para obter 96. Observe que o link Try It Online possui 97 bytes porque não parece possível inserir um caractere 0 literal lá.

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

O código golf perl highlighter acha que #começa um comentário. Quão ingênuo 😈

Experimente online!

Como funciona

$lé um contador para o qual a linha após a primeira em que estamos inseridos (porém, é decrescente, por exemplo, -3 por 3 linhas abaixo da sequência superior). Depois de imprimir a sequência inicial, uma vez que repetidamente faz o seguinte.

Pesquise a primeira sequência de ocorrências do caractere de destino e calcule em que deslocamento deve aparecer: (++$#$l%3*$l-$l+"@-")%@Fqual é a posição atual mais o número da linha (negativo) vezes -1, 0, 1(cíclico). Construir uma corda com que muitas vezes \0seguidas pelo personagem alvo e orque em um acumulador $$l(que é um acumulador diferente para cada $lea razão $lcontagem para baixo em vez de até porque $1, $2etc são somente leitura). Simultaneamente, $#$lrefere-se a uma matriz diferente a cada vez no loop. O resultado é a $llinha th, mas com em \0vez de espaços.

Os caracteres de destino na primeira sequência são substituídos por, \0para que você acabe com a sequência original com "buracos" (com \0) nas posições originais do caractere de destino. Se você, xorcom o acumulador, os furos forem preenchidos se, e somente se, o acumulador tiver os caracteres de destino nas posições originais, o resultado será a sequência original. Isso é usado para finalizar o loop. Se o loop ainda não estiver concluído, imprima o acumulador com a \0substituição por espaço.

Quando o loop termina, a -popção mais uma vez imprime a primeira string e o programa é concluído.

O personagem alvo é escolhido de uma maneira bastante complicada. Ele ${\<>}converte uma linha lida de STDIN em uma referência que é imediatamente desreferenciada e substituída no regex. O \Qprefixo escapa a todos os caracteres especiais em uma regex (como .e *). O \Eestá implícito. O omodificador faz com que a parte da pesquisa nunca seja avaliada novamente, mas apenas repetida em todas as correspondências subsequentes (o que é bom, pois não há mais nada no STDIN).

Ton Hospel
fonte
Eu não acho que você pode colocar um byte nulo diretamente, mas você pode executá-lo no bash ou algo assim.
FryAmTheEggman 7/0318
@FryAmTheEggman Obrigado, é uma boa esquiva. Mas acho que não vou incomodar. As pessoas só vai ter que confiar em mim que que as obras se não quiser experimentá-lo por si próprios :-)
Ton Hospel
Completamente justo, mas deixarei o comentário para que as pessoas possam vê-lo. Agradável de golfe, a propósito :)
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))

Experimente online!


Se o loop puder sair via exceção:

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

Experimente online!


  • -4 bytes graças a Jonathan Frech
  • -2 bytes graças a Lynn
TFeld
fonte
Possíveis 189 bytes (saindo do loop por uma exceção).
Jonathan Frech
Você pode soltar um par de parênteses (j[i]-i%3+1)%lpor dois bytes.
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);}

Experimente online!

Steadybox
fonte
2

JavaScript (Node.js) , 197 194 bytes

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

Experimente online!

Recebe entradas na sintaxe de currying, ie f(s)(c).

Não é perfeito, mas preciso de JS. Muitas funções em função.

Shieru Asakoto
fonte
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}

Experimente online!

Asone Tuhid
fonte