给我建一些阶梯


24

弦楼梯

免责声明:这是我提出的第一个挑战。任何反馈都是欢迎的。如果重复,请指出。

是沙盒帖子的链接。

目标

该挑战的目标是给定一个字符串和一个整数,将该字符串打印为该整数大小的块。如果一个单词的字符多于一个块的大小,请将其打印为降序的“阶梯”模式。

规则

  • 上面提到的“阶梯模式”意味着,对于同一个单词的每个块,该块必须从其上一个块结束的位置开始准确地开始。如有疑问,请检查测试用例(或询问)。
  • 如果一个单词被分成多个块,则后一个单词必须用足够数量的空格打印,也就是说,它必须与前一个单词的最低块完全隔开一个空格。检查测试用例(或要求)进行澄清。
  • 您可以假设输入字符串仅包含可打印的ASCII字符。而且,它不会连续有多个空格。
  • 您还可以假定整数将始终在[1,+∞)范围内。
  • 允许尾随空格或换行符。
  • 您可以对I / O 使用任何合理的方法
  • 适用标准漏洞
  • 这是,因此最短的代码(每种语言以字节为单位)获胜。一个星期(或大约一个星期)后,我将接受总体上最短的答案。

测试用例

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

每行上是否可以有相等数量的前导空格?
dzaima

奖励:将Zalgo用于块大小为1的区块
Luis

@dzaima我不确定您的意思,但我不知道为什么。想举个例子吗?
J.Sallé17年

@ J.Salle
dzaima

@dzaima是的,没问题。
J.Sallé17年

Answers:


7

木炭,22字节

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

在线尝试!链接是详细版本的代码。说明:

  θ                      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

*更准确地说,“两次移动到下一行的开始,但好像画布已旋转。” 编辑:在设置此挑战和接受此答案之间,木炭实际上获得了一种将字符串拆分为成对字符的方法,从而将代码减少了16个字节:
F⪪θ «↑⸿⸿F⪪ιIη«κ↙ 在线尝试!链接是详细版本的代码。说明:

  θ                 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

遵循挑战规则,我已将此作为最短答案(截至2017年10月6日)。
J.Sallé17年

3

SOGL V0.1228个 27 26 字节

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

在这里尝试!

我在实现时确实实现了,但是它的文档之前已经存在。

说明:

ā                            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个字节

  • 为了提高可读性,在代码中添加了一些字节,并从字节数中删除了它们
  • 代替s =“”,j = 0我做了j = s =“”
  • 代替for(i in s)-常规for循环-删除了1个字节
  • 在数组的索引器中使用已经生成的值-删除了8个字节
  • 在eval中已经使用值i = s.length(从第一个循环开始)的值-而不是实际数组的长度-会导致允许尾随空间
  • 使用S的映射而不是eval-减少3个字节
  • 在初始化空数组时使用fill代替-因此在map结果中不需要循环
  • 可以代替|| 与| -减少2个字节
  • 感谢@Justin Mariner-将出现的==“”替换为<“!减少2个字节
  • 将条件从a [I]移至另一条语句以减少一个“ u <”!“”“-减少2个字节
  • 而不是(I + = 2,j = 0)-j =!(I + = 2)-减少1个字节
  • “为”而不是“
    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
您应该可以使用<"!"代替来保存几个字节==" "
贾斯汀·马里纳

2

C#,200字节

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

其中字符串由i指定,大小由s指定。

例如

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

基本上,第一部分Regex.Split使用空格将句子拆分为单词,而Regex.Matches将每个单词拆分为s指定的块。将该块写入游标位置(x,y),其中每个新单词的Y都设置为0,对于单词的第一个块,x递增2,随后对每个块递增(s-1)。

x以-2的寿命开始,以确保其首次使用设置为0。

我对C#琐事了解不足,无法使其变小,但怀疑它可能会变小。


2
为什么将s用作int并将i用作字符串,而不是相反的原因是什么?
塔赫格

哈哈!不知道-我午休时间浪费了很多时间。我输入,而s表示大小?
supermeerkat


1

Perl 5,59位元组

55个字节的代码+ 4个-ai

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

注意:\x1bs是文字ESC字符,但此处已转义以方便复制和粘贴。

该脚本利用ANSI转义序列,并要求通过-i非标准标志输入。如果以上任何一个都不可接受,请告诉我,我会进行更新。

运行示例

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
                      !
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.