ビーコンを構築する


8

ビデオゲームMinecraftでは、ビーコンを取得してピラミッドのような構造物に配置し、速度やジャンプブーストなどの特殊効果を与えることができます。

あなたの仕事は、効果を考慮して、それに必要なビーコンピラミッドを構築することです。

さまざまな効果に必要なビーコンピラミッドには複数のサイズがあります。最大のものはサイズ9ベースがあり、最小のものはサイズ3ベースがあります。

これらはあなたが得ることができる効果とそれらに必要なピラミッドです(公式のMinecraft wikiで指定されています:

3:
  Speed I
  Haste I
5:
  Resistance I
  Jump Boost I
7:
  Strength I
9:
  Regeneration I
  Resistance II
  Jump Boost II
  Speed II
  Haste II
  Strength II

ビーコンは下部をベースにして構築され、その後ベースが上がり、サイズが2減少します。1に到達する+と、上部にビーコンがあるはずです。

ビーコンはとして定義され+ますが、機能するにはサポートピラミッドが必要です。

入力は有効である(つまり、ここで指定された効果の1つである)と想定でき、オプションで、入力はすべて小文字であると想定できます。#文字はピラミッドに使用すべきであり、+ビーコンとして。

例:

Haste I
 +
###

Resistance I
  +
 ###
#####

Strength I
   +
  ###
 #####
#######

Regeneration I
    +
   ###
  #####
 #######
#########

Speed II
    +
   ###
  #####
 #######
#########

ビーコンピラミッドはブロックを共有できるため、複数の効果を実行する必要もありますが、1つのビーコンで複数の効果を実行することはできません。最小限のブロックを使用する必要があります。

複数の効果をとる場合、リスト、改行区切りなどの適切な入力形式を使用できます。さらに、リストを使用している場合は、単一のビーコンに対してシングルトンリストを使用できます。

これらの例では、可能な解決策を1つだけ挙げていますが、許容できる解決策は複数あります。

Speed I, Haste II
    ++
   ####
  #####
 #######
#########
(another acceptable solution is the following,
these are both valid as they use the same amount of blocks)
    +
   ###
  #####
 #######+
##########
(the following is not valid for the same input; it doesn't use minimal blocks)
    +
   ###
  #####           +
 #######         ###
#########

Strength I, Strength I
   ++
  ####
 ######
########

(それが十分に明らかでない場合は、括弧で出力しないでください)


この課題のほとんどはピラミッドの組み合わせに関するもののようですが、そのためのルールを説明していません(それらがブロックを「共有」できる場合、なぜより大きなブロックを出力できないのですか?)。(また、あなたが「できるはず」を意味すると思うとき、私たちは複数を取るかもしれないと言います)
ジョナサン・アラン

@JonathanAllanが明確になりました。
Okx

いいえ、結合のルールはまだわかりません...
ジョナサンアラン

@JonathanAllan私は、1つのビーコンが複数の効果を行うことはできないと述べました。それは十分に明確ではありませんか?
Okx

3
私がこれを最初に見たとき、それは取るに足らないことだと思いました。それから、複数のビーコン効果があるという部分を見ました。:P
HyperNeutrino

回答:


9

Pythonの2216の 195バイト

def b(e):s=sorted(63372>>len(_)*2-14&3for _ in e)[::-1];f=s[0]+2;r=range(f);print"\n".join(reduce(lambda p,n:[p[i]+"+# "[cmp(i,f-n-2)]for i in r],s[1:],[" "*(f-i-1)+"+#"[i>0]*(2*i+1)for i in r]))

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

ピラミッド構造の文字列を出力する関数はですb。これは、効果のリストを単一の引数として呼び出されます。

これは予想よりも長くなりましたが、黒魔術に基づいてビーコンのサイズを見つけることができて、少なくとも幸せでした。

編集:lambda Python 2のcmp機能により、reduce関数をおかげでバイト数を大幅に減らすことができました。


4
黒魔術は
順調

7

チャコール75 71 60 54 48バイト

A⟦⟧βWS⊞βI§14034244⁻Lι⁷FUPsorted⟦β⟧«G→→↖⁺ι¹#¦+Mι↙

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

Pythonの答えも私のものですが、私はチャコールで最初のゴルフの提出を試したかったのです!

私はまた、その恵みを抑えられるようにしたかったのです;)

A⟦⟧β                        assign an empty list to β
WS                         while the next string input ι is truthy: (aka while the input is not an empty line)
    ⊞βI§14034244⁻Lι⁷       push level for ι into β (explained below)
FUPsorted⟦β⟧«             for each level ι in the sorted version of β:
    G→→↖⁺ι¹#                draw a triangle of "#"s with side lengths ι + 1
    ¦+                       draw a "+" (already on top vertex)
    Mι↙                     move down and left by ι cells (preparation for next level)
                             implicit end of for

同じ長さのすべてのビーコン名は、ビーコンレベルを共有します。そのため、長さ(マイナス7をゼロにするために)を文字列 "14034244"の数値にマッピングすることで、エフェクトのビーコンレベルを決定できます(長さ9はエフェクトに対応しないため、明確にするために0があります) )。これと同じ考え方がPythonの回答でも使用されていますが、ビットシフトを使用して0〜3の数値を生成します。


