Xây dựng cho tôi một số cầu thang chuỗi


24

Chuỗi cầu thang

Tuyên bố từ chối trách nhiệm: Đây là thử thách đầu tiên tôi đề xuất. Bất kỳ và tất cả thông tin phản hồi đều được chào đón. Nếu đây là một bản sao, xin vui lòng chỉ ra.

Đây là một liên kết đến bài sandbox.

Mục tiêu

Mục tiêu của thử thách này là, đưa ra một chuỗi và một số nguyên, in chuỗi thành các khối có kích thước của số nguyên đó. Nếu một từ có nhiều ký tự hơn kích thước của một khối, hãy in nó thành một mẫu "cầu thang" giảm dần.

Quy tắc

  • "Mẫu cầu thang" được đề cập ở trên có nghĩa là, đối với mỗi khối của cùng một từ, khối đó phải bắt đầu chính xác nơi khối phía trên nó kết thúc. Kiểm tra các trường hợp kiểm tra (hoặc hỏi) nếu bạn có bất kỳ câu hỏi.
  • Nếu một từ bị phá vỡ trong nhiều khối, từ sau phải được in với số lượng khoảng trống đầy đủ, nghĩa là, nó phải được tách ra khỏi khối thấp nhất của từ trước đó bằng chính xác một khoảng trắng. Kiểm tra các trường hợp thử nghiệm (hoặc yêu cầu) để làm rõ.
  • Bạn có thể giả sử chuỗi đầu vào sẽ chỉ bao gồm các ký tự ASCII có thể in được. Ngoài ra, nó sẽ không có nhiều khoảng trắng liên tiếp.
  • Bạn cũng có thể giả sử rằng số nguyên sẽ luôn nằm trong phạm vi [1, +).
  • Trailing khoảng trắng hoặc dòng mới được cho phép.
  • Bạn có thể sử dụng bất kỳ phương pháp hợp lý nào cho I / O.
  • Áp dụng sơ hở tiêu chuẩn .
  • Đây là , vì vậy mã ngắn nhất (tính bằng byte, trên mỗi ngôn ngữ) sẽ thắng. Sau một tuần (hoặc hơn), tôi sẽ chấp nhận câu trả lời ngắn nhất.

Các trường hợp thử nghiệm

(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
                         !

có thể có một số lượng bằng nhau của không gian hàng đầu trên mỗi dòng?
dzaima

Phần thưởng: sử dụng Zalgo cho kích thước khối-1 t̳͔̲̻̫̪ḛ͕̦̙͔̩͎͉̝̞ͅx̳͖̬̥̱͓̭̙̤͇̘̲ț͎̣̫̪̩̟̯͈͙͈̗̳͕̹̙̣ͅ
Luis Mendo

@dzaima Tôi không chắc ý của bạn là gì, nhưng tôi không hiểu tại sao không. Muốn đưa ra một ví dụ?
J. Sallé

@ J.Salle này
dzaima

@dzaima vâng chắc chắn, không vấn đề gì.
J. Sallé

Câu trả lời:


7

Than , 22 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

  θ                      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

* Chính xác hơn, "di chuyển đến đầu dòng tiếp theo hai lần, nhưng như thể khung vẽ đã được xoay." Chỉnh sửa: Ở giữa thử thách này được đặt ra và câu trả lời này được chấp nhận, Char than thực sự có được một phương tiện chia một chuỗi thành các cặp ký tự, giảm mã 16 byte:
F⪪θ «↑⸿⸿F⪪ιIη«κ↙ Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

  θ                 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

Theo các quy tắc thử thách, tôi đã chấp nhận đây là câu trả lời ngắn nhất (kể từ ngày 6 tháng 10 năm 2017).
J. Sallé

3

SOGL V0.12 , 28 27 26 byte

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

Hãy thử nó ở đây!

Tôi đã thực hiện trong khi thực hiện điều này, nhưng tài liệu cho nó đã tồn tại trước đó.

Giải trình:

ā                            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 143 141 140 138 byte

  • để dễ đọc đã thêm một số byte trong mã và loại bỏ chúng trong số byte
  • thay vì s = "", j = 0 tôi đã làm j = s = ""
  • thay vì for (i in s) - vòng lặp thông thường - đã xóa 1 byte
  • sử dụng các giá trị đã được tạo trong bộ chỉ mục của mảng - loại bỏ 8 byte
  • sử dụng đã có giá trị i = s.length (từ vòng lặp đầu tiên) trong eval - thay vì độ dài mảng thực - gây ra không gian dấu được phép
  • sử dụng bản đồ của S thay vì eval - giảm 3 byte
  • sử dụng điền thay vì khởi tạo mảng trống- vì vậy không cần vòng lặp trong kết quả bản đồ
  • có thể thay thế | | với | - giảm 2 byte
  • cảm ơn @Justin Mariner - thay thế lần xuất hiện == "" bằng <"!" giảm 2 byte
  • đã chuyển các điều kiện từ [I] sang câu lệnh khác để giảm một "u <"! "" - giảm 2 byte
  • thay vì (I + = 2, j = 0) - j =! (I + = 2) - giảm 1 byte
  • "cho" thay vì cho
    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
Bạn sẽ có thể lưu một vài byte bằng cách sử dụng <"!"thay vì ==" ".
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++;});});

Trong đó chuỗi được chỉ định bởi i và kích thước được chỉ định bởi s .

Ví dụ

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

Về cơ bản, phần đầu tiên Regex.Split sử dụng khoảng trắng để phân chia câu thành các từ và Regex.Matches chia mỗi từ thành các đoạn được chỉ định bởi s . Đoạn được ghi vào vị trí Con trỏ (x, y) trong đó Y được đặt thành 0 cho mỗi từ mới và x được tăng thêm 2 cho đoạn đầu tiên của từ và sau đó (s-1) cho mỗi đoạn.

x bắt đầu cuộc sống ở mức -2 để đảm bảo lần sử dụng đầu tiên được đặt thành 0.

Tôi không đủ hiểu biết về các câu đố C # để có thể làm cho nó nhỏ hơn, nhưng nghi ngờ nó có thể có thể.


2
Bất kỳ lý do cụ thể tại sao bạn sử dụng s cho một int và i cho một chuỗi, thay vì cách khác?
Tahg

Ha ha! Không có ý tưởng - chỉ là một thời gian nhanh chóng trong giờ nghỉ trưa của tôi. Tôi cho đầu vào và s cho kích thước, có lẽ?
Supermaneerkat


1

Perl 5, 59 byte

Mã 55 byte + 4 cho -ai.

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

Lưu ý: \x1bs là ESCký tự theo nghĩa đen , nhưng thoát ra ở đây để dễ dàng sao chép và dán.

Kịch bản lệnh này sử dụng các chuỗi thoát ANSI và yêu cầu đầu vào thông qua -i cờ không chuẩn. Nếu một trong hai điều này không được chấp nhận, xin vui lòng cho tôi biết và tôi sẽ cập nhật.

Ví dụ chạy

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
                      !
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.