Skończyliśmy tam, gdzie zaczęliśmy!…


29

Wyzwanie:

Wkład:

Podajesz dwa dane wejściowe:
- Ciąg znaków zawierający tylko drukowalny kod ASCII (bez spacji, tabulatorów i nowych wierszy)
- Drukowalny znak ASCII

Wydajność:

Pierwszy wiersz będzie zawierał ciąg wejściowy. Każde ipierwsze -modulo-3 pierwsze pojawienie się tej postaci będzie poruszać się w kierunku południowo-wschodnim; każde i-modulo-3 sekundy wystąpi w kierunku południowym; i każde itrzecie wystąpienie -modulo-3 będzie poruszać się w kierunku południowo-zachodnim. Będziesz kontynuował, aż znaki znów znajdą się w początkowej pozycji początkowej (co oznacza, że ​​w razie potrzeby będzie się przewijał z jednej strony na drugą), a następnie wydrukujesz ostatni wiersz z ciągiem znaków wejściowych, aby skończ to. (Zauważ, że wszystkie przypadki testowe kończą się przy początkowym wprowadzeniu co najwyżej length(input)wierszy, w tym wiersz zawierający dane końcowe. Może być jednak wcześniej, jak widać w pierwszym przypadku testowym poniżej, o długości 14, ale kończącym się po 9.)

To wszystko może być dość niejasne, więc oto przykład:

Przypadek testowy 1:

Ciąg znaków: "This_is_a_test"
Znak znaków:'s'

Wydajność:

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

Oto ten sam przypadek testowy z kolorowymi ścieżkami trzech s:

wprowadź opis zdjęcia tutaj

gdzie pierwszy 's'podąża zieloną ścieżką w kierunku południowo-wschodnim; drugi 's'podąża żółtą ścieżką w kierunku południowym; a trzeci 's'podąża jasnoniebieską ścieżką w kierunku południowo-zachodnim. (Gdyby był czwarty 's', znów poszedłby w kierunku południowo-wschodnim, co można zobaczyć w niektórych innych przypadkach testowych poniżej.)

Zasady konkursu:

  • Dane wejściowe będą zawierać tylko ASCII do wydruku (z wyłączeniem spacji, tabulatorów i nowych wierszy)
  • Formaty we / wy są elastyczne. Może być ciągiem rozdzielanym znakiem nowej linii, macierzą znaków itp. Twoje połączenie.
  • Możliwe jest, że dany znak nie jest obecny w ciągu, w którym to przypadku możesz albo wypisać ciąg wejściowy raz, albo dwa razy (tzn. "test", 'a'Możesz mieć jeden z tych, jak to możliwe: "test\ntest"/ "test").
  • Wiodące miejsca są obowiązkowe; końcowe spacje są opcjonalne. Dozwolona jest jedna lub wiele nowych / wiodących nowych linii.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe / więcej przykładów:

Przypadek testowy 2:

Ciąg znaków: "abcabcabcabcabc"
Znak znaków:'b'

Wydajność:

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

Oto ten sam przypadek testowy z kolorowymi ścieżkami pięciu a:

wprowadź opis zdjęcia tutaj

Przypadek testowy 3:

Ciąg znaków: "only_two_paths?"
Znak znaków:'o'

Wydajność:

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?

Oto ten sam przypadek testowy z kolorowymi ścieżkami dwóch o:

wprowadź opis zdjęcia tutaj

Przypadek testowy 4:

String-input: "lollollollollol"
Input character:'l'

Wydajność:

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

Oto ten sam przypadek testowy z kolorowymi ścieżkami dziesięciu l:

wprowadź opis zdjęcia tutaj

Przypadek testowy 5:

String-input: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
Input character:'C'

Wydajność:

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

Oto ten sam przypadek testowy z kolorowymi ścieżkami siedmiu C:

wprowadź opis zdjęcia tutaj

Przypadek testowy 6:

String-input: "XyX"
Input character:'X'

Wydajność:

XyX
 XX
  X
XyX

Oto ten sam przypadek testowy z kolorowymi ścieżkami dwóch X:

wprowadź opis zdjęcia tutaj

Przypadek testowy 7:

String-input: "aaaa"
Input character:'a'

Wydajność:

aaaa
aa  
aaa 
 aaa
aaaa

Oto ten sam przypadek testowy z kolorowymi ścieżkami czterech a:

wprowadź opis zdjęcia tutaj


Więc jeśli ciąg zawiera wielokrotność 3 znaku, wynik może mieć mniej wierszy niż długość ciągu?
Neil,

@ Neil Nie jestem pewien, czy to wielokrotność 3, nie badałem tego aż tak bardzo. Wiem tylko, że co najwyżej length(input)wszystko się zgadza, ale może być wcześniej, jak pokazuje pierwszy przypadek testowy. Ale wygląda na to, że rzeczywiście masz rację co do wielokrotności 3 części (chociaż nie jestem w 100% pewien).
Kevin Cruijssen