1
チャコールをご利用いただきありがとうございます!また、私は追加することをお勧めしたい-aあなたにもTIOリンクでの説明のようなものをしたい場合はASTを印刷するためのフラグを
ASCIIのみの

1
また、48バイト入力nilaryオペレータに変数への入力を変えることから、
ASCIIのみの

1
注、私はすぐにそう更新されますWS⊞υI§14034244⁻Lι⁷F▷sυ«G→→↖⁺ι¹#¦+Mι↙ので、念頭に置いておくことに有効になりますυし、▷s新しいなります
ASCIIのみ

ヒントをありがとうございました!チャコールでもっとゴルフを楽しみにしています:D
notjagan

2

ゼリー、68バイト

FṀ‘
0;Ṗ
|Ç€|Ḋ€Ç|
⁽lƑb4‘ị@L€ṢµI‘ż@IṚṭṀṭ0Fs2+\µḅÑ‘Ṭ;0sѵ+ÇÐLị“#+ ”Y;”#

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

これがCharcoalの回答よりも長い理由(私が10バイトで「ブラックマジック」を実行できたとしても)は、Charcoalが2次元描画用に作成されたためだと思います。2Dセルオートマトンに依存して終了し、#sの位置を指定してs の位置を見つけて+三角形を作成しました。

仕組み(読みやすくするためにメインリンクを分割)

FṀ‘
0;Ṗ
|Ç€|Ḋ€Ç|
⁽lƑb4‘ị@L€ṢµI‘ż@IṚṭṀṭ0Fs2+\µḅÑ‘Ṭ;0sѵ+ÇÐLị“#+ ”Y;”# - Main link, input is list of strings
⁽lƑb4‘ị@L€Ṣ     - list of strings to list of heights (1,2,3,4)
⁽lƑ               - the number 28147
   b4‘            - base 4 and incremented: [2, 3, 4, 2, 4, 4, 1, 4]
        L€        - lengths of each input string
      ị@          - index into the list to get a list of heights
          Ṣµ      - sort and store for the next link:
I‘ż@IṚṭṀṭ0Fs2+\ - get list of coordinates for `+`s
I‘ż@I             - [0,1] between each element. Add [1,1]*n between each pair of elements with difference n
     Ṛ            - Reverse
      ṭṀṭ0        - prepend [0,maximum]
          Fs2     - format the array as a list of coordinate pairs
             +\   - cumulative sum
ḅÑ‘Ṭ;0sÑ        - convert to binary rectangular matrix:
ḅÑ‘               - change each coordinate pair (y,x) to y*width+x (Ñ is the width)
   Ṭ              - boolean array with 1s at the above indices
    ;0            - append a zero for formatting reasons
      sÑ          - split into rows of the right width
µ+ÇÐL           - add locations of `#`s:  the matrix now has 2s at future `+`s, 1s at `#`s, and `0`s at spaces
  ÇÐL             - repeatedly apply a step of the cellular automoton: 1s at `#`s and `+`s, and 0s at space
µ+                - add this to the matrix of `+`s which has 1s at `+`s.
ị“#+ ”Y;”#      - format into a string
ị“#+ ”            - index into the string "#+ ".
      Y           - join by newlines.
       ;”#        - append a `#` character to finish up the formatting.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.