Kami berakhir di tempat kami mulai! ...


29

Tantangan:

Memasukkan:

Anda mengambil dua input:
- Sebuah string yang hanya berisi ASCII yang dapat dicetak (tidak termasuk spasi, tab, atau baris baru)
- Karakter ASCII yang dapat dicetak

Keluaran:

Baris pertama akan berisi string-input. Setiap ikemunculan pertama -modulo-3 dari karakter ini akan bergerak ke arah Tenggara; setiap i-modulo-3 detik akan bergerak ke arah Selatan; dan setiap ikejadian ketiga -modulo-3 akan bergerak ke arah Barat Daya. Anda akan melanjutkan sampai karakter akan berada pada posisi awal awal mereka lagi (yang berarti akan membungkus dari satu sisi ke sisi lain jika perlu), dan kemudian Anda akan mencetak baris terakhir dengan string-input lagi ke selesaikan itu. (Perhatikan bahwa semua kasus uji akan berakhir pada input awal setelah paling banyak length(input)baris, termasuk baris yang mengandung input tambahan. Akan lebih cepat, seperti yang terlihat dalam kasus uji pertama di bawah ini, dengan panjang 14, tetapi berakhir setelah 9.)

Ini semua mungkin sangat kabur, jadi di sini sebuah contoh:

Uji kasus 1:

Input string: Input "This_is_a_test"
karakter:'s'

Keluaran:

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

Ini adalah test case yang sama dengan jalur berwarna ketiganya s:

masukkan deskripsi gambar di sini

di mana yang pertama 's'mengikuti jalur hijau di arah Tenggara; yang kedua 's'mengikuti jalur kuning ke arah Selatan; dan yang ketiga 's'mengikuti jalur biru muda ke arah Barat Daya. (Jika akan ada yang keempat 's'itu akan pergi ke arah Tenggara lagi, yang dapat dilihat dalam beberapa kasus uji lainnya di bawah ini.)

Aturan tantangan:

  • Input hanya akan berisi ASCII yang dapat dicetak (tidak termasuk spasi, tab, dan baris baru)
  • Format I / O fleksibel. Dapat berupa string yang dibatasi baris baru, matriks karakter, dll. Panggilan Anda.
  • Ada kemungkinan bahwa karakter yang diberikan tidak ada dalam string, dalam hal ini Anda diizinkan untuk output-string input sekali atau dua kali (yaitu "test", 'a'dapat memiliki salah satu dari ini sebagai output yang mungkin: "test\ntest"/ "test").
  • Ruang pemimpin adalah wajib; spasi tambahan adalah opsional. Satu atau beberapa baris baru yang mengarah / tertinggal diizinkan.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Uji kasus / lebih banyak contoh:

Uji kasus 2:

Input string: Input "abcabcabcabcabc"
karakter:'b'

Keluaran:

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

Berikut ini adalah kasus uji yang sama dengan jalur berwarna lima a:

masukkan deskripsi gambar di sini

Uji kasus 3:

Input string: Input "only_two_paths?"
karakter:'o'

Keluaran:

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?

Ini adalah test case yang sama dengan jalur berwarna keduanya o:

masukkan deskripsi gambar di sini

Uji kasus 4:

Input string: "lollollollollol"
Input karakter:'l'

Keluaran:

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

Berikut ini adalah kasus uji yang sama dengan jalur berwarna sepuluh l:

masukkan deskripsi gambar di sini

Uji kasus 5:

Input string: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
Input karakter:'C'

Keluaran:

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

Ini adalah test case yang sama dengan jalur berwarna ketujuh C:

masukkan deskripsi gambar di sini

Uji kasus 6:

Input string: "XyX"
Input karakter:'X'

Keluaran:

XyX
 XX
  X
XyX

Ini adalah test case yang sama dengan jalur berwarna keduanya X:

masukkan deskripsi gambar di sini

Uji kasus 7:

Input string: "aaaa"
Input karakter:'a'

Keluaran:

aaaa
aa  
aaa 
 aaa
aaaa

Ini adalah test case yang sama dengan jalur berwarna dari empat a:

masukkan deskripsi gambar di sini


Jadi ketika string berisi kelipatan 3 karakter, output mungkin memiliki lebih sedikit baris daripada panjang string?
Neil

@Neil Saya tidak yakin apakah ini kelipatan 3, belum pernah menginvestigasinya sebanyak itu. Yang saya tahu adalah bahwa paling banyak length(input)semuanya cocok lagi, tetapi bisa lebih cepat setelah ujian pertama terbukti. Tapi sepertinya Anda memang benar tentang kelipatan 3 bagian (walaupun saya tidak 100% yakin).
Kevin Cruijssen

