グルーヴィーなスパイラルに沿って熱心な「クイックブラウンフォックス」「ジャンプ」


12

前書き

指定されたルールに従って、有名なパングラムの発信スパイラルを出力するプログラムを作成します。

チャレンジ

パングラムは、少なくとも一度与えられたアルファベットのすべての文字を使用した文です。最も有名なパングラムの1つは、Windowsフォントビューアーで広く使用されているパングラムです。つまり、「素早い茶色のキツネが怠け者の犬を飛び越えます」。課題は、このテキストに基づいてスパイラルを出力することです。

タスクは次の正確なテキストを出力します。

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

生成方法は次のとおりです。

  • 熱狂的なキツネがいて、パングラム「怠quickな犬を飛び越える茶色いキツネ」を楽しんだ。ある日、彼は外側のらせんの中心にいて、そこに飛び込んで絵を描くことにしました。
  • 彼はパングラムを最初から最後まで行きたいと思います。また、アルファベットのn番目の文字である場合は、n回ペイントしたいと思います。
  • しかし、キツネは角を曲がるのがあまり得意ではなかったので、各角に到達すると、彼はまた停止して次の文字に切り替える必要がありました。
  • 彼はまた、彼があることを強調しパングラムの3回繰り返すことを決めた迅速な茶色のキツネ。
  • あなたの仕事は、キツネがそれらのすべての文字を描いた後、スパイラルがどのように見えるかを示すことです。

(ストーリーテリングなしのプレーンバージョン)

  • 有名なパングラム「茶色いキツネが怠zyな犬を飛び越える」が3回繰り返され、スペースが削除され、すべての文字が小文字になります。

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • らせんは中心から始まり、文字「t」で始まり、右に行くことで始まり、時計回りに外側に進みます。現在の文字がアルファベットのn番目の文字である場合、次の文字にいつでも切り替わります

    • スパイラルが角に達する、または
    • 現在の文字は正確にn回印刷されます。

それをよりよく説明するために、最初の3つの単語「thequickbrown」に関連するスパイラルがどのように生成されるかを説明します。

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

キツネは「t」から始まり、右に行き、最初のコーナーに到達し、「t」でペイントしから「h」に切り替わり、下に行き、2番目のコーナーに到達し、「e」に切り替わり、左に進み、 3番目のコーナー、「q」に切り替えて上昇、4番目のコーナーに到達、「u」に切り替えて右に移動、コーナーに到達して「i」に切り替え、下降、コーナーに到達して「c」に切り替え、移動左、次のコーナーに到達する前に3つの「c」を正常にペイントし、「k」に切り替えてに進み、すぐにコーナーに到達し、「b」に切り替えて上昇し、到達する前に2つの「b」をペイントする次のコーナー、「r」に切り替わりますそしてに進み、角に到達して「o」に切り替わり、右に進み、次に「w」、下、「n」、左になります。

スペック

  • 文字列の標準形式を含むオプションの入力を取ることができます

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • 出力は文字列としてフォーマットされ、ファイルまたはSTDERRではなくSTDOUTに送られ、改行が正しく配置されている必要があります。空行の先頭と末尾は関係ありません。各行の先頭と末尾のスペースは許可されますが、一貫している必要があります。したがって、指定したテキストの1行の前に5つのスペースを追加する場合、各行の前に正確に5つのスペースを追加して、スパイラルが同じように見えるようにする必要があります。

  • これはであり、最も少ないバイト数が勝ちます。

  • いつものように、デフォルトの抜け穴がここに適用されます。


説明は歓迎されますが、必須ではありません。

caird coinheringaahingがコメントごとにパングラムにするために編集したタイトル。

怠zyな犬は、物語に登場するのが面倒です。

座標の単純な関数では出力する文字を計算できない文字列チャレンジを作成することを目指しています。


2
タイトルがパングラムではないのは残念です
20:04に共謀します

@cairdcoinheringaahing良い点、私は1つを考えてみます。助言がありますか?
ウェイジュン周

4
@cairdcoinheringaahing更新
周Weijun

軽微な点:最初の「the」の「h」は「t」ではなく2回繰り返されるべきではありませんか?
mudkip201

@ mudkip201次の文字に切り替える前に、元の文字でコーナーがペイントされます。たぶん明確にする必要があります。
ウェイジュン周

