ワードラダーを構築する


30

少なくとも2つの単語(小文字のみで構成される)のリストが与えられた場合、最初に右から次に左に、最初の方向を左から右に交互に変えて、単語のASCIIラダーを作成および表示します。 。

単語を書き終えたら、方向を変えてから、次の単語を書き始めます。

ご使用の言語が単語のリストをサポートしていない場合、またはより便利な場合は、単一のスペースで区切られた単語の文字列として入力を取得できます。

先頭と末尾の空白は許可されます。

["hello", "world"] または "hello world"

hello
    w
    o
    r
    l 
    d

ここでは、書き込みから始めhelloて、次の単語(または文字列としての入力の場合-スペースが見つかった場合)に達したときに、相対方向を右に変更して書き込みを続けますworld

テストケース:

["another", "test", "string"] or "another test string" ->   

another
      t
      e
      s
      tstring


["programming", "puzzles", "and", "code", "golf"] or "programming puzzles and code golf" ->

programming
          p
          u
          z
          z
          l
          e
          sand
             c
             o
             d
             egolf

["a", "single", "a"] or "a single a" ->

a
s
i
n
g
l
ea

受賞基準

すべての言語のバイト単位の最短コードが勝ちです。ゴルフの言語に落胆させないでください!

サンドボックス



1
@Arnauldはい、説明に追加します。
ガレンイワノフ

回答:


12

、9バイト

F⮌A«↑⮌ι‖↗

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:テキストを逆方向に描画し、単語ごとにキャンバスを転置することで機能します。文字列入力用の10バイト:

F⮌S≡ι ‖↗←ι

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:キャンバスをスペースに置き換えて、テキストを後方に描画します。



6

05AB1E19 16 バイト

€θ¨õšøíJD€gs24SΛ

@Emignaのおかげで-3バイト。

オンラインでお試しください。

一般的な説明:

@Emignaの05AB1Eの答えと同じように(彼に必ず賛成票を投じてください !!)、Canvas builtinΛを使用ます。

ただし、使用するオプションは異なります(そのため、答えが長くなります。):

  • b(印刷する文字列):リストの最初の文字列を変更せずに残し、リストの次の各文字列に末尾の文字を追加します。たとえば、["abc","def","ghi","jklmno"]になり["abc","cdef","fghi","ijklmno"]ます。
  • a(行のサイズ):これはこれらの文字列に等しいため[3,4,4,7]、上記の例では。
  • c(印刷する方向):[2,4]にマッピングされます[→,↓,→,↓,→,↓,...]

したがって、上記の例では、次の手順をステップごとに実行します。

  1. abc方向2/に描画します。
  2. /のcdef方向に描画します(最初の文字が最後の文字と重複するため、このようにリストを変更する必要があります)4
  3. fghi方向2/ 再度描画します(また、末尾の文字と先頭の文字が重なります)
  4. ijklmno方向4/ 再度描画(重複も含む)
  5. 描画されたCanvasの結果をすぐにSTDOUTに出力します

コードの説明:

€θ                # Only leave the last characters in the (implicit) input-list
  ¨               # Remove the last one
   õš             # And prepend an empty string "" instead
     ø            # Create pairs with the (implicit) input-list
      í           # Reverse each pair
       J          # And then join each pair together to single strings
        Dg       # Get the length of each string (without popping by duplicating first)
           s      # Swap so the lengths are before the strings
            24S   # Push [2,4]
               Λ  # Use the Canvas builtin (which outputs immediately implicitly)

1
バージョン2/3/4では、で3バイト節約できます€θ¨õšsøJ
エミグナ

@Emignaありがとう!今、私は...それはとてもシンプルに見える...そして、ここで私が代わりに3つの代替19-bytersを持っていたそれを見ること
ケビンCruijssen

のいくつかの代替手段€θ¨õšsøJõIvy«¤})õUεXì¤U}およびε¯Jθ줈}(最後の2つは--no-lazy)です。残念ながら、それらはすべて同じ長さです。変数の一つがデフォルトした場合にこれがずっと容易になるだろうに""...
Grimmy