@Neil string apa pun dengan karakter yang hanya muncul 3 kali berturut-turut akan mencetak 3 baris
berapa pun panjangnya

Apakah membuntuti garis baru diperbolehkan antara 2 garis yang dicetak?
Asone Tuhid

@AsoneTuhid Maaf tapi tidak. Saya tidak peduli tentang jumlah trailing atau memimpin baris baru sebelum atau setelah seluruh output yang diharapkan, tapi saya tidak akan membiarkan di antara baris. Garis-garis diagonal tidak akan benar lagi juga ..
Kevin Cruijssen

Jawaban:


1

Stax , 24 byte

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

Jalankan dan debug secara online

Ini adalah representasi ascii dari program yang sama.

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

Itu mendapatkan indeks semua karakter, dan kemudian bermutasi sampai mereka set-bijaksana sama dengan indeks asli. Untuk setiap perubahan, buat string dengan karakter di indeks tersebut.

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

Ganti \0dengan 0 byte literal untuk mendapatkan 96. Perhatikan bahwa tautan Try It Online memiliki 97 byte karena tampaknya tidak mungkin untuk memasukkan karakter 0 literal di sana.

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

Kode golf perl highlighter dianggap #memulai komentar. Betapa naifnya 😈

Cobalah online!

Bagaimana itu bekerja

$ladalah penghitung untuk baris mana setelah yang pertama kita aktif (menghitung mundur, jadi misalnya -3 untuk 3 baris di bawah string teratas). Setelah mencetak string awal setelah berulang kali melakukan hal berikut.

Cari string pertama untuk kemunculan karakter target dan hitung (++$#$l%3*$l-$l+"@-")%@Fkapan offset itu akan muncul: yang merupakan posisi saat ini ditambah nomor baris (negatif) kali -1, 0, 1(siklik). Bangun sebuah string dengan yang berkali-kali \0diikuti oleh karakter target dan oritu menjadi akumulator $$l(yang merupakan akumulator yang berbeda untuk masing-masing $ldan alasannya $lmundur bukannya naik karena $1, $2dll hanya baca-saja). Simularly $#$lmengacu pada array yang berbeda setiap kali melalui loop. Hasilnya adalah $lgaris th tetapi dengan \0bukannya spasi.

Karakter target di string pertama diganti oleh \0sehingga Anda berakhir dengan string asli dengan "lubang" (dengan \0) di posisi asli karakter target. Jika Anda xorbahwa dengan akumulator lubang diisi jika dan hanya jika akumulator memiliki karakter target di posisi asli, sehingga hasilnya akan menjadi string asli. Itu digunakan untuk mengakhiri loop. Jika loop belum selesai, cetak akumulator dengan \0diganti dengan spasi.

Ketika loop berakhir -popsi sekali lagi mencetak string pertama dan program selesai.

Karakter target diambil dengan cara yang agak rumit. The ${\<>}mualaf garis membaca dari STDIN ke referensi yang kemudian segera dereferenced dan diganti di regex. The \Qawalan lolos semua karakter yang khusus dalam regex (seperti .dan *). Ini \Etersirat. The opengubah menyebabkan bagian pencarian untuk tidak pernah dievaluasi lagi tapi hanya mengulangi di semua pertandingan berikutnya (yang baik karena tidak ada di STDIN lagi).


Saya tidak berpikir Anda bisa meletakkan byte nol secara langsung, tetapi Anda bisa menjalankannya di bash atau sesuatu.
FryAmTheEggman

@FryAmTheEggman Terima kasih, itu penghindaran yang bagus. Tapi saya pikir saya tidak akan repot-repot. Orang-orang hanya perlu mempercayai saya bahwa itu akan berhasil jika mereka tidak ingin mencobanya sendiri :-)
Ton Hospel

Sepenuhnya adil, tetapi saya akan meninggalkan komentar sehingga orang dapat melihatnya. Golf yang bagus, omong-omong :)
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))

Cobalah online!


Jika loop dapat keluar melalui pengecualian:

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

Cobalah online!


  • -4 byte terima kasih kepada Jonathan Frech
  • -2 byte terima kasih kepada Lynn

Kemungkinan 189 byte (keluar dari loop melalui pengecualian).
Jonathan Frech

Anda dapat menjatuhkan sepasang parens dalam (j[i]-i%3+1)%ldua 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);}

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

Cobalah online!

Mengambil input dalam sintaks currying, yaitu f(s)(c).

Sama sekali tidak sempurna, tapi saya butuh JS. Banyak fungsi dalam fungsinya.


2

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

Cobalah online!


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.