回答:


5

スタックス35 34 33 32 バイト

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

オンラインで実行してデバッグする

Staxは私が約6か月間取り組んでいる言語です。これが初めてのパブリックゴルフです。ビジネスに取り掛かろう。

Staxは通常、印刷可能なASCII文字セットで書き込まれます。この34バイトの送信は、CP437文字セットのバリアントにパックされます。対応するascii表現は

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Staxはスタックベースの言語ですが、「main」と「input」という2つのデータスタックがあります。ほとんどの操作はメインスタックを使用しますが、入力は入力スタックで開始されます。Stax命令は、主に1文字または2文字のASCIIシーケンスです。それらの大部分はオーバーロードされています。つまり、それらの動作はスタックの上位のいくつかの値によって決定されます。

高レベルでは、このプログラムは最後の行に繰り返し文字列を追加することでグリッドを構築します。最後の行がいっぱいになると、グリッドが時計回りに回転します。最後に、グリッドを水平にミラーします。より詳細には、プログラムは次のように機能します。

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row

うわー、私は本当に挑戦がゴルフ言語のためのゴルフの最初の公共の外観を見ることに驚いています。ご支援ありがとうございました!今月の言語に興味がありますか?より多くのユーザーがそれを使用しており、すぐに候補リストに表示されることを期待しています!
ウェイジュン周

@WeijunZhou:これですか?私はそれが今までのものであることを知りませんでした。私はノミネートを気にしません。より確立された言語により適しているようですが、私は反対しません。
再帰的な

はい。あなたが言うように、それがより良く確立されたときに私はそれを指名するかもしれません。長くはならないことを願っています。
ウェイジュン周

「各行の見出しスペースは、一貫している限り重要ではありません」ので、必要に応じて別のバイトを保存できます。
ウェイジュン周

1
Staxを使用して提出したばかりです。必要に応じて、アドバイスを提供できます。編集:なんて偶然。私はあなたの提出物から学ぼうとします。
Weijun周

11

66 40 36バイト

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:テキストを入力として16バイトを保存しました。説明:

≔²η

t何らかの理由で2 秒から始めます。

FS«

パングラム内のすべての文字をループします。

F¬η«

もう角を曲がった?

1行下に移動します(または次の方向になります)。

印刷方向を時計回りに90度回転します。

⊞υη≔⊕÷Lυ²η

次の辺の長さを計算します。

¶»

カーソル位置の修正を完了します。(木炭は、コーナーの直前で終了するように側面を優先するため、コーナー自体で回転します。)

F⊕⌕βι

アルファベットの現在の文字の位置と同じ回数だけループします。

¿η«

角に達していない場合、

≦⊖ηι

カウントをデクリメントし、現在の文字を印刷します。


ありがとうございました。素晴らしい仕事と説明があります。ちょっとした誤植:何度か-> 3回。
周順周

仕様によると、この43バイトのバージョンも受け入れられます。tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/...
Weijun周

1
@WeijunZhouおかげで、私は前の質問でその条項に気付かなかった。
ニール

2

ルビー217の 212 209 208バイト

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

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

ポインターの管理にかなりの時間を費やしているので、ゴルフをする余地があるかもしれません。

-5バイト:入力するにパングラムを3倍にします。周We君に感謝ます。

-3バイト:入力文字列を埋め込み、最後のレッグを最初から生成する代わりに、最後のレッグをトリミングします。

-1バイト:使用 &&スローアウェイ値を持つ三項演算子の代わりにます。

説明:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}

1
素晴らしい投稿と明確な説明。rllambda の使用に感謝します。現在の回答に基づいて、最後の脚が...私は私のCは、サンプル出力を生成するためのスニペット書いたとき、それはなかったが、トラブルメーカーのようです
Weijun周

1
s*=3全体を保存し、0in ?:演算子を省略することもできるようです。tio.run/…–

1
@WeijunZhouああ、ヒントをありがとう。0ただし、それが必要です。そうしないと、Rubyがc+=1次の行からプルアップして、ほとんどの場合それを実行します。そして素敵な挑戦!
benj2240

あなたが正しいです。私は十分に注意していませんでした。感謝します。楽しんでくれてうれしいです。
ウェイジュン周
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.