Buatkan aku tangga tali

24

Tangga Tali

Penafian: Ini adalah tantangan pertama yang saya usulkan. Semua dan semua umpan balik diterima. Jika ini merupakan duplikat, harap tunjukkan.

Berikut ini tautan ke pos sandbox.

Tujuan

Tujuan dari tantangan ini adalah untuk, mengingat string dan integer, mencetak string ke dalam blok dengan ukuran integer itu. Jika sebuah kata memiliki lebih banyak karakter daripada ukuran blok, cetaklah ke dalam pola "tangga" turun.

Aturan

  • "Pola tangga" yang disebutkan di atas berarti bahwa, untuk setiap blok kata yang sama, blok itu harus dimulai tepat di mana blok di atasnya berakhir. Periksa kasus uji (atau tanyakan) jika Anda memiliki pertanyaan.
  • Jika sebuah kata dipecah dalam beberapa blok, kata berikut harus dicetak dengan jumlah spasi yang memadai, yaitu, kata itu harus dipisahkan dari blok paling bawah kata sebelumnya dengan tepat satu spasi. Periksa kasus uji (atau minta) untuk klarifikasi.
  • Anda dapat mengasumsikan string input hanya akan terdiri dari karakter ASCII yang dapat dicetak. Juga, itu tidak akan memiliki beberapa spasi putih berturut-turut.
  • Anda juga dapat mengasumsikan bahwa bilangan bulat akan selalu berada dalam kisaran [1, + ∞).
  • Ruang putih atau baris baru yang tertinggal diizinkan.
  • Anda dapat menggunakan metode yang masuk akal untuk I / O.
  • Berlaku celah standar .
  • Ini adalah , jadi kode terpendek (dalam byte, per bahasa) menang. Setelah satu minggu (atau lebih), saya akan menerima jawaban tersingkat secara keseluruhan.

Uji Kasus

(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
                         !
J. Sallé
sumber
dapatkah ada jumlah ruang terdepan yang sama pada setiap baris?
dzaima
Bonus: gunakan Zalgo untuk ukuran blok-1 t̳͔̲̻̫̪ḛ͕̦̙͔̩͎͉̝̞ͅx̳͖̬̥̱͓̭̙̤͇̘̲ț͎̣̫̪̩̟̯͈͙͈̗̳͕̹̙̣ͅ
Luis Mendo
@zaza Saya tidak yakin apa yang Anda maksud dengan itu, tapi saya tidak mengerti mengapa tidak. Mau memberi contoh?
J. Sallé
@ J. Salurkan ini
dzaima
@zaza ya tentu, tidak masalah.
J. Sallé

Jawaban:

7

Arang , 22 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  θ                      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

* Lebih tepatnya, "pindah ke awal baris berikutnya dua kali, tetapi seolah-olah kanvas diputar." Sunting: Di antara tantangan yang sedang diatur dan jawaban ini diterima, Charcoal sebenarnya memperoleh cara untuk memecah string menjadi pasangan karakter, mengurangi kode 16 byte:
F⪪θ «↑⸿⸿F⪪ιIη«κ↙ Cobalah secara online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  θ                 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
Neil
sumber
Mengikuti aturan tantangan, saya telah menerima ini sebagai jawaban terpendek (per 6 Oktober 2017).
J. Sallé
3

SOGL V0.12 , 28 27 26 byte

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

Coba Di Sini!

Saya memang menerapkan sementara membuat ini, tetapi dokumentasi untuk itu ada sebelumnya.

Penjelasan:

ā                            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
dzaima
sumber
3

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

  • untuk keterbacaan menambahkan beberapa byte dalam kode dan menghapusnya dalam hitungan byte
  • bukannya s = "", j = 0 saya lakukan j = s = ""
  • bukannya for (i in s) - biasa untuk loop - dihapus 1 byte
  • menggunakan nilai yang sudah dihasilkan dalam pengindeks array - dihapus 8 byte
  • menggunakan sudah dengan nilai i = s.length (dari loop pertama) di eval - bukan panjang array nyata - menyebabkan spasi tambahan yang diizinkan
  • menggunakan peta S bukannya eval - mengurangi 3 byte
  • menggunakan fill sebagai gantinya menginisialisasi array kosong- sehingga tidak perlu untuk loop dalam hasil peta
  • bisa menggantikan || dengan | - dikurangi 2 byte
  • terima kasih kepada @Justin Mariner - ganti kemunculan == "" dengan <"!" mengurangi 2 byte
  • memindahkan kondisi dari a [I] ke pernyataan lain untuk mengurangi satu "u <"! "" - mengurangi 2 byte
  • bukannya (I + = 2, j = 0) - j =! (I + = 2) - berkurang 1 byte
  • "for of" alih-alih untuk
    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));
DanielIndie
sumber
1
Anda harus dapat menyimpan beberapa byte dengan menggunakan <"!"alih-alih ==" ".
Justin Mariner
2

C #, 200 byte

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

Di mana string ditentukan oleh i dan ukurannya ditentukan oleh s .

Misalnya

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

Pada dasarnya, bagian pertama Regex. Plit menggunakan spasi putih untuk membagi kalimat menjadi kata-kata, dan Regex. Pertandingan membagi setiap kata menjadi potongan-potongan yang ditentukan oleh s . Potongan ditulis ke posisi kursor (x, y) di mana Y diatur ke 0 untuk setiap kata baru, dan x bertambah 2 untuk potongan kata pertama dan selanjutnya (s-1) untuk setiap potongan.

x memulai kehidupannya di -2 untuk memastikan penggunaan pertama kali diatur ke 0.

Saya tidak cukup berpengetahuan di C # trivia untuk bisa membuatnya lebih kecil, tetapi saya curiga itu mungkin.

supermeerkat
sumber
2
Ada alasan khusus mengapa Anda menggunakan s untuk int, dan saya untuk string, bukan sebaliknya?
Tahg
Ha ha! Tidak tahu - hanya pembuang waktu cepat di istirahat makan siang saya. I untuk input dan s untuk ukuran, mungkin?
supermeerkat
1

Python 2 , 203 199 byte

s,l=input()
S=s.split()
x=[]
for w in S:L=len(w);W=[i/l*~-l*' '+w[i:i+l]for i in range(0,L,l)];x+=[[c.ljust(L/l*~-l+L%l)for c in W+['']*len(s)]]
for l in zip(*x):
 L=' '.join(l)
 if L.strip():print L

Cobalah online!

TFeld
sumber
' '*(i/l*(l-1))bisa i/l*~-l*' '.
Jonathan Frech
202 byte .
Jonathan Frech
1

Perl 5, 59 byte

55 byte kode + 4 untuk -ai.

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

Catatan: huruf \x1bs adalah ESCkarakter literal , tetapi lolos di sini untuk menyalin dan menempel dengan mudah.

Skrip ini menggunakan urutan pelarian ANSI dan membutuhkan input melalui -iflag yang tidak standar. Jika salah satu dari ini tidak dapat diterima, beri tahu saya dan saya akan memperbarui.

Contoh berjalan

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
                      !
Dom Hastings
sumber