Baue ein Leuchtfeuer

8

Im Videospiel Minecraft können Sie Leuchtfeuer erhalten und auf pyramidenähnlichen Strukturen platzieren, um Spezialeffekte wie Geschwindigkeit oder Sprungschub zu erzielen.

Ihre Aufgabe ist es, bei einem bestimmten Effekt die dafür erforderliche Leuchtfeuerpyramide zu konstruieren.

Es gibt mehrere Größen von Leuchtfeuerpyramiden, die für verschiedene Effekte erforderlich sind. Der größte hat eine Größenbasis 9und der kleinste hat eine 3Größenbasis.

Dies sind die Effekte, die Sie erzielen können, und die dafür erforderliche Pyramide (wie im offiziellen Minecraft-Wiki angegeben:

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

Beacons werden mit der Basis unten konstruiert, dann geht es nach oben und verringert die Größe um 2. Sobald wir 1 treffen, sollte sich oben ein Beacon befinden +.

Ein Leuchtfeuer ist als definiert +, benötigt jedoch eine tragende Pyramide, um zu funktionieren.

Sie können davon ausgehen, dass die Eingabe gültig ist (dh es handelt sich um einen der hier angegebenen Effekte), und optional können Sie davon ausgehen, dass die Eingabe nur in Kleinbuchstaben geschrieben ist. Der #Charakter sollte in der Pyramide und +als Leuchtfeuer verwendet werden.

Beispiele:

Haste I
 +
###

Resistance I
  +
 ###
#####

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

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

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

Sie müssen auch mehrere Effekte ausführen, da Beacon-Pyramiden Blöcke gemeinsam nutzen können. Ein Beacon kann jedoch nicht mehr als einen Effekt ausführen. Sie müssen minimale Blöcke verwenden.

Wenn Sie mehrere Effekte verwenden, können Sie jedes vernünftige Eingabeformat verwenden, z. B. eine Liste, eine durch Zeilenumbrüche getrennte Zeile usw. Außerdem können Sie eine Singleton-Liste für einzelne Beacons erstellen, wenn Sie Listen verwenden.

Für diese Beispiele liste ich nur eine mögliche Lösung auf, aber es gibt mehrere akzeptable Lösungen.

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
   ++
  ####
 ######
########

(Geben Sie keine Dinge in Klammern aus, wenn dies nicht offensichtlich genug ist.)

Okx
quelle
Es scheint, dass der größte Teil dieser Herausforderung das Kombinieren der Pyramiden betrifft, aber Sie beschreiben nicht die Regeln dafür (wenn sie Blöcke "teilen" können, warum können wir dann nicht einfach den größeren ausgeben?). (Auch Sie sagen, wir "können" mehrere nehmen, wenn ich denke, Sie meinen "müssen in der Lage sein")
Jonathan Allan
@ JonathanAllan geklärt.
Okx
Nein, ich kenne die Regel zum Kombinieren immer noch nicht ...
Jonathan Allan
@ JonathanAllan Ich sagte, dass ein Leuchtfeuer nicht mehr als einen Effekt erzielen kann. Ist das nicht klar genug?
Okx
3
Als ich mir das zum ersten Mal ansah, dachte ich, es wäre trivial, und dann sah ich den Teil über mehrere Beacon-Effekte. : P
HyperNeutrino

Antworten:

9

Python 2 , 216 195 Bytes

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]))

Probieren Sie es online aus!

Die Funktion zum Drucken der Zeichenfolge mit der Pyramidenstruktur lautet b: Diese wird mit einer Liste der Effekte als einzelnes Argument aufgerufen.

Dies stellte sich länger als erwartet heraus, aber ich war zumindest froh, dass ich die Leuchtfeuergröße basierend auf schwarzer Magie finden konnte.

Bearbeiten: konnte die Anzahl der Bytes erheblich reduzieren, indem die Reduzierungsfunktion lambdadank der cmpFunktion von Python 2 zu einer Funktion kombiniert wurde .

notjagan
quelle
4
Gut gemacht mit deiner schwarzen Magie;)
Okx
7

Holzkohle , 75 71 60 54 48 Bytes

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

Probieren Sie es online aus!

Die Python-Antwort ist auch meine, aber ich wollte meine erste Golf-Einreichung in Charcoal versuchen!

Ich wollte auch sicherstellen, dass ich dieses Kopfgeld halten kann;)

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

Alle Beacon-Namen derselben Länge teilen sich eine Beacon-Ebene. Als solches können wir den Beacon-Pegel eines Effekts bestimmen, indem wir die Länge (minus 7, um sie auf Null zu setzen) den Zahlen in der Zeichenfolge "14034244" zuordnen (aus Gründen der Klarheit gibt es eine 0, da die Länge 9 keinem Effekt entspricht ). Dieselbe Idee wird in meiner Python-Antwort verwendet, jedoch mit Bitverschiebung, um die Zahlen 0-3 zu erzeugen.

notjagan
quelle
1
Vielen Dank für die Verwendung von Holzkohle! Außerdem würde ich empfehlen, das -aFlag zum Drucken des AST hinzuzufügen, wenn Sie auch eine Art Erklärung im TIO-Link wünschen
ASCII-
1
Außerdem 48 Bytes , vom Ändern der Eingabe in eine Variable zum Eingabe-Null-Operator
ASCII-only
1
Beachten Sie , werde ich bald so werden die Aktualisierung WS⊞υI§14034244⁻Lι⁷F▷sυ«G→→↖⁺ι¹#¦+Mι↙wird gültig , so denken Sie daran , dass υund ▷swird neu
ASCII-only
Vielen Dank für die Tipps! Ich freue mich darauf, mehr in Charcoal zu spielen: D
notjagan
2

Gelee , 68 Bytes

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

Probieren Sie es online aus!

Ich denke, der Grund, warum dies länger ist als die Antwort von Charcoal (obwohl ich meine 'schwarze Magie' in 10 Bytes ausführen konnte), ist, dass Charcoal für zweidimensionales Zeichnen gebaut wurde. Ich endete abhängig von einem 2D-Zellularautomaten, um die Positionen von #s zu finden, wobei die Positionen von s gegeben wurden +, um Dreiecke zu erzeugen.

Wie es funktioniert (Hauptlink zur besseren Lesbarkeit aufgeteilt)

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.
fireflame241
quelle