ひも階段を作って


24

ひも階段

免責事項:これは私が提案する最初の課題です。すべてのフィードバックを歓迎します。これが重複している場合は、指摘してください。

ここにがサンドボックスの投稿へのリンクです。

ゴール

このチャレンジの目標は、文字列と整数を指定して、文字列をその整数のサイズのブロックに印刷することです。単語にブロックのサイズよりも多くの文字がある場合、降順の「階段」パターンに印刷します。

ルール

  • 上記の「階段パターン」とは、同じ単語のブロックごとに、そのブロックがその上のブロックが終了する場所から正確に開始する必要があることを意味します。質問がある場合は、テストケースを確認します(または質問します)。
  • 単語が複数のブロックに分割されている場合、次の単語は適切な数のスペースを使用して印刷する必要があります。つまり、直前の単語の最下位ブロックと1つの空白だけで区切る必要があります。明確にするために、テストケースを確認します(または尋ねます)。
  • 入力文字列は、印刷可能なASCII文字のみで構成されると想定できます。また、連続した複数の空白はありません。
  • また、整数は常に[1、+∞]の範囲にあると仮定することもできます。
  • 末尾の空白または改行は許可されます。
  • I / Oには適切な方法を使用できます。
  • 標準抜け穴適用されます。
  • これはであるため、最短のコード(バイト単位、言語ごと)が優先されます。1週間後(またはそれ以降)、全体の最短回答を受け入れます。

テストケース

(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

ボーナス:ブロックサイズ1にZalgoを使用するt̳͔̲̻̫̪ḛ͕̦̙͔̩͎͉̝̞ͅx̳͖̬̥̱͓̭̙̤͇̘̲ț͎̣̫̪̩̟̯͈͙͈̗̳͕̹̙̣ͅ
ルイスメンドー

@dzaimaそれがどういう意味かわかりませんが、なぜそうなのかわかりません。例を挙げてください。
J.サレ

@ J.Salle これ
dzaima

@dzaimaええ、問題ありません。
J.サール

回答:


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

*より正確には、「次の行の先頭に2回移動しますが、キャンバスが回転したかのように」。編集:このチャレンジが設定されてからこの回答が受け入れられるまでの間に、チャコールは実際に文字列を文字のペアに分割し、コードを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.サール

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

ジャバスクリプト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(最初のループから)を使用して-実際の配列の長さの代わりに-許可されている後続スペースが発生します
  • evalの代わりにSのマップを使用-3バイト削減
  • 空の配列を初期化する代わりにfillを使用します-したがって、マップ結果のループは不要です
  • ||を置き換えることができます と| -2バイト削減
  • @Justin Marinerに感謝-オカレンス== ""を<"!に置き換えてください!" 2バイト削減
  • 条件をa [I]から他のステートメントに移動して、1つの "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は、最初の使用が0に設定されていることを確認するために、-2から開始します。

私はC#トリビアでそれを小さくするのに十分な知識がありませんが、おそらくそれができると疑っています。


2
他の方法ではなく、intにsを使用し、文字列にiを使用する特別な理由はありますか?
Tahg

ハハ!わからない-昼休みにちょっとした時間の無駄。おそらく入力のために、サイズのために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
                      !
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.