対称てんとう虫


22

前書き:

てんとう虫について考えるとき、私たちは通常、黒い斑点を持つ赤または暗いオレンジ色のバグを考えます。ありますので、これは、本当の必要はありませんが、黒、赤/オレンジとてんとう虫発見、または全てのスポットなしにてんとう虫を、私たちは主にてんとう虫にこのアジアのてんとう虫のようなものを想像:

ここに画像の説明を入力してください

注意すべきもう一つのことは、てんとう虫のスポットがほぼ常に対称的であることです。そして、それがこの挑戦の出番です。

チャレンジ:

整数n>= 0)が与えられた場合、対称スポットが両側で均等に分割された2つ以上のてんとう虫とともに、次のASCIIアートてんとう虫を1回または複数回出力します。

デフォルトのてんとう虫のレイアウトは次のとおりです。

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

の場合n=0、上記のテントウムシをそのまま出力します。

場合はn、ゼロよりも大きい場合、我々はどちらか小文字でアスキーアートのバグのスペースを埋めるo、または交換する|資本金の中心にO。目標はn、「空の」てんとう虫に変更を加えながら、対称的な出力(てんとう虫ごと)を生成し、できるだけ少ないてんとう虫を出力することです。

の有効な出力n=1は次のとおりです。

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

しかし、これは無効です:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

有効な出力は次のn=2とおりです。

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

n1つのてんとう虫にもう収まらない最初のものはn=24。その場合、可能な限り均等に2つのてんとう虫に分割する必要があります(それらを隣り合わせに出力するか、下に出力するかを選択できます-オプションで1つのスペースまたは1つの改行を間に挿入します)。例えば:

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

または:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

チャレンジルール:

  • nの範囲になり0-1000ます。
  • STDOUTに出力するか、文字列または2D-char配列/リストなどとして返すかを選択できます。呼び出し。
  • 先頭の改行または不要な空白は許可されません。末尾の空白と単一の末尾の改行が許可されます。
  • 上記のように、2つ以上のてんとう虫が必要な場合、それらを隣り合わせに出力するか、下に出力するか(または両方を組み合わせて出力するか)を選択できます。
  • 2つ以上のてんとう虫が隣り合って印刷される場合、間に1つのオプションのスペースを入れることができます。2つ以上のてんとう虫が互いに印刷される場合、その間に1つのオプションの改行が許可されます。
  • てんとう虫のレイアウトは、それらが対称的でinputに等しい限り、シーケンス中の任意のステップで選択できますn
  • 目標はn変更を行い、可能な限りてんとう虫を少なくすることなので、上記の時点で複数のてんとう虫の使用を開始しますn=23。これらのてんとう虫のレイアウトは同じである必要はありません。実際、これは、2つの名前を指定しn=25たり入力したりn=50することもできません。
  • また、ドットを2つ以上のてんとう虫に均等に分割できない場合があります。その場合、可能な限り均等に分割する必要がありますが、それらの違いはせいぜい1です。

したがってn=50、最後の2つのルールを念頭に置いて、これは有効な出力になります(最初のバグには16個のスポットがあり、他の2つには17個のスポットがある)。

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを持つ関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

空のてんとう虫に対する「可能な限り少ない変更」とはどういう意味ですか?1つのてんとう虫にn(<24)文字o / Oを配置する場合、n個の変更を加えます。または、n-1からnへの変化を意味しますか(したがって、入力が1だけ変化しても出力はできるだけ変化しません)?
ハイムダル

@Heimdall悪い言葉遣いによる混乱のためにすみません。これは、このチャレンジを考えたときに複数のキャラクターが1つのスポットを形成できるようにするというアイデアを持っていたときでしたが、これを落としoO代わりに使用しました。言葉遣いを少し変えました。
ケビンCruijssen

たとえば、n=50最初のバグには16個のスポットがあり、他の2個にはそれぞれ17個あることを意味すると思います
ジョンクラウス

これは私のお気に入りのジミ・ヘンドリックスのアルバムです。
モニカiamnotmaynardを

@iamnotmaynard明らかな何かを見逃しているのでしょうか、それとも間違った課題についてコメントしましたか?私は本当に..ジミ・ヘンドリックスとてんとう虫との間のリンクが表示されない
ケビンCruijssen

回答:


5

84 81バイト

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ

スポットの総数を入力します。

≔⌈∕∨θ¹¦²³η

必要なテントウムシの数を計算します。

Fη«

各テントウムシをループします。

≔⁺÷θη‹ι﹪θηζ

このテントウムシに付けるスポットの数を計算します。

V_¶I@)↘²↙|/←''-↑!

テントウムシの頭と右翼を印刷します。

↑⎇›ζ²¹OO²

21を超えるスポットがある場合は2つのスポットを印刷し、そうでない場合は裏面を印刷します。

