Wie baue ich das?


21

Es gibt 21 Artikel in Mine dass Sie Handwerk nur mit Holz aus Holz gefertigt und Artikel:

Axt
Boot
Schüssel
Knopf
Brust
basteln Tisch
Tür
Zaun
Tor
Hacke
Leiter
Spitzhacke
Planken
Druckplatte
Schaufel
Zeichen
Platte
Treppe
Stock
Schwert
Falltür

Diese Liste geht davon aus, dass die 6 verschiedenen Arten von Holzbohlen / Platten / Türen / etc. Alle zählen als derselbe Gegenstand. Eine andere Möglichkeit ist die Annahme, dass Sie nur Zugang zu einer Holzart haben.

Jeder dieser 21 Gegenstände hat ein anderes Herstellungsrezept . Wir werden jedes dieser Rezepte als 2 × 2- oder 3 × 3-Raster der Zeichen darstellen .WPS. Das .ist ein leerer Handwerksplatz, Wist für Holz , Pist für Holzbretter und Sist für Stöcke . Für diese speziellen Gegenstände werden keine weiteren Zeichen benötigt.

Zum Beispiel ist dies das Rezept für eine Truhe :

PPP
P.P
PPP

Herausforderung

Schreiben Sie ein Programm, das genau wie oben den Namen eines unserer 21 Gegenstände enthält, und drucken Sie ein gültiges Herstellungsrezept für diesen Gegenstand aus.

Handwerksrezepte sind übersetzungsunabhängig. Wenn die Eingabe also zutrifft, sind fencebeide gültig:

PSP
PSP
...
...
PSP
PSP

Wenn ein Rezept in ein 2 × 2-Raster passt, können Sie es in einem 2 × 2- oder 3 × 3-Raster ausgeben. zB stick:

.P
.P
...
.P.
.P.

Rezepte können auch horizontal gespiegelt werden (um eine vertikale Symmetrielinie), obwohl dies nur für Axt, Hacke und Treppe einen Unterschied macht. zB hoe:

.PP
.S.
.S.
PP.
.S.
.S.

Daher muss Ihr Programm jedes Rezept ausgeben, das in das Raster passt und die richtige Form hat (Übersetzung und Spiegelung ignorieren). Dies sind alle Rezepte, die das offizielle Spiel erkennt. (Beachten Sie, dass Rezepte nicht vertikal gedreht oder gespiegelt werden können.)

Einzelheiten

  • Nehmen Sie Eingaben von stdin oder der Befehlszeile entgegen. Sie können davon ausgehen, dass die Eingabe immer gültig ist. Anführungszeichen für Eingaben (z "chest". B. ) sind in Ordnung.
  • Ausgabe auf stdout (oder die nächstgelegene Alternative) mit optionalem Zeilenumbruch.
  • Die kürzeste Übermittlung in Bytes gewinnt.

Beispiel

Hier ist eine Liste aller Ein- und Beispielausgaben:

axe
PP.
SP.
S..

boat
P.P
PPP
...

bowl
P.P
.P.
...

button
P.
..

chest
PPP
P.P
PPP

crafting table
PP
PP

door
PP.
PP.
PP.

fence
PSP
PSP
...

gate
SPS
SPS
...

hoe
PP.
S..
S..

ladder
S.S
SSS
S.S

pickaxe
PPP
.S.
.S.

planks
W.
..

pressure plate
PP
..

shovel
P..
S..
S..

sign
PPP
PPP
.S.

slab
PPP
...
...

stairs
P..
PP.
PPP

stick
P.
P.

sword
P..
P..
S..

trapdoor
PPP
PPP
...

1
Angesichts Ihrer Ausgabebeispiele sehe ich keine Ausnahme. Alle können gespiegelt werden, aber die meisten sind symmetrisch.
EDC65

Da "in Bytes" Links zu dem UTF-8 - Zähler, heißt das wir haben zählen Bytes in UTF-8?
Martin Ender

Nur vollständige Programme? Keine Funktionen?
Alex A.

@ Alex A. Richtig.
Calvins Hobbys

@ MartinBüttner Mach das nicht. (Du weißt warum, obwohl es wahrscheinlich nicht mehr wichtig ist.: P)
Calvins Hobbys

Antworten:


15

CJam, 100 96 94 91 Bytes

"+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/l72b970%={Z"O>HVa=4a"98bZb+"P.SW"f=3/=}%N*

In StackExchange werden nicht druckbare Dateien gemangelt, sodass hier nicht kopiert und eingefügt wird, sondern der Permalink . Zusätzlich ist hier das Testprogramm .

(Danke an @Optimizer für die Information fund an @ MartinBüttner für die Information über die Modulo-Indizierung von CJam.)

Cygwins hexdump:

0000000 0122 2b1e 571a 6308 621f 4b05 2046 5141
0000010 1608 1848 5f3b 1115 1d7b 4d47 4c38 6679
0000020 5f3d 6d74 0c54 226e 3431 6231 6244 2f33
0000030 376c 6232 3739 2530 7b3d 225a 1b4f 483e
0000040 6156 343d 2261 3839 5a62 2b62 5022 532e
0000050 2257 3d66 2f33 7d3d 4e25 002a          
000005b

Erläuterung

Um die Rezepte zu konstruieren, verwenden wir 13 verschiedene Zeilen (auch aufgeführt sind Erklärungen, warum dies minimal ist):

0    W..    (required by planks)
1    ...    (required by many)
2    .PP    (required by many)
3    PPP    (required by chest)
4    .P.    (required by bowl)
5    ..P    (required by stairs)
6    S.S    (required by ladder)
7    SSS    (required by ladder)
8    .S.    (required by sign)
9    .SP    (required by axe)
10   P.P    (required by bowl)
11   PSP    (required by fence)
12   SPS    (required by gate)

Wir kodieren die Zeilen über Z"O>HVa=4a"98bZb+"P.SW"f=3/, was gibt

["W.." "..." ".PP" "PPP" ".P." "..P" "S.S" "SSS" ".S." ".SP" "P.P" "PSP" "SPS"]

Das erste Bit "+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/kodiert die Rezepte und gibt

[[3 3 8] [1 0 0] [1 0 0] [3 8 8] [1 3 3] [2 8 8] [6 7 6] [1 0 0] [1 10 3] [1 1 2] [2 2 2] [1 11 11] [1 1 4] [1 0 1] [1 10 4] [2 9 8] [3 10 3] [1 2 2] [4 8 8] [1 4 4] [1 1 3] [1 12 12] [4 4 8] [5 2 3]]

Beachten Sie, wie der erste Eintrag lautet [3 3 8], für den das Rezept gilt sign.

l72b970%=Liest die Eingabe ein und wendet dann etwas Magie an, um herauszufinden, welches Rezept aus der Liste genommen werden soll. Obwohl wir nur 21 Rezepte haben, gibt es 24 in der Liste - die wenigen zusätzlichen Stellen entsprechen den [1 0 0]s.

Nachdem wir die Eingabe gelesen, das Rezept ausgewählt und das Rezept in Zeilen konvertiert haben, fügen wir einige neue Zeilen ein N* und drucken sie automatisch aus.


CJam, 89 86 83 Bytes

'W"9=!%)S@*m:@DQzk?V$%qyR55AmVEpPNW}"132b3b"P.S"f=+3/3/l57b5342%24%(=N*

... es stellt sich heraus, dass die Hardcodierung aller Ausgaben in CJam etwas besser funktioniert. Ich bin ziemlich enttäuscht.

Wir haben wieder einige nicht druckbare Dateien, hier ist der Permalink und Testprogramm .

Cygwins hexdump:

0000000 5727 0222 3d39 1021 2925 531e 2a40 6d0b
0000010 403a 1844 7a51 3f6b 2456 7125 5279 3506
0000020 4135 046d 1a56 7045 1550 164e 1057 7d01
0000030 3122 3233 3362 2262 2e50 2253 3d66 332b
0000040 332f 6c2f 3735 3562 3433 2532 3432 2825
0000050 4e3d 002a                              
0000053

Erläuterung

Die Ausgänge werden unter Verwendung der Basis 3 mit dem Einzigen codiert W Einzelne an der Vorderseite angeheftet wird, bevor die Zeichenfolge in Sekunden aufgeteilt wird, um Reihen zu ergeben, und die Reihen in Dreiergruppen aufgeteilt werden, um Rezepte zu ergeben.

Wie oben wird zur Auswahl des Rezepts Basiskonvertierung und Modulo-Magie verwendet. Es gibt 22 Rezepte (eines davon nicht verwendet), aber wir müssen Modulo 24 verwenden, sodass wir 24%diese Zeit explizit angeben müssen, anstatt uns auf die Modulo-Indizierung zu verlassen.


Kannst du einen Hexdump mit posten xxd? Die Permalinks funktionieren nicht in Firefox.
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̸̡̅ẗ̵̨́

@ n̴̖̋h̴̖̋ã̷͉h̷̭̿d̷̰̀ĥ̷̳ Leider arbeite ich unter Windows, daher habe ich das nächstbeste Programm erstellt, das ich derzeit verwalten kann.
Sp3000,

6

JavaScript (ES6), 235 241 262

Bearbeiten Noch mehr von der Regel missbrauchen, dass Eingaben immer gültig sind: Es gibt nur ein Element, für das W erforderlich ist. Das Ausgangsraster wird also als 9-stellige Basis-3-Zahlen codiert.