@Grimy「変数の1つがデフォルトになっている場合、これははるかに簡単になり""ます...」あなたは探していますかõ、またはX/ Y/ ®があった場合はどういう意味""ですか?ところで、エミグナの答えのコメントで素敵な13バイト。[→,↙,↓,↗]あなたが使用した方向で、私のものと彼のTBHの両方とは全く異なります。
ケビンクルーッセン

õ変数ではありません。はい、デフォルトの変数を意味します""。文字列の1つのõU先頭で文字通り実行するので、X(または他の変数)がデフォルトでに設定されている""場合、2バイト節約されます。ありがとう!ええ、↙↗は少し新しいですが、エミグナの答えから、長さ2のダミー書き込みで真の書き込みを散在させるというアイデアを得ました。
グリムミー

6

05AB1E14 13バイト

Grimyのおかげで1バイト節約

€ðÀD€g>sŽ9÷SΛ

オンラインでお試しください!

説明

                 # example input ["Hello", "World"]
€ðÀ              # push a space after each word
                 # STACK: ["Hello"," ","World"," "]
   D             # duplicate
    €g>          # get the length of each word in the copy and add 1
                 # these are the lengths to draw
                 # STACK: ["Hello"," ","World"," "], [6, 2, 6, 2]
       s         # swap the list of word to the top of the stack
        Ž9÷S     # push [2, 5, 4, 1]
                 # this is the list of directions to draw
                 # 1=northeast, 2=east, 4=south, 5=southwest
            Λ    # paint on canvas

1
ああ、すてきなアプローチ!すぐに19バイトバージョンを投稿しますが、Bifurcateを使用して2文字だけを描画すると非常に便利です。
ケビンクルーッセン

1
ところで、あなたは、散在するための組み込みがありますよね?€Y¦可能性があります2.ý(ここでバイトを保存するわけではありません)。そして、これは、通常のマップが有用であることと比較して、新しい動作を目にしたのは初めてです。
ケビンクルーッセン

@KevinCruijssen:以前に使用したことはありますが、自分自身は使用したことがないので、考えもしませんでした。私にとっては通常の地図であり、私はそれを頻繁に使用しましたが、もう1つは「新しい」地図です;)
Emigna


2
私の悪い、私は偶数/奇数の困難に気づかなかった!ここでは、実際に動作するはずだ13:€DAD€グラム>sŽ9÷Sλ
Grimmy

5

Canvas17 12 11 10 バイト