§|Oζ

スポットの数が奇数の場合は別のスポットを印刷し、そうでない場合は背中の残りを印刷します。

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

スポットの数を2で除算し、3、4、および3スポットの3列に分配します。

↙»

次のテントウムシの先頭に移動します。

‖B←

キャンバスを左に向けて、後ろを保持します。


8

Pythonの2252の 249 238 212 211 213 209バイト

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

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

  • Kevin Cruijssenのおかげで9バイト節約
  • Mr. Xcoderのおかげで18バイト節約
  • Jonathan Frechのおかげで2バイト節約

を削除して代わりに.replace('A','|O'[b%2])使用できると思いますc=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"か?
ケビンCruijssen

230バイト回して[' o','|O'][i>9]' |oO'[i>9::2]及び使用|の代わりに、論理和。またfor i in range(11)execステートメントに目を向けると、4バイト節約されました。
ミスターXcoder

1
そして、コメントの混乱のために申し訳ありませんが、リストの理解とループを混ぜて、不要な変数も削除することにより、218バイトforです。
ミスターXcoder

@ Mr.Xcoderどうもありがとう:)
TFeld

それは可能な限り少ないてんとう虫を生産することになっています、そうではありませんか?TIOに24〜46を入力すると、2つではなく3つのてんとう虫が発生します。
ニックマッテオ

7

JavaScript(ES6)、183 186バイト

TFeldの答えと同じ式を使用して、てんとう虫の間でスポットを分割します。

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

デモ


6

Befunge、292 279バイト

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

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

説明

てんとう虫のASCIIアートは、15個のオフセットがある単一のBefunge文字列にエンコードされ、最初の15個の印刷可能な文字を特別な目的のために予約できます。これらの特殊文字の最初の2つは、改行と文字を表します|。両方ともそうでなければ印刷できません。3番目は"文字列で使用できないであるため、使用されません。次の2つは、中央の大きなスポットを表しています。残りの10個は、翼上のスポット用です。

これらの特殊文字は、ルックアップテーブルを介して最終形式に変換され、最初の行の最初の部分に書き込まれます。

説明を簡単にするために、これはさまざまなコンポーネント部分が強調表示されたコードです。

実行パスが強調表示されたソースコード

*|ルックアップテーブルの改行と文字は定数であるため、これらを初期化することから始めます。
*次に、stdinからスポットの数を読み取り、必要なてんとう虫の数を計算します。
*次に、一連のバグの外側のループを開始して、レンダリングされる次のてんとう虫のスポット数を計算します。
*てんとう虫ごとに、大きな中央スポットを表示する必要があるかどうかを計算し(if spots%2 == 1)、適切な値をルックアップテーブルに書き込みます。
*同様に、他の大きなスポットのペアを表示する必要があるかどうかを計算し(もしspots/2 > 10)、再びルックアップテーブルを更新します。各翼に必要な残りのスポットも計算します。
*ルックアップテーブルの初期化の最後の部分は、表示する必要がある小さなスポットを計算するループです。基本的に、アルゴリズムは次のとおりです。ifの場合(spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10、スポットを表示する必要があります。
*次に、エンコードされたてんとう虫の文字列表現をスタックにプッシュします。これは基本的に単純な文字列ですが、ソースが長方形を形成するようにコードの隙間に詰め込もうとしたため、少し複雑になりました。
*この時点で、出力ループを開始し、文字を1つずつ処理し、以前に作成したルックアップテーブルを介して特殊なケース(スポット、改行など)を変換する準備ができました。
*最後に、必要なすべてのてんとう虫を表示したかどうかを確認します。表示していない場合は、外側のループの先頭に戻ります。


ニース、私はあなたのてんとう虫が1-23の各段階で持っているパターンが本当に好きです。他の回答のいくつかとはまったく異なります。私から+1。説明を追加していただけませんか(おそらく、さらにゴルフをした後)。
ケビンCruijssen

1
パターンが気に入ってうれしいです。実際には、できるだけ多くの段階で見栄えの良いアルゴリズムを見つけるために、さまざまな組み合わせを試すのにかなりの時間を費やしました。また、私の答えに少し説明を加えました。
ジェームズホルダーネス

3

ルビー203の 193 190バイト

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

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

  • Jordanのおかげで10バイト節約

{|m|m.に置き換えることができます{$&.; b=(n-1)/23+1に置き換えることができますb=1+~-n/23; およびx=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}に置き換えることができますx=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}
ヨルダン

あなたは使用して別のバイトを保存することができます%q{XY}代わりに'X'+"Y"行って、最初の8行にカップルより多くd=n>0?n/(b=1+~-n/23):b=0の代わりにn>0?d=n/(b=(n-1)/23+1):d=b=0
ヨルダン

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