@Neil żaden ciąg znaków, w którym znak pojawia się tylko 3 razy z rzędu, wydrukuje 3 wiersze bez względu na długość
Asone Tuhid

Czy końcowe 2 linie są dozwolone między 2 drukowanymi liniami?
Asone Tuhid

@AsoneTuhid Przepraszamy, ale nie. Nie obchodzi mnie żadna ilość końcowych lub wiodących nowych wierszy przed lub po całym oczekiwanym wyniku, ale nie pozwolę pomiędzy wierszami. Linie po przekątnej również nie byłyby prawidłowe.
Kevin Cruijssen

Odpowiedzi:


1

Stax , 24 bajty

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

Uruchom i debuguj online

Jest to reprezentacja ascii tego samego programu.

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

Pobiera indeksy wszystkich postaci, a następnie mutuje je, aż zostaną ustawione na poziomie równym pierwotnym indeksom. Dla każdej zmiany wypisz ciąg znaków ze znakiem przy tych indeksach.

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 bajtów

Zastąp \0literał 0 bajtem 0, aby otrzymać 96. Zauważ, że link Try It Online ma 97 bajtów, ponieważ wydaje się, że nie można wprowadzić tam literału 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$_

Zakreślacz perlowy kod golfowy myśli #rozpocząć komentarz. Jak naiwny 😈

Wypróbuj online!

Jak to działa

$ljest licznikiem, dla którego linii po pierwszym jesteśmy (odlicza się w dół, więc np. -3 dla 3 linii poniżej górnego ciągu). Po wydrukowaniu początkowego ciągu, gdy robi to wielokrotnie.

Wyszukaj pierwszy ciąg znaków pod kątem występowania znaku docelowego i oblicz, przy jakim przesunięciu powinien się pojawić: (++$#$l%3*$l-$l+"@-")%@Fktóra jest obecna pozycja plus liczba linii (ujemna) razy -1, 0, 1(cyklicznie). Skonstruować ciąg z tym wiele razy \0, po czym charakteru docelowej i orże w akumulatorze $$l(to jest inna dla każdego akumulatora $li powód $lodlicza zamiast w górę, ponieważ $1, $2etc są tylko do odczytu). Jednocześnie $#$lodnosi się do innej tablicy za każdym razem przez pętlę. Wynikiem jest $llinia th, ale \0zamiast spacji.

Znaki docelowe w pierwszym ciągu są zastępowane przez, \0więc kończy się na oryginalnym ciągu z „dziurami” (z \0) w pierwotnych pozycjach znaku docelowego. Jeśli to zrobisz xorz akumulatorem, dziury zostaną wypełnione tylko wtedy, gdy akumulator ma znaki docelowe w oryginalnych pozycjach, więc wynikiem będzie oryginalny ciąg. Służy do zakończenia pętli. Jeśli pętla nie jest jeszcze zakończona, wydrukuj akumulator z \0zastąpionym spacją.

Kiedy pętla się kończy, -popcja ponownie drukuje pierwszy ciąg i program jest wykonywany.

Postać docelowa jest wybierana w dość trudny sposób. W ${\<>}przekształca odczytanej linii od standardowego wejścia do odniesienia, który jest następnie od razu dereferencjonowane, podstawione w wyrażeniu regularnym. \QPrefiks ucieka wszystkie znaki, które są wyjątkowe w regex (jak .i *). Jest \Eto domniemane. oModyfikator powoduje, że część wyszukiwania, aby nigdy nie zostać ponownie ocenione, ale po prostu powtarza się we wszystkich kolejnych meczów (co jest dobre, ponieważ nie ma nic na STDIN już).


Nie sądzę, że możesz bezpośrednio wstawić bajt zerowy, ale możesz uruchomić go w bash lub coś takiego.
FryAmTheEggman

@FryAmTheEggman Dzięki, to niezły unik. Ale nie sądzę, żebym zawracał sobie tym głowę. Ludzie będą musieli mi zaufać, że to działa, jeśli nie chcą tego wypróbować :-)
Ton Hospel

Całkowicie uczciwy, ale zostawię komentarz, aby ludzie mogli go zobaczyć.
Nawiasem mówiąc, fajny

4

Python 2 , 199 193 191 bajtów

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

Wypróbuj online!


Jeśli pętla może wyjść za pośrednictwem wyjątku:

Python 2 , 187 bajtów

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

Wypróbuj online!


  • -4 bajty dzięki Jonathanowi Frechowi
  • -2 bajty dzięki Lynn

Możliwe 189 bajtów (wyjście z pętli przez wyjątek).
Jonathan Frech

Możesz upuścić parę parenów (j[i]-i%3+1)%lna dwa bajty.
Lynn,

2

C (gcc) , 261 bajtów

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

Wypróbuj online!


2

JavaScript (Node.js) , 197 194 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe w składni curry, tj f(s)(c).

Wcale nie jest idealny, ale potrzebuję JS. Wiele funkcji w funkcji.


2

Rubinowy , 189 176 171 156 150 146 144 137 bajtów

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

Wypróbuj online!


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.