235 Bytes mit E / A über Popup.

w=prompt();
"926a722boa182bo2b19520ch224c6056d644f448g764h7651l2294pi8pr758sh2915si26sl19172sta56st785s728t"
.replace(/(\d+)(\D+)/g,(c,p,m)=>w.search(m+z)||[for(c of'11\n11\n111')z+='.SP'[~~p%3]+(p/=3,-c?'':c)],z='');
alert(&&z||'W.\n..')

221 Bytes als testbare Funktion.

F=w=>"926a722boa182bo2b19520ch224c6056d644f448g764h7651l2294pi8pr758sh2915si26sl19172sta56st785s728t"
.replace(/(\d+)(\D+)/g,(c,p,m)=>w.search(m+z)||[for(c of'11\n11\n111')z+='.SP'[~~p%3]+(p/=3,-c?'':c)],z='')&&z||'W.\n..'

Ausgabe immer als 3x3 Raster. Mit 4 verfügbaren Ausgangssymbolen wird das Raster als 3x3x2 (18) Bit-Nummer codiert. Und da die Eingabe immer gültig sein muss, werden die Zeichenfolgen auf das absolute Minimum gekürzt gespeichert.

Test In der Firefox / FireBug-Konsole

;["axe", "boat", "bowl", "button", "chest", "crafting table", "door", 
 "fence", "gate", "hoe", "ladder", "pickaxe", "planks", "pressure plate", 
 "shovel", "sign", "slab", "stairs", "stick", "sword", "trapdoor"]
.forEach(v=>console.log(v+'\n'+F(v)))

Ausgabe

axe
PP.
SP.
S..

boat
P.P
PPP
...

bowl
P.P
.P.
...

button
P..
...
...

chest
PPP
P.P
PPP

crafting table
PP.
PP.
...

door
PP.
PP.
PP.

fence
PSP
PSP
...

gate
SPS
SPS
...

hoe
PP.
S..
S..

ladder
S.S
SSS
S.S

pickaxe
PPP
.S.
.S.

planks
W.
..

pressure plate
PP.
...
...

shovel
P..
S..
S..

sign
PPP
PPP
.S.

slab
PPP
...
...

stairs
P..
PP.
PPP

stick
P..
P..
...

sword
P..
P..
S..

trapdoor
PPP
PPP
...

2

Python, 305 Bytes

n=2**(23-hash(raw_input())/535366%24);print "W..\n...\n..." if n==1024 else "\n".join(["".join(['P' if [16706041,9740732,7635081,7399784,5267501,7372808,57344,57344,49152][j+i*3]&n==n else 'S' if [6,2097152,6,131078,10748162,6,131138,9699584,2][j+i*3]&n==n else '.' for j in range(3)]) for i in range(3)])

Erläuterung

# Compute a unique number for each item.
# 535366 and 24 are precalculated values that were bruteforced.
n = 23 - hash(raw_input()) / 535366 % 24

# Use precalculated tables that represent which ingredient in this recipe of
# an item. The nth bit of p[0] will be set if the first ingredient of the item
# associated with the unique number n is some planks. It works the same for s.
p = [16706041,9740732,7635081,7399784,5267501,7372808,57344,57344,49152]
s = [6,2097152,6,131078,10748162,6,131138,9699584,2]

# Handle planks differently, as it is the only one using wood.
if n == 10:
    print "W..\n...\n..."
else:
    for i in xrange(3):
        line = ""
        for j in xrange(3):
            # Now we can check if the ingredient is some planks...
            if p[j + i * 3] & 1 << n == 1 << n:
                line += 'P'
            # ...or if it is some sticks...
            elif s[j + i * 3] & 1 << n == 1 << n:
                line += 'S'
            # ...or if it is simply empty.
            else:
                line += '.'
        print line

Kommentar

Dieser Code ist sicherlich nicht der kleinste, aber er funktioniert einwandfrei. Ich bin zufrieden. :)

Python, 282 Bytes

n=hash(raw_input())/808789215%21;print "\n".join(["P.PPPP...P..S..S..PP.......PP.PP....P........SPSSPS...PPPPPP.S.PP.PS..S.W........PPPPPP...PP..S..S.P..PP.PPPS.SSSSS.SPPP.S..S.PPP......P..P..S..PPPP.PPPPPSPPSP...PP.PP.PP.P..P.....P.P.P...."[9*n+i*3:9*n+(i+1)*3] for i in range(3)])

Verwenden der gleichen Technik zum Generieren eines eindeutigen Bezeichners, aber direktes Nachschlagen des Rezepts in einem Array. Es ist viel einfacher und ein bisschen kompakter als mein erster Code.


Wenn Sie einen Sonderfall für "Bretter" haben, können Sie die Zeichenfolge um W.\n..
19:43 Uhr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.