Bana birkaç tel merdiven yap


24

Dize Merdivenleri

Feragatname: Bu benim önerdiğim ilk zorluktur. Herhangi bir ve tüm görüşlerinizi bekliyoruz. Bu bir kopya ise, lütfen işaretleyin.

İşte sanal posta postasına bir link.

Hedef

Bu zorluğun amacı, bir dizge ve bir tamsayı verildiğinde, dizgiyi bu tamsayının boyutundaki bloklara yazdırmaktır. Bir kelimenin blok boyutundan daha fazla karakteri varsa, azalan bir "merdiven" desenine yazdırın.

kurallar

  • Yukarıda belirtilen "merdiven düzeni", aynı kelimenin her bloğu için, o bloğun tam olarak üstündeki bloğun bittiği yerde başlaması gerektiği anlamına gelir. Herhangi bir sorunuz varsa test senaryosunu kontrol edin (veya sorun).
  • Bir kelime birden fazla blokta kesilirse, aşağıdaki kelime yeterli sayıda boşlukla basılmalıdır, yani bir önceki kelimenin en alttaki bloğundan bir boşlukla ayrılmalıdır. Test durumlarını kontrol edin (veya açıklama isteyin).
  • Giriş dizesinin yalnızca yazdırılabilir ASCII karakterlerinden oluşacağını varsayabilirsiniz. Ayrıca, art arda birden fazla boşluk içermez.
  • Tamsayının her zaman [1, + ∞) aralığında olacağını da varsayabilirsiniz.
  • İzleyen boşluk veya yeni satırlara izin verilir.
  • Herhangi bir makul yöntemi G / Ç için kullanabilirsiniz .
  • Standart Loopholes uygulanır.
  • Bu , yani en kısa kod (dil başına bayt cinsinden) kazanır. Bir hafta sonra (ya da öylesine) genel en kısa cevabı kabul edeceğim.

Test Kılıfları

(String, Integer) => (Output)

"This is a large string", 3 => Thi is a lar  str
                                 s        ge   ing

"This is an even larger string!", 2 => Th  is an ev  la   st
                                        is        en  rg   ri
                                                       er   ng
                                                             !
"Ooooh dear, what a big string you have!", 3 
=> Ooo  dea  wha a big str   you hav
     oh   r,   t         ing       e!

"Staphylococcus saprophyticus", 4 => Stap        sapr
                                        hylo        ophy
                                           cocc        ticu
                                              us          s

"I hope you find this challenge interesting", 2
=> I ho  yo fi  th  ch    in
      pe  u  nd  is  al    te
                      le    re
                       ng    st
                        e     in
                               g

"Well, this test case looks kinda pointless now doesn't it?", 15
=> Well, this test case looks kinda pointless now doesn't it?

"This one looks a lot more interesting!", 1 => T o l a l m i
                                               h n o   o o n
                                               i e o   t r t
                                               s   k     e e
                                                   s       r
                                                           e
                                                           s
                                                           t
                                                           i
                                                           n
                                                           g
                                                           !
"Keep in mind, people: 'Punctuation! Does! Matter!'", 2
=> Ke  in mi  pe   'P      Do  Ma
    ep     nd  op   un      es  tt
            ,   le   ct      !   er
                 :    ua          !'
                       ti
                        on
                         !

Her satırda eşit miktarda öncü boşluk olabilir mi?
dzaima

Bonus: Zalgo'yu blok boyutu-1 t̳͔̲̻̫̪ḛ͕̦̙͔̩͎͉̝̞ͅx̳͖̬̥̱͓̭̙̤͇̘̲ț͎̣̫̪̩̟̯͈͙͈̗̳͕̹̙̣ͅ için kullanın
Luis Mendo

@ dzaima Bununla ne demek istediğinizi anlamadım ama neden olmadığını anlamadım. Örnek vermek ister misin?
J. Sallé

@ J.Salle this
dzaima

@ dzaima evet, sorun değil.
J. Sallé

Yanıtlar:


7

Kömür , 22 bayt

F⪪θ «↑⸿⸿FLι«M¬﹪κIη↙§ικ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

  θ                      First input
 ⪪                      Split on spaces