ø⁸⇵{⟳K└×∔⤢

ここで試してみてください!

説明:

ø⁸⇵{⟳K└×∔⤢  full program taking array as input (loaded with ⁸)

ø         push an empty canvas               ["test", "str"], ""
 ⁸⇵{      for each input word, in reverse:   "str", "test" (showing 2nd iter)
    ⟳       rotate the word vertically       "str", "t¶e¶s¶t"
     K      pop off the last letter          "str", "t¶e¶s", "t"
      └     swap the two items below top     "t¶e¶s", "str", "t"
       ×    prepend                          "t¶e¶s", "tstr"
        ∔   vertically append                "t¶e¶s¶tstr"
         ⤢  transpose the canvas             "test
                                                 s
                                                 t
                                                 r"

5

JavaScript(ES8)、 91 79  77バイト

入力を単語の配列として受け取ります。

a=>a.map((s,i)=>i&1?[...s].join(p):s+=p+=''.padEnd(s.length-!i),p=`
`).join``

オンラインでお試しください!

コメント済み

a =>                 // a[] = input array
  a.map((s, i) =>    // for each word s at position i in a[]:
    i & 1 ?          //   if this is a vertical word:
      [...s].join(p) //     split s and join it with p
    :                //   else:
      s +=           //     add to s:
        p +=         //       add to p:
          ''.padEnd( //         as many spaces
            s.length //         as there are letters in s
            - !i     //         minus 1 if this is the 1st word (because it's not connected
          ),         //         with the last letter of the previous vertical word)
    p = `\n`         //   start with p = linefeed
  ).join``           // end of map(); join everything

p行末を追跡するための使用は非常に賢い+1
Downgoat


5

brainfuck、57バイト

->,[[.<+>,],[<<[-]++++++++++.--[-<++++>]>[-<+<.>>]>.<,],]

オンラインでお試しください!

NULで区切られた文字列として入力を受け取ります。これは0としてEOFを使用しており、ラダーが256スペースを超えると動作を停止することに注意してください。

説明:

-           Initialise counter as -1
>,[         Start ladder
   [.<+>,]  Print the first word, adding the length of it to the counter
   ,[       Loop over each letter of the second word
      <<[-]++++++++++.    Print a newline
      --[-<++++>]         Create a space character
      >[-<+<.>>]          Print counter many spaces
      >.<,                Print the letter and move to the next letter
   ] 
   ,        Repeat until there are no more words
]

Brain-Flakで解決策をお願いできますか?
ガレンイワノフ

BFを理解する最初の試み。2つの質問:(.コメントバージョンの)3行目にchar がない場合、最初の単語はどのように出力されますか?TIOの入力で遊んでみました。Macでは、キーボードをUnicodeテキスト入力に切り替え、入力して新しい単語境界を作成しようとしましたoption+0000が、機能しませんでした。どうしてですか?
ジョナ

1
@Jonah Ah良いキャッチ、説明の-代わりに誤って入力し.ました。TIOにNULバイトを追加するには、コンソールを使用し、などのコマンドを実行することをお勧めし$('#input').value = $('#input').value.replace(/\s/g,"\0");ます。なぜあなたのやり方がうまくいかなかったのか分かりません
ジョー・キング

5

JavaScript、62バイト

a=>' '+a.replace(/./g,c=>1-c?(a=!a,''):a?(p+=' ',c):p+c,p=`
`)

オンラインでお試しください!

Rick Hitchcockに感謝します。2バイト保存されました。


JavaScript、65バイト

a=>a.replace(/./g,c=>1-c?(t=!t,''):t?p+c:(p+=p?' ':`
`,c),t=p='')

オンラインでお試しください!

a => a.replace(/./ g、c =>(//文字列aの各文字cに対して
    1-c?// if(cはスペース)
      (t =!t、//更新t:ブール値は単語インデックスを記述します
                       //真実:奇数インデックスの単語;
                       //偽:インデックス付きの単語も
        '')://スペースに対しては何も生成しません
    t?// if(奇数インデックス)は、垂直であることを意味します
      p + c:// '\ n'、いくつかのスペース、単一文字を追加
                       //その他
      (p + = p? '': '\ n'、//縦書きの単語の先頭に追加する文字列を準備する
         c)//単一の文字を追加します
)、
  t = p = '' //初期化
)

私はあなたが交換することにより2つのバイトを保存することができると思うtaから削除することt=
リックヒッチコック

5

アヒーウイ(エソトープ)490 458 455バイト

삭뱃밸때샏배샐배새뱄밿때빠뱋빼쌘투@밧우
@두내백뱃빼선대내백뱃섣@여우샐처샐추
희차@@@뭏누번사@빼뭏오추뻐@@@배
By@@@새대백@@@우뻐색
Legen@@빼쵸누번@@빼
DUST@@@샌뽀터본섣숃멓
@@@@@@@오어아@먛요아@@샏매우
@@@@@아@@@@@@오@@@@@서어
@@@@@희차@@요

オンラインでお試しください!

韓国語(3バイト)の代わりに全角文字(2バイト)を使用して少しゴルフをしました。

説明

Aheuiは、befungeのようなesolangです。次に、色付きのコードを示します。 色付きのAheuiコード ?1部分は、現在の文字がスペースかどうかをチェックします。

?2部分は、単語が右から左または上から下に書かれているかどうかをチェックします。

?3部分は、スペースを入力するループのブレーク条件です。

?4部分は、現在の文字が行末(-1)かどうかをチェックします。

赤い部分はスタックの初期化です。Aheuiが(からスタックを使用Nothingするストア値:28のスタック)。

オレンジ色の部分は入力を受け取ります()を、32(asciiスペースのコード)を引くことでスペースかどうかを確認します。

緑の部分は、右から左に書き込む場合、スペースの長さの値を格納するスタックに1を追加します。

紫の部分は、上から下に書く場合のスペースの印刷用のループです。

現在のキャラクターが -1 1を追加して、であるます。

青い部分は現在の文字を印刷し、次の文字の準備をします。


この投稿で画像を生成するために何を使用しましたか?
bb94

@ bb94のベースはAheuiChemで、韓国語のAheuiオンライン(ある種の)IDEで構築されています。そして、Powerpointを使用して色を付けました。
LegenDUST

4

Japt -P、15バイト

ò mrÈ+R+YÕùT±Xl

それを試してみてください

ò mrÈ+R+YÕùT±Xl     :Implicit input of string array
ò                   :Partition into 2s
  m                 :Map each pair
   r                :  Reduce by
    È               :  Passing through the following function as X & Y
     +              :    Append to X
      R             :    Newline
       +            :    Append
        YÕ          :    Transpose Y
          ù         :    Left pad each line with spaces to length
           T±       :      T (initially 0) incremented by
             Xl     :      Length of X
                    :Implicitly join and output

4

バッシュ、119文字

X=("\e7" "\n\e8")
w="$@"
l=${#w}
d=0
for((i=0;i<l;i++));do
c="${w:$i:1}"
[ -z $c ]&&d=$((1-d))||printf ${X[$d]}$c
done

これは、ANSI制御シーケンスを使用してカーソルを移動します。ここでは、保存\e7と復元のみを使用しています\e8。ただし、復元の接頭辞を付ける必要があります\n出力が既に端末の下部にある場合は、出力をスクロールする必要があります。何らかの理由で、あなたがまだない場合は動作しませんで、端末の一番下に。*肩をすくめる*

現在の文字$cは、入力文字列から単一文字の部分文字列として分離されます$wforループインデックス$iを文字列へのインデックスとしてます。

私がここで使用している唯一の本当のトリックは、[ -z $c ]それが返されることですtrue。つまり、文字列は空白$cです。bashを正しく使用する場合は、テストされる文字列を引用符で囲んで、-zこの状況を正確に回避してください。これにより、との$d1で方向フラグを反転できます0。これは、ANSI制御シーケンス配列へのインデックスとして使用され、X、次の非スペース値でます$c

私は何かを使用することに興味があります printf "%${x}s" $c

空白を追加してみましょう。どこにいるのかわからない...

X=("\e7" "\n\e8")
w="$@"
l=${#w}
d=0
for ((i=0;i<l;i++)); do
  c="${w:$i:1}"
  [ -z $c ] && d=$((1-d)) || printf ${X[$d]}$c
done

ちなみに、このtio.runサイトでこれを試すことはできません。他のいくつかのサイトと同様に、ANSI制御シーケンス処理がないため、バーフだけです。
リッチ

4

Perl 6、65バイト

{$/=0;.map:{$/+=$++%2??!.comb.fmt("%$/s","
").print!!.say*.comb}}

オンラインでお試しください!

単語のリストを受け取り、STDOUTに直接出力する匿名コードブロック。

説明

{                           }  # Anonymous code block
 $/=0;                         # Initialise $/ to 0
 .map:{                    }   # Map the list of words to
       $/+=                    # Increment $/ by
           $++%2??             # For even indexes
                   .comb       # Each letter of the word
                   .fmt(           ) # Formatted as
                        "%$/s"       # Padded with $/-1 spaces
                              ,"\n"  # Joined by newlines
                   .print            # And printed without a newline
                  !   # Boolean not this to add 0 to $/
                !!            # For odd indexes
                  .say        # Print with a newline
                      *.comb  # And add the length of the word

私はこの1つがどのように機能するのか興味があります。私はPerl 6を知りません
ジョナ

@ジョナ私は説明を追加しました
ジョーキング

ありがとう、いい解決策。
ジョナ

3

、19 バイト

FLθ¿﹪鲫↓§θι↗»«§θι↙

文字列のリストとして入力

オンラインで試す(詳細)またはオンラインで試す(純粋)

説明:

範囲内のループ[0, input-length)

For(Length(q))
FLθ

インデックスが奇数の場合:

If(Modulo(i,2)){...}
﹪鲫...»

インデックスの文字列をi下方向に印刷します。

Print(:Down, AtIndex(q,i));
↓§θι

次に、カーソルを右上に向かって1回移動します。

Move(:UpRight);
↗

そうでない場合(インデックスは偶数):

Else{...}
«...

インデックスの文字列をi通常の右方向に印刷します。

Print(AtIndex(q,i));
§θι

次に、カーソルを左下に1回移動します。

Move(:DownLeft);
↙



3

J47 45 43バイト

;[`(([:<@(+/)\#&>##$#:@1 2)@])`([' '"0/[)}]

オンラインでお試しください!

楽しい、異なるアプローチを見つけました...

左パッドと周期的動名詞などでジップをいじり始めましたが、各文字の位置を計算するだけで簡単に気付くことがわかりました(これは正確に選択された配列のスキャン合計になります) }、ブランクにをします破壊された入力のキャンバス。

ソリューションは、ほぼ完全にAmendによって処理され}ます。

; [`(([: <@(+/)\ #&> # # $ #:@1 2)@])`([ ' '"0/ [)} ]
  • ; ( single verb that does all the work ) ] 全体的なフォーク
  • ; 左の部分は入力を破壊します。つまり、すべての文字を連続した文字列に入れます
  • ] 右の部分は入力そのものです
  • (stuff)}}3つの部分で構成される動名詞形式の修正を使用します。v0`v1`v2
    • v0 「新しい値」を与えます。これはレイズ(つまり、入力のすべての文字を1つの文字列として)であるため、 [
    • v2変換する初期値を提供します。必要な寸法のスペースの空白のキャンバスが必要です。 ([ ' '"0/ [)サイズを1つ指定します(all chars)x(all chars)
    • 中央の動詞v1は、置換文字を配置する位置を選択します。これがロジックの要点です...
  • 0 0左上の位置から始めて、新しい文字はそれぞれ、前の位置の1から右(つまりprev + 0 1)か、1つ下(つまり)のいずれかになりprev + 1 0ます。実際、前者を「単語1の長さ」回、次に後者を「単語2の長さ」回、というように交互に行います。そのため、これらの動きの正しいシーケンスを作成し、それらをスキャンして合計し、位置を取得します。これが修正の仕組みであるため、ボックス化します。このアイデアの仕組みは次のとおりです...
  • ([: <@(+/)\ #&> # # $ 1 - e.@0 1)
    • 最初#:@1 2に定数行列を作成します0 1;1 0
    • # $その後、入力と同じ数の行を持つように拡張します。たとえば、入力に3つの単語が含まれる場合、が生成され0 1;1 0;0 1ます。
    • #&> #その左の部分は入力語の長さの配列であり、#コピーです。したがって、0 1「語1の長さ」回、次に1 0「語の長さ2回」などをコピーします。
    • [: <@(+/)\ スキャン合計とボックスを実行します。

3

T-SQL、185バイト

DECLARE @ varchar(max)='Thomas Clausen Codegolf Script'
,@b bit=0,@s INT=0SET @+=':'WHILE @ like'%_:%'SELECT
@b+=len(left(@,1))-1,@=stuff(@,1,1,'')+iif(left(@,@b)='','','
'+space(@s))+trim(left(@,1)),@s+=len(left(@,~@b))PRINT
stuff(@,1,1,'')

オンラインで試す


1
BIT値、区切り文字スペース、および循環文字列処理の非常に巧妙な使用。私よりもはるかに良い答えです!
ムコ

2

網膜、51バイト

1,2,`\w+
;$&
+(m`^(.(.*?)) ?;(.)
$1¶$.2* $3;
; |;$

オンラインでお試しください!

他のすべての単語にマークを付けてから、変換を直接適用するかなり単純なアプローチ。

説明

1,2,`\w+
;$&

他のすべての単語をセミコロンでマークします。各単語を一致させますが、一致1から3に続く一致(インデックスがゼロ)にのみ置換を適用します。

+(m`^(.(.*?)) ?;(.)
$1¶$.2* $3;

+(m次の段階のいくつかのプロパティを設定します。プラスは「このグループのステージが何かを変更する」ループを開始し、開き括弧は、バックティックの前に閉じブラケットがあるまでプラスが続くすべてのステージに適用されることを示します(これは、この場合)。mちょうど御馳走に正規表現を告げる^も、文字列の代わりにちょうど始まりの行の先頭から一致すると。

実際の正規表現は非常に簡単です。最初のセミコロンの前に適切な量のものを一致させ、Retinaの*置換構文を使用して正しい数のスペースを挿入します。

; |;$

このステージは最後のステージの後に適用され、垂直に変更した単語の末尾のセミコロンとスペースを削除します。


2

Retina 0.8.2、58バイト

(?<!^(\S* \S* )*\S*)
¶
¶? 

+`(..(.)*¶)((?<-2> )*\S)
$1 $3

オンラインでお試しください!リンクにはテストケースが含まれます。代替ソリューション、58バイト:

( \S*) 
$1¶
+` (.)
¶$1 
 ¶

+`(..(.)*¶)((?<-2> )*\S)
$1 $3

オンラインでお試しください!リンクにはテストケースが含まれます。

ここでは意図的にRetina 1を使用していないため、代替単語の操作は無料ではありません。代わりに、2つのアプローチがあります。最初のアプローチは、先行するスペースをカウントすることによって代替単語のすべての文字を分割します。2番目のアプローチは、代替スペースを改行で置き換え、残りのスペースを使用して代替単語を文字に分割します。各アプローチは、最後の縦書き文字を次の横書き単語に結合する必要がありますが、コードは異なる方法で単語を分割するため、コードは異なります。両方のアプローチの最終段階では、最初のスペース以外の文字が前の行の最後の文字の下に揃うまで、各行にパディングします。

必要がないので、単語が単なる文字であると仮定しないことに注意してください。


2

PowerShell101 89 83バイト

mazzyのおかげで-12バイト。

$args|%{$l+=if(++$i%2){$_.length-1;$t+=$_}else{1;$_|% t*y|%{$t+='
'+' '*$l+$_}}};$t

オンラインでお試しください!


いいね 1)最初の行を削除する、2)スプラッティングを使用する& $b @p(各単語を1つの引数として使用する)、3)new line定数に短い形式を使用する。で、3,4行を参照してください。この例
mazzy

@mazzy、飛び散ると、に対する間違った答えを得るfooコードを参照してください。
アンドレイ・オデゴフ

おお!スプラッティングは、1つの単語をchar配列に分割します。面白い。ありがとう!
mazzy

1
@mazzy、それは私のせいではありません:)
Andrei Odegov

私たちは、ルールを使用することができると思うGiven a list of at least two words...
mazzy



2

T-SQL、289バイト

DECLARE @ VARCHAR(MAX)='a a',@I INT=1,@S INT=0,@B INT=0WHILE @I<=LEN(@)IF SUBSTRING(@,@I,1)=''IF @B=0SELECT @S-=1,@=STUFF(@,@I,1,'
'+SPACE(@S)),@I+=@S+3,@B=1 ELSE SELECT @=STUFF(@,@I,1,''),@S+=1,@B=\ELSE IF @B=0SELECT @I+=1,@S+=1 ELSE SELECT @=STUFF(@,@I,0,'
'+SPACE(@S)),@I+=@S+3PRINT @

これは、SQL Server 2016およびその他のバージョンで実行されます。

@はスペース区切りのリストを保持します。@Iは、文字列内のインデックス位置を追跡します。@Sは、左からインデントするスペースの総数を追跡します。@Bは、文字列がポイント@Iで整列している軸を追跡します。

バイトカウントには、最小限のサンプルリストが含まれています。スクリプトは、リストを1文字ずつ調べ、要件に従って表示されるように文字列を変更します。文字列の最後に到達すると、文字列が印刷されます。


こんにちは@Mugo長い入力を使用すると、スクリプトに不具合があるようです。私の答えからのデータでテストすると、pとtの間の最後の単語に意図しない曲がりがあることがわかります
t-clausen.dk

@ t-clausen.dkおっと、最後の繰り返しを適切に処理できませんでした。ありがとう!
ムコ

動作確認済み
t-clausen.dk

1

JavaScript(Node.js)、75バイト

a=>a.map(x=>i++&1?[,...x].join(`
`.padEnd(n)):(n+=x.length,x),n=i=0).join``

オンラインでお試しください!

説明と自由

function f(a) {                   // Main function:
 return a.map(                    //  Map through all words:
  function(x) {
   if (i++ & 1)                   //   If i % 2 == 1 (i.e. vertical):
    return [,...x].join(          //    Since the first one needs to have its own linefeed 
                                  //    and indentation, add a dummy item to the start.
     "\n".padEnd(n)               //    Join the array with the padded line feeds.
    );
   else {                         //   If i % 2 == 0 (i.e. horizontal):
    n += x.length;                //    Add the length of this string to the variable that
                                  //    counts how long the padded line feeds should be.
    return x;                     //    Append the string at the end without line feeds.
   }
  },
  n = i = 0                       //   Initialize variables.
                                  //   n: the length of the padded line feeds 
                                  //      (including the line feed)
                                  //   i: keeps track of the direction
 ).join("")                       //  Join all stuffs and return.
}





1

J、35 33バイト

3 :'[;.0>(,|:)&:,.&.>/_98{.;:|.y'

これは、単語をスペースで区切った単一の文字列として入力を受け取る動詞です。たとえば、次のように呼び出すことができます。

3 :'[;.0>(,|:)&:,.&.>/_98{.;:|.y' 'programming puzzles and code golf'

出力は文字とスペースのマトリックスで、必要に応じてインタープリターが改行で出力します。各行にはスペースが埋め込まれるため、まったく同じ長さになります。

コードにはわずかな問題が1つあります。入力に98語以上ある場合は機能しません。長い入力を許可する場合_98は、コード内_998を998語などまで許可するように置き換えます。


いくつかの例を通して、これがどのように機能するかを説明しましょう。

水平方向の単語から始まる一部の単語の部分的な出力であると考えられる文字とスペースのマトリックスがあるとします。

   [m=: 3 3$'vwx  y  z'
vwx
  y
  z

これの前に、どうやって垂直に新しい単語を追加できますか?難しいことではありません。動詞,.を使用して新しい単語を文字の単一列マトリックスに変換し、その単一列マトリックスに出力を追加します。(動詞,.は、ゴルフに使用するマトリックスに適用すると、恒等関数として動作するため便利です。)

   (,.'cat') , m
c  
a  
t  
vwx
  y
  z

このように単語をそのまま前に追加する方法を繰り返すことはできません。なぜなら、垂直の単語しか取得できないからです。ただし、各ステップ間で出力行列を転置すると、1つおきの単語が水平になります。

   (,.'dog') , |: (,.'cat') , m
d     
o     
g     
catv  
   w  
   xyz

したがって、最初の解決策の試みは、各単語を単一列のマトリックスに入れ、それらの単語を追加および転置することによって折り畳むことです。

   > (,|:)&.>/ ,.&.>;: 'car house dog children'
c            
a            
r            
housed       
     o       
     g       
     children

しかし、これには大きな問題があります。これにより、次の単語の最初の文字が配置されてから直角になりますが、仕様では最初の文字を配置する前に回転する必要があるため、出力は次のようになります。

c             
a             
rhouse        
     d        
     o        
     gchildren

これを実現する方法は、次のように入力文字列全体を逆にすることです。

nerdlihc god esuoh rac

次に、上記の手順を使用してジグザグを作成しますが、各単語の最初の文字の後にのみ回転します。

n     
e     
r     
d     
l     
i     
h     
c     
gode  
   s  
   u  
   o  
   h  
   rac

次に、出力を反転します。

   [;.0> (,|:)&.>/ ,.&.>;:|. 'car house dog children'
car   
  h   
  o   
  u   
  s   
  edog
     c
     h
     i
     l
     d
     r
     e
     n

しかし、今、もう一つの問題があります。入力のワード数が奇数の場合、出力には最初のワードが垂直になりますが、仕様では最初のワードは水平でなければなりません。これを修正するために、私のソリューションは単語のリストを正確に98単語にパディングし、空の単語を追加します。これは出力を変更しないためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.