この課題は、読み取り不能に不向きです。
これの最初のバージョンは3379バイトでしたが、これは私がこれをどれだけゴルフしたかを知るためです。
プログラムは、チャレンジで説明されているとおりに入力を正確に受け入れます:スペースで区切られた単語のリスト(数字と句読点も含む場合があります)、その後にスペースと少なくとも4の整数が続きます(数値が小さいと無限ループが生成されます) 。
'"" "" ""' "" "" "" "" '"" "'" "'" "'" "'" "'" "'" "'" "" '"" "" "'" "'" "" "" "" "" "" "'" "" "" "" "" "'" "" "" "" "" "" "'" "" "" "" "' "" "'" "" "" "" "" "'" "" "" "" "'" ""' "" "" "" "" "" "" "" "" '""" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" ""' "" "" "" " "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" """ "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" '"" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" '"""" "" "" "" "" "" '"" "" "" "" "" ""' "" "" "" "" "" "" "" "'" "" "" "" " "'" "" "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" '""' "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "'" "" "" "" "" '"" "'" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" ""' '" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" ""' "" "" "" " "" "" "" "" "" '"" "" "" "" "" "" "" "" "'" "" "" "" "'" ""' "" """ "" "" "" "" "" "" '"" "" ""' "" "" "" "" "" "" "" "" "" '"" "" ""' "" "" "" "" "'" ""' "" '""' "" '""' "" '""' "" "" "'" "'" "'" "" "" " "'" "'" "" "" "" "" "'" "'" "'" ""' "" "" "" "" "" "'" "" "" ""' """" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "'" "" "" "" "" "" "'" "" "" "" "" "" "" "" '"" "" "" "'" "'" "" "" "" "'" "" "" "'" "'" "" '"" "" "" ""' "" "" "" "'" "" "" "'" "" "" "" "" "" "" "" "'" "" """ "" "" "" "" "" "" "" "" "'" "" "" "'" "'" "'" "'" "'" "" '""' "" ' "" '""' "" "" "'" "'" "'" "'" "'" "'" "'" "" "" "'" "'" "'" "'" "'" "'" "" "" "" ""' "" '""' "" "" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'""' "" '""' "" '""' "" '""' "" "" "" '"" "" "" "" "'" "'" "'" "'" " "" "" "" "" "" "" '"" "" "" "" "" ""' "" '""' "" "" "" "" '"" "'" "" " '"" "" "'" "" "" "" '""' "" "" "" "'" "" "" "" "" "" "'" "" "" "" "" '"" "" "" "" "'" "" "" "" "" "" "" "'" "" "" "" '"" "'" "'" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" " "" "" "" "" "" "" "'" "" "" "" "" ""' "" "" "" "" "" "" "" "" "" '"" "" "" "" "'" ""' "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" " "" "" "" "" "'" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "' "" "" "" "" "" "" "'" "'" "'" "'" "" '"" "" "" "" "" "" "" ""' """ "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "'" "" "" "" "' "" "" "" "" "" "" "" "" "" "" "" '"" ""' "" "" "" "" "" "" "" "" "" "" " "'" "'" "" "" '"" "'" '"" "" "" "'" "'" "'" "'" "'" "'" ""' "" "'"" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "'" "" ""' "" '""' "" '""' "" '""' "" '""' "" '""' "" '""' "" '" "'" "'" "" "" '""' "" '""' "" '""' "" '""' "" "" "'" "'" "'" "" ""'"" "" "" "" "" "" '"" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" ""' "" '""' "" '"" "'" "" '"" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" """'" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" "" "" '"" "" "" " "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' '" "" "" "" '"" "'" "" '"" "" "'" "'" "" "" "'" "" '""' "" "" "" "'""" '"'" "" "" '""' "" '"" "" "'" "'" "'" "" "" "" "" "'" "'" "'" "' "" '""' "" "" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" "'" " '"" "" "" "'" "" "" "'" "" "" "" "'" "" '""' "" "" "" "'" "" "" "" "'""" '"'" '"'" "" "" '"" "" "" "'" "" "" "'" "" "" "" "'" "" '"" "" "" " "" "'" "" "" "" "'" "" '""' "" '"" "" "" "'" "'" "'" "'" "'" "" '"" " "" "" "" '"" "" "" "'" "'" ""' "'" "" "" "" "" "" "" ""' "" '"" "'"" "" "" "" "" "" '""' "" '"" "'" "" "" "" "" "" "" "" '"" "" "" "
説明
プログラムが入力を処理する方法を説明しますthyme horseradish peppermint 10
。予想される出力はthyme,\nhorser...,\npeppermint
です。
まず、セル#7から開始して入力全体を読み取りますが、スペースがゼロになるようにすべての文字から32を引きます。
明らかな理由により、これにより、最後に実行中のポインター(ここではpという名前が付けられ、セル#0に格納されます)が残ります。1つのwhileループを使用して、出力の幅を定義する数値の先頭である最後のギャップを見つけます(この例ではセル#36)。
次に、数値をデコードします(つまり、10進数から変換します)。最終結果は、セルtとrの両方になります。ゼロから開始するという事実に依存しています。
数字のすべての数字について、次の手順を実行します。
- tを-15に設定します。
- whileループでは、r(これまでの結果を含む)を-1 にデクリメントします(正確にr回の反復が必要なため、しかし、whileループの条件としてチェックされる前にデクリメントが発生するため、0にデクリメントすると1回の反復が少なくなります)そして、反復ごとに、tに10を追加します。今、tは 10回前の結果マイナス15が含まれています。
- 再びwhileループで、* pを0にデクリメントし、各反復でtに1を追加します。この後tは文字:これまでのところ、正しい中間結果が含まれている
'0'
ために'9'
、我々は実際に15-24を追加するようなので、彼らは16-25ある32の先に引いた後、48〜57をASCIIコードを持ってトン -15でキャンセルし、以前に設定しました。また、後続のコードが単語のリストの終わりを認識できるように、数字文字を含んでいたセルをゼロにすることも重要です。
- 集合Rの新しい中間結果の次の反復がそれを見つけたように、R。(tから再度読み取る必要はありません。* pをゼロにすることはできないため、少なくとも1回実行されていることがわかっているため、直前のwhileループの最後の値を使用できます。)
最後に、別の単純なwhileループ(カウンターとしてtをデクリメント)を使用して、計算した数値を単項に変換します。セル#0から左に1の文字列を格納します。これは、この(q)の実行ポインターであるセル#1が0から始まるという事実に依存しています。
この後、rの値はもう必要ないので、そのセルを他の何かに再利用します。ポインターpとqをリセットし、後で必要な文字のASCIIコードでいくつかのセルを初期化します。私はまた、ラベル付けしましたCとの私たちが後で使用する、と私たちはいるという事実に依存しますsがゼロでスタートします:
ちょっと待って セル#0が赤色になっているのはなぜですか?...さて、これは卑劣なトリックを強調するためです。1つ少なすぎる1つを出力したことを思い出してください 秘Theは、セル#0を「拡張」として使用して修正することです。これが機能するのは、pが0になることはないことがわかっているからです。この方法で、赤いブロックの幅は10セルになり、必要な数になります。また、9文字を保存して、qを0ではなく1に初期化できるようにします。
ここで、単語を通過してすべてを出力するwhileループに入ります。
ステップ1:次の単語が現在の行に収まるかどうかを調べます。これは、pが次のギャップに到達するまで、pを右に、qをwhileループで左に移動することで行います。
今というpが上にある右の単語の、私たちは、この場合は、チェックすることによって、リストの最後の単語であるかどうかを確認することができます*(P + 1)がゼロです。また、この値(この例では「ホースラディッシュ」の「h」から32を引いた値が72であるため)は、後で必要になるためcに格納します。この場合、ゼロではないため、単語とともにコンマを出力する必要があるため、単語は1文字長くなります。qをもう1つ減らして、これを考慮してください。最後に、別のwhileループを使用して、pを単語の先頭に戻します。
qがゼロ以外の値を指しているため、単語が現在の行に収まることがわかりました。
- pを単語内で再び前方に移動し、各文字を印刷します(すべてのASCIIコードが32でオフになるため、32を加えます)。
- 場合cが非ゼロである、(セル#5の値を使用して)コンマを印刷します。
- sをゼロ以外の値に設定して、次の反復に対して、行の先頭にないため、次の単語の前にスペース文字を出力する必要があることを示します。(このために上記のprintステートメントの戻り値を再利用します。これはコンマの44です。)
これまでの出力: thyme,
次に、大きなループの次の反復が開始されます。前と同様に、単語を左から右に移動するときにqをデクリメントすることにより、次の単語が行の残りの部分に収まるかどうかを確認します。qは前の反復からまだ-5であり、現在の行にすでに印刷されている文字数を追跡していることに注意してください。「ホースラディッシュ」の文字と、コンマ用の1つと、sがゼロ以外のスペースを出力する必要があることを示すため1つを数えた後、qは1のブロックの終わりをオーバーシュートします。
ここで、qはゼロセルを指します。つまり、「西洋ワサビ」は現在の行に収まりません。ここで行うことは、sがゼロでないかどうかによって異なります。私たちの場合、それは次の行に折り返す必要があることを意味します。そのために必要なのは次のとおりです。
- 改行を印刷する(セル#3を使用)
- セットのQ 1に戻って
- sを0に設定
これまでの出力: thyme,\n
次の反復では、pは以前と同じ場所にあるため、同じ単語をもう一度見ていきます。前と同様に、「ホースラディッシュ」の文字をカウントし、この単語の後に別の単語があることに気づいたときにcを80 に設定し、コンマのqを減らし、単語の先頭にpを巻き戻します。
前の反復と同様に、qがゼロのセルで終わるため、「西洋わさび」はまだ適合しないことがわかります。ただし、この時間sはゼロです。つまり、前回とは異なることを行います。単語の一部、3つのドット、およびコンマを出力する必要があります。幅は10なので、6文字の単語を出力する必要があります。私たちが次のようになったらどうなるか見てみましょう。
- 1の赤いブロックの始まりを見つけます。qは左にある必要があることがわかっているため、右に移動することでこれを行うことができます。
- インクリメントQ我々はまた、出力にカンマが必要な場合は、複数回(C ≠0)。
テープは次のようになります。
ここで6つのセルのスパンをマークしました。ご覧のとおり、q = -1になるまで文字を出力する必要があります。これは、チェックするのに非常に効率的なコードです(基本的にwhile ((++q)+1) { ... }
)。そう:
- qが-1に達するまで、これらの文字(すべてのASCIIコードが32でオフになるため32)を印刷します。pは、「ホースラディッシュ」という単語の中央のセル19にあります。
- 3つのドットを印刷します。printコマンドは独自の引数を返すため、コードを効率的にネストすることができます(本質的に
print(print(print('.')))
)。セル#5からASCII値を取得し、それに2を追加して、ドットのASCIIコードを取得します。
- pを単語の末尾に移動します。単語の終わりに到達できないことはわかっているので(単語が長すぎて、ドットに合うように少なくとも3文字を削除する必要があるため)、このループには少なくとも1つの反復があります。 whileループの本文でドットのASCII値を計算し、whileループの戻り値を印刷関数に渡すと、コードが短くなります。
- cがゼロ以外の場合、コンマを出力します。
このすべての後、改行(セル#3を使用)も出力し、qを1に戻します。既に0であってもsを0に設定することができます。これにより、次の行(sがゼロ以外の場合)で、コードの繰り返しを避けるため、sをチェックする条件の後に行います。
これまでの出力: thyme,\nhorser...,\n
残りは1つだけです。今回は、単語の文字を数えた後、これを取得します。
今回はpの後に何もないので、cを0に設定して「コンマなし」を示し、したがってqをそれ以上減少させません。以来Q同じコードがこの時間点を除いて、最初の繰り返しのように実行されるように、ゼロ以外の細胞で、今の点、私たちは、言葉が収まる知っcが、それは単にコンマを印刷しないように、ゼロです。
出力: thyme,\nhorser...,\npeppermint
このチュートリアルでは、コードが実際にスペースを印刷するケースは含めませんでしたが、今ではかなり明確になっているはずです。コードが単語が適合する(* q ≠0)ことを検出し、sがゼロでない場合、単語の前にスペースを出力します。