F   «                   Loop over each word
     ↑⸿⸿                Move the cursor to the top row and two columns right*
          ι             Current word
         L              Length
        F  «            Loop over implicit range
               κ        Current index
                 η      Second input
                I       Cast to integer
              ﹪         Modulo
             ¬          Logical not
            M     ↙     Move that many characters down and left
                    ι   Current word
                     κ  Current index
                   §    Index into word and implicitly print

* Daha doğrusu, "iki kez bir sonraki satırın başlangıcına hareket et, sanki tuval döndürülmüş gibi." Düzenleme: Bu meydan okuma ile bu cevap kabul edilen arasında, Charcoal aslında bir dizgiyi karakter çiftlerine ayırmanın bir yolunu edindi, kod 16 baytı azalttı:
F⪪θ «↑⸿⸿F⪪ιIη«κ↙ Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

  θ                 First input
 ⪪                  Split on spaces
F   «               Loop over each word
     ↑⸿⸿            Move the cursor to the top row and two columns right
          ι         Current wordIη
            η       Second input
           I        Cast to integer
         ⪪          Split into substrings of that length
        F    «      Loop over each substring
              κ     Print the substring
               ↙    Move the cursor down and left

Meydan okuma kurallarına uyarak bunu en kısa cevap olarak kabul ettim (6 Ekim 2017 itibariyle).
J. Sallé

3

SOGL V0.12 , 28 27 26 bayt

ā,θ{0Eā;{ēb÷eb‰⁴bH*+I;Iž}┼

Burada dene!

Bunu yaparken uygulamıştım , ancak bunun belgeleri daha önce vardı.

Açıklama:

ā                            push an empty array - the main canvas
 ,                           push the first input
  θ{                         for each word (pushing the word each time)
    0E                         set the variable E to 0
      ā;                       below the current word place an empty array - current word canvas
        {               }      for each character of the word
         ēb÷                     push (E++ // B) - note that E is incremented after being used
            eb‰                  push E positive modulo B - like regular modulo but in the 0 output case it gives B
               ⁴                 duplicate the item below ToS
                bH               push B-1
                  *              multiply [(E++ // B) and B-1]
                   +             add [that multiplication to E‰B] - current letters X position
                    I            increase the X position to have one leading space row
                     ;           swap top 2 items - current X position and (E++ // B)
                      I          increase to create current letters Y position
                       ž         in those positions insert the current letter in the current words canvas
                         ┼     append to main canvas current word canvas horizontally

3

Javascript ES6, 187 183 174 166 163 148 145 145 145 143 141 140 138 bayt

  • okunabilirlik için koda bazı baytlar eklendi ve bayt sayısında bunları kaldırın.
  • s = "" yerine, j = 0, j = s = "" yaptım
  • Bunun yerine (i s) - döngü için düzenli - 1 bayt kaldırıldı
  • dizinin indeksleyicilerinde zaten üretilen değerleri kullanarak - 8 byte kaldırıldı
  • zaten değerlendirmede i = s.length (ilk döngüden) değerinin kullanılması - gerçek dizi uzunluğu yerine - izin verilen takip alanına neden olur
  • eval yerine S haritasının kullanılması - 3 bayt azalır
  • boş diziyi başlatmak yerine dolgu kullan - böylece harita sonucundaki ilmeğe gerek kalmaz
  • yerini alabilir || ile | - 2 bayt azaldı
  • @Justin Mariner sayesinde - olayları değiştirin == "" <"!" ile 2 bayt azaltır
  • bir "u <"! "" azaltmak için koşulları a [I] 'den diğer ifadeye taşıdı - 2 bayt azaltır
  • yerine (I + = 2, j = 0) - j =! (I + = 2) - 1 bayt azaltıldı
  • yerine "yerine" yerine
    F=(s,n)=>{R=[I=j=i=0]
    for(u of s)
    a=R[z=u<"!"?j=!(I+=2):(j%n&&I++,j++/n|0)]=R[z]||[...s].fill` `,a[I]=u
    return R.map(x=>x.join``).join`
    `}
    console.log(F("This is a large string", 3));
    console.log(F("This is an even larger string!", 2));
    console.log(F("Ooooh dear, what a big string you have!", 3));
    console.log(F("Staphylococcus saprophyticus", 4));
    console.log(F("I hope you find this challenge interesting", 2));
    console.log(F("Well, this test case looks kinda pointless now doesn't it?", 15));
    console.log(F("This one looks a lot more interesting!", 1))
    console.log(F("Keep in mind, people: 'Punctuation! Does! Matter!'", 2));

1
Bunun <"!"yerine birkaç bayt kaydedebilmelisiniz ==" ".
Justin Mariner

2

C #, 200 bayt

int x=-2,y=0;Regex.Split(i,@"\s+").ToList().ForEach(w =>{y=0;Regex.Matches(w,".{0,"+s+"}").Cast<Match>().ToList().ForEach(c=>{x+=(y==0?2:s-1);Console.SetCursorPosition(x,y);Console.Write(c);y++;});});

Dize i ile belirtilirse ve boyut s ile belirtilir .

Örneğin

string i = "Staphylococcus saprophyticus";
int s = 2;    
int x=-2,y=0;Regex.Split(i,@"\s+").ToList().ForEach(w =>{y=0;Regex.Matches(w,".{0,"+s+"}").Cast<Match>().ToList().ForEach(c=>{x+=(y==0?2:s-1);Console.SetCursorPosition(x,y);Console.Write(c);y++;});});

Temel olarak, ilk kısım Regex.Split , cümleyi sözcüklere ayırmak için beyaz boşluklar kullanır ve Regex.Matches , her kelimeyi s ile belirtilen parçalara böler . Öbek, her yeni kelime için Y'nin 0'a ayarlandığı İmleç konumuna (x, y) yazılır ve bir kelimenin ilk öbeği için x, ardından her öbek için (s-1) x artırılır.

x, ilk kullanımının 0 olarak ayarlandığından emin olmak için ömrünü -2 olarak başlatır.

C # ıvır zıvır şeyler içinde daha küçük hale getirmek için yeterince bilgili değilim, ancak muhtemelen olabileceğinden şüpheleniyorum.


2
S'yi bir int için kullanmanın ve bunun yerine bir dize için kullanmamın özel bir nedeni var mı?
Tahg

Ha ha! Hiç bir fikrim yok - öğle tatilinde hızlıca zaman kaybı oldu. Giriş ve s boyutu, belki de?
supermeerkat


1

Perl 5, 59 bayt

İçin 55 bayt kodu + 4 -ai.

$-=s/.{$^I}\K(?=.)/\x1b[1B\x1b[1D/g,print$_,"\x1b[1A"x$-,$"for@F

Not: \x1bs hazır bilgi ESCkarakterleridir, ancak kolayca kopyalayıp yapıştırmak için buraya kaçtı.

Bu komut dosyası ANSI çıkış dizilerini kullanır ve -istandart olmayan bayrak üzerinden giriş yapılmasını gerektirir . Bunlardan herhangi biri kabul edilebilir değilse, lütfen bana bildirin, ben de güncellenirim.

Örnek çalıştırmalar

perl -ai3 string-stairs.pl <<< 'This is a large string' 2>/dev/null
Thi is a lar  str   
  s        ge   ing

perl -ai2 string-stairs.pl <<< 'This is an even larger string!' 2>/dev/null
Th  is an ev  la   st   
 is        en  rg   ri
                er   ng
                      !

perl -ai3 string-stairs.pl <<< 'Ooooh dear, what a big string you have!' 2>/dev/null
Ooo  dea  wha a big str   you hav  
  oh   r,   t         ing       e!

perl -ai4 string-stairs.pl <<< 'Staphylococcus saprophyticus' 2>/dev/null
Stap        sapr       
   hylo        ophy
      cocc        ticu
         us          s

perl -ai2 string-stairs.pl <<< 'I hope you find this challenge interesting' 2>/dev/null
I ho  yo fi  th  ch    in     
   pe  u  nd  is  al    te
                   le    re
                    ng    st
                     e     in
                            g

perl -ai15 string-stairs.pl <<< "Well, this test case looks kinda pointless now doesn't it?" 2>/dev/null
Well, this test case looks kinda pointless now doesn't it? 

perl -ai1 string-stairs.pl <<< 'This one looks a lot more interesting!' 2>/dev/null
T o l a l m i 
h n o   o o n
i e o   t r t
s   k     e e
    s       r
            e
            s
            t
            i
            n
            g
            !

perl -ai2 string-stairs.pl <<< "Keep in mind, people: 'Punctuation! Does! Matter!'" 2>/dev/null
Ke  in mi  pe   'P       Do   Ma    
 ep     nd  op   un       es   tt
         ,   le   ct       !    er
              :    ua            !'
                    ti
                     on
                      !
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.