Başladığımız yerde bitti!…


29

Meydan okuma:

Giriş:

İki giriş alırsınız:
- Yalnızca yazdırılabilir ASCII içeren bir dize (boşluklar, sekmeler veya yeni satırlar hariç)
- Yazdırılabilir bir ASCII karakteri

Çıktı:

İlk satır, dize girişini içerecektir. Her i-modulo-3 bu karakterin ilk oluşumunda Güney-Doğu yönünde hareket eder; her i-modulo-3 saniyelik bir oluşum Güney yönünde hareket eder; ve her i-modulo-3 üçüncü olay, Güney-Batı yönünde hareket edecektir. Karakterler tekrar başlangıçtaki başlangıç ​​pozisyonuna gelinceye kadar devam edersiniz (yani, gerekirse bir taraftan diğer tarafa dolanacaktır) ve sonra dize girişiyle son satırı tekrar yazdıracaksınız. bitir şunu. (Tüm test durumlarının length(input), takip girişini içeren satır da dahil olmak üzere çoğu satırdan sonra ilk girişlerinde sona ereceğine dikkat edin . Aşağıdaki ilk test durumunda da görüldüğü gibi, ancak uzunluğu 14 olan ancak daha erken olabilir. 9.)

Bunların hepsi oldukça belirsiz olabilir, bu yüzden burada bir örnek:

Test durumu 1:

String girişi: "This_is_a_test"
Karakter girişi:'s'

Çıktı:

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

İşte üçün renkli yolları ile aynı test durumu s:

görüntü tanımını buraya girin

ilki 's', güneydoğu yönünde yeşil yolu izler; ikincisi 's'sarı yolu Güney yönünde izler; Üçüncüsü 's'de açık mavi yolu Güneybatı yönünde takip ediyor. (Eğer dördüncü bir 's'şey olacaksa, aşağıdaki diğer test vakalarının bazılarında görülebilecek bir şekilde tekrar Güneydoğu yönünde ilerleyecektir.)

Meydan okuma kuralları:

  • Girişler yalnızca yazdırılabilir ASCII içerecektir (boşluklar, sekmeler ve yeni satırlar hariç)
  • G / Ç formatları esnektir. Yeni bir satır ayrılmış dize, karakter matrisi vb. Olabilir. Aramanız.
  • Belirtilen karakterin dizgede bulunmaması mümkündür; bu durumda giriş dizgisini bir veya iki kez çıktılamanıza izin verilir (yani "test", 'a', bunlardan herhangi birini mümkün çıktı olarak alabilir: "test\ntest"/ "test").
  • Ana boşluklar zorunludur; arka boşluklar isteğe bağlıdır. Bir veya daha fazla satır başı / sondaki yeni satırlara izin verilir.

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT fonksiyonlarını, uygun parametrelerle fonksiyonlarını ve geri dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen gerekirse bir açıklama ekleyin.

Test durumları / daha fazla örnek:

Test durumu 2:

String girişi: "abcabcabcabcabc"
Karakter girişi:'b'

Çıktı:

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

İşte beşin renkli yolları ile aynı test durumu a:

görüntü tanımını buraya girin

Test durumu 3:

String girişi: "only_two_paths?"
Karakter girişi:'o'

Çıktı:

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?

İşte iki renkli yol ile aynı test durumu o:

görüntü tanımını buraya girin

Test durumu 4:

String girişi: "lollollollollol"
Karakter girişi:'l'

Çıktı:

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

İşte on renkli yolları ile aynı test örneği l:

görüntü tanımını buraya girin

Test durumu 5:

String girişi: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
Karakter girişi:'C'

Çıktı:

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

İşte yedi renkli yol ile aynı test durumu C:

görüntü tanımını buraya girin

Test durumu 6:

String girişi: "XyX"
Karakter girişi:'X'

Çıktı:

XyX
 XX
  X
XyX

İşte iki renkli yol ile aynı test durumu X:

görüntü tanımını buraya girin

Test durumu 7:

String girişi: "aaaa"
Karakter girişi:'a'

Çıktı:

aaaa
aa  
aaa 
 aaa
aaaa

İşte dört renkli yollar ile aynı test durumu a:

görüntü tanımını buraya girin


Dize, karakterin 3'ünün bir çoğunu içerdiğinde, çıktı dizenin uzunluğundan daha az sayıda sıraya sahip olabilir?
Neil

@ Neil 3'ün katı olup olmadığından emin değilim, o kadar fazla araştırma yapmadım. Tek bildiğim, çoğu length(input)şeyin her şeyin yeniden eşleştiği, ancak ilk test durumunun kanıtladığı kadar erken olabilir. Fakat% 100 emin olmasam da gerçekten de 3 bölümün katları hakkında haklısınız.
Kevin Cruijssen

@Neil, arka arkaya yalnızca 3 kez görünen karakteri olan herhangi bir dize 3 satır
basacak

2 satır arasında takip eden yeni satırlara izin verilir mi?
Asone Tuhid

@AsoneTuhid Üzgünüm ama hayır. Beklenen çıktının tamamı öncesinde veya sonrasında herhangi bir miktarda iz veya yeni satır olması umrumda değil, ancak satırlar arasında izin vermem. Köşegen çizgiler artık doğru olmaz ..
Kevin Cruijssen

Yanıtlar:


1

Stax , 24 bayt

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

Çevrimiçi çalıştırın ve hata ayıklayın

Bu aynı programın ascii temsilidir.

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

Tüm karakterin endekslerini alır ve sonra orijinal endekslere eşit olarak ayarlanana kadar onları değiştirir. Her değişiklik için, bu endekslerde karakterli bir dizge çıktılar.

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 bayt

\096 almak için değişmez 0 baytla değiştirin. Çevrimiçi Deneyin bağlantısının 97 bayt olduğuna dikkat edin, çünkü orada değişmez 0 karakter girilmesi mümkün görünmüyor.

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

Golf perl vurgulayıcı kodu #bir yorum başlattığını düşünüyor . Ne kadar saf 😈

Çevrimiçi deneyin!

Nasıl çalışır

$lilk bizden sonra hangi satırın açık olduğu bir sayaçtır (yine de sayılır, yani örneğin üst dizginin altındaki 3 satır için -3). İlk dizgiyi tekrar tekrar yazdırdıktan sonra yazdırdıktan sonra.

İlk karakter dizisini hedef karakterin oluşumları için araştırın ve hangi ofsetin görünmesi gerektiğini hesaplayın: (++$#$l%3*$l-$l+"@-")%@Fbu, geçerli konum artı satır numarası (negatif) kez -1, 0, 1(döngüsel). O birçok kez bir dize Construct \0hedef karakteri ve ardından orbir akümülatör içine $$l(her biri için farklı akümülatör olduğunu $lve neden $lsayar aşağı yerine çünkü yukarı $1, $2vb salt okunur). Aynı $#$landa döngü boyunca her seferinde farklı bir diziyi ifade eder. Sonuç, $linci çizgidir ancak\0 boşluk yerine.

İlk dizgideki hedef çizelgeler yerine geçer, \0böylece hedef dizinin \0asıl pozisyonlarında "delikleri" (ile ) olan orijinal dizge ile bitersiniz . Eğer xorakümülatör ile delikler doldurulursa, ve eğer akümülatör orijinal pozisyonlarında hedef karakterlere sahipse, sonuçta orijinal string olacaktır. Bu, döngüyü sonlandırmak için kullanılır. Döngü henüz bitmediyse akümülatörü \0boşlukla değiştirerek yazdırın .

Döngü sona erdiğinde, -pseçenek bir kez daha ilk dizgiyi yazdırır ve program yapılır.

Hedef karakter oldukça zor bir şekilde yakalandı. ${\<>}Dönüştürür bir çizgi sonra hemen duruma gelmiş ve düzenli ifade ikame edilen bir referans STDIN'den okuyun. \QÖnek bir regex (gibi özel olan tüm karakterleri kaçar .ve *). Bu \Eörtülüdür. oDeğiştirici arama kısmı tekrar değerlendirilir ama sadece (STDIN artık hiçbir şey olmadığından hangi iyidir) sonraki tüm maçlarda tekrarlanması asla neden olur.


Doğrudan boş bir bayt koyabileceğinizi sanmıyorum, ancak bash veya başka bir şeyle çalıştırabilirsiniz .
FryAmTheEggman

@FryAmTheEggman Teşekkürler, bu güzel bir kaçış. Ama rahatsız edeceğimi sanmıyorum. İnsanlar sadece kendileri denemek istemiyorlarsa işe yarayacaklarına güvenmek zorunda olacaklar :-)
Ton Hospel

Tamamen adil, ancak yorum yapıp insanların görebilmesi için bırakacağım. Güzel golf, bu arada :)
FryAmTheEggman

4

Python 2 , 199 193 191 bayt

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

Çevrimiçi deneyin!


Döngü istisna yoluyla çıkabiliyorsa:

Python 2 , 187 bayt

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

Çevrimiçi deneyin!


  • Jonathan Frech sayesinde -4 bayt
  • Lynn sayesinde -2 bayt

Olası 189 bayt (bir istisna aracılığıyla döngüden çıkma).
Jonathan Frech

(j[i]-i%3+1)%lİki bayt için bir çift ebeveyne bırakabilirsiniz .
Lynn

2

C (gcc) , 261 bayt

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

Çevrimiçi deneyin!


2

JavaScript (Node.js) , 197 194 bayt

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

Çevrimiçi deneyin!

Körleme sözdiziminde girdileri alır, yani f(s)(c).

Mükemmel bir tane değil, ama JS'ye ihtiyacım var. İşlevde bir çok işlev var.


2

Ruby , 189 176 171 156 150 146 144 137 bayt

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

Çevrimiçi deneyin!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.