In dem Videospiel Minecraft geht es darum, verschiedene Arten von Blöcken in dem 3D- Ganzzahlgitter , aus dem die virtuelle Welt besteht, zu platzieren und zu entfernen . Jeder Gitterpunkt kann genau einen Block enthalten oder leer sein ( offiziell ein " Luft " -Block). In dieser Herausforderung werden wir uns nur mit einer horizontalen 2D-Ebene der 3D-Welt und einem Blocktyp befassen: Truhen .
Mit Truhen können Spieler Gegenstände lagern. Wenn zwei Truhen in derselben horizontalen Ebene orthogonal nebeneinander liegen, verbinden sich ihre Texturen und es bildet sich eine doppelte Truhe mit der doppelten Kapazität. Nichts größer als eine doppelte Truhe kann gemacht werden; es gibt keine dreifachen oder vierfachen Truhen.
Ein Brustblock kann nur in einem leeren Gitterpunkt platziert werden, wenn seine vier orthogonal benachbarten Punkte alle leer sind oder wenn genau einer einen Brustblock enthält, der nicht bereits Teil einer doppelten Brust ist. Diese Platzierungsregeln stellen sicher, dass es niemals zu Unklarheiten darüber kommen kann, welche Brustblöcke sich zu doppelten Truhen verbinden.
Angenommen, es .
ist ein leerer Raum und C
eine Truhe: (Die Zahlen sind ebenfalls ein leerer Raum und dienen nur zu Identifikationszwecken.)
.......C..
.1.C2.C3..
........5C
.CC4..CC..
..........
- Eine Truhe kann auf Platz 1 gelegt werden, da ihre 4 Nachbarn leer sind.
- Eine Truhe kann in Punkt 2 platziert werden, da die benachbarte Truhe (noch) nicht Teil einer doppelten Truhe ist.
- Eine Truhe kann nicht in Position 3 platziert werden, da es Unklarheiten darüber geben würde, wie sich die doppelte Truhe bildet.
- Eine Truhe kann nicht in Position 4 platziert werden, da die benachbarte Truhe bereits Teil einer doppelten Truhe ist.
- Eine Truhe kann in Position 5 platziert werden. Die diagonal benachbarte Doppel-Truhe hat keinen Einfluss auf irgendetwas.
Angenommen, der Bereich jenseits des Gitters ist leer, ändert sich jeder Bereich .
des Gitters in einen, *
wenn dort eine Truhe platziert werden könnte:
******.C**
***C**C.**
*..***..*C
.CC.*.CC.*
*..***..**
*
Natürlich können nicht alle Räume gleichzeitig mit Truhen belegt werden, aber wenn Sie nur eine Truhe hätten, könnten Sie diese in eine der Truhen stellen.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die ein .
und C
-Raster enthält, und ändern Sie jedes .
in ein, *
wenn eine Truhe dort platziert werden könnte, um das resultierende Raster zu drucken oder zurückzugeben.
Die Eingabe kann von stdin oder einer Datei oder als Zeichenfolgenargument für eine Funktion erfolgen.
Sie können davon ausgehen, dass die Eingabe gut strukturiert ist, dh ein perfekt rechteckiges Textgitter , das mindestens 1 Zeichen breit und hoch ist und nur Folgendes enthält,
.
undC
Sie können optional davon ausgehen, dass nach der letzten Zeile eine nachgestellte neue Zeile steht (und in der Ausgabe möglicherweise eine ).Sie können davon ausgehen, dass die Anordnung der Truhen in der Eingabe den obigen Regeln entspricht. Es wird niemals Unklarheiten darüber geben, welche Truhen Doppel-Truhen bilden.
Falls gewünscht, können Sie drei verschiedene verwenden druckbaren ASCII - Zeichen anstelle von
.
,C
, und*
. Sie dürfen anstelle von Zeilenumbrüchen nichts anderes verwenden.Alle Truhen sind normale Truhen. Nicht eingeschlossene Truhen oder Ender-Truhen .
Wertung
Die Einsendung mit den wenigsten Bytes gewinnt.
Versuchen Sie für eine Minecraft-bezogene Herausforderung, die etwas schwieriger ist, Nether Portal Detection .
Antworten:
CJam,
82 76 66 62 5854 BytesEingabeformat erwartet
0
für Luftzelle und8
für eine Brustzelle. Die Ausgabe enthält1
für alle Zellen, die mit einer Truhe platziert werden können.UPDATE :
Fehler behoben. Erhöht um 3 Bytes :(weiter golfen :). 4 Bytes gespart dank @ Sp3000Beispiel Eingabe:
Ausgabe:
Ich glaube, ich bin jetzt mit dem Golfen fertig ...
Erläuterung
Probieren Sie es hier online aus
quelle
.NET Regex ( Retina ),
434416310 + 1 = 311 ByteNach der letzten Herausforderung, die ich in Regex beantwortet habe (der Nether Portal-Herausforderung, die mit dieser Herausforderung verknüpft ist), habe ich mich endlich daran gemacht, ein Befehlszeilentool zu schreiben, das als Interpreter für reguläre Ausdrücke im .NET-Stil fungiert, damit ich Fragen beantworten kann mit Regex, ohne herausgefordert zu werden, dass sie keine eigenständige Sprache sind. Ich habe es Retina genannt.
Nun, diese Herausforderung eignet sich nicht sehr gut für eine Regex-Einreichung, aber ich musste jetzt nur noch Retina verwenden. ;) (Plus, Sp3000 forderte mich auf, dies im Chat zu tun.) Also hier ist es:
Regex-Datei
Ersatzdatei
Die Regex-Datei ist meist nur die Regex-Datei, mit der Ausnahme, dass
`
Sie einige Optionen in die Datei einfügen können, in diesem Fall einfach den Mehrzeilenmodus. Bei zwei Dateien nimmt Retina automatisch den Alle-Ersetzen-Modus an. Diese beiden Dateien definieren ein Programm, das die Eingabe von STDIN liest und das Ergebnis an STDOUT ausgibt.Sie können es auch mit RegexHero und RegexStorm testen . Der reguläre Ausdruck funktioniert sowohl mit als auch ohne nachfolgende Zeilenumbrüche und wird
_
anstelle von verwendet.
. (Anscheinend hat RegexStorm gelegentlich Probleme, wenn keine nachgestellte Zeile vorhanden ist, aber RegexHero scheint mit beiden Fällen in Ordnung zu sein.)Es gibt eine schreckliche Menge an Duplikaten im regulären Ausdruck, und ich habe ein paar Ideen, um ihn signifikant zu verkürzen ... Ich werde es später versuchen und dann eine Erklärung hinzufügen. Lassen Sie mich in der Zwischenzeit wissen, ob Sie Eingaben finden, die zu einem falschen Ergebnis führen.
quelle
J,
7573 BytesVerwendet das Format in der Frage und verwendet
.
/*
/C
für Leerzeichen / nutzbaren Raum / Truhe.Bearbeiten: behebt einen kleinen Fehler (ich habe versehentlich einen Torus verwendet, anstatt die Umgebung als leeren Raum zu behandeln).
Erläuterung
quelle
C 193
2 unnötige Zeilenumbrüche zur Verdeutlichung. Zu den Änderungen in Bezug auf ungolfed code gehören: Zeichen als ASCII-Codes anstelle von Zeichenliteralen; Neuanordnung von v = 0, strlen und strchr zum Speichern von Zeichen (strchr ist am hässlichsten, da eine Berechnung, die sonst nur einmal ausgeführt würde, 5-mal pro Zelle ausgeführt wird!)
C-Funktionen akzeptieren keine Zeichenfolgen als Argumente oder geben sie als Werte zurück. Daher kann ich Folgendes tun:
q
ist ein Zeiger auf die Eingabezeichenfolge. Die Funktion ändert die Zeichenfolge und wenn die Funktion zurückgibt, wird die Ausgabe in der ursprünglichen Zeichenfolge gefunden.Um die Regeln zusammenzufassen:
Ein leeres Quadrat (das kein C oder keine Newline enthält) kann konvertiert werden, wenn es maximal einen Nachbarn mit einem C hat
... UND dieser Nachbar hat keine Nachbarn mit einem C.
Die Funktion g enthält eine Funktion f, die von Tiefe 1 bis Tiefe 0
f(r,0)
rekursiv abläuft. Bei nur 2 Rekursionsebenen ist ein einfacher rekursiver Aufruf nicht erforderlichf(r,d-1)
!Ungolfed Code im Testprogramm
Die Eingabe-Testzeichenfolge ist fest codiert.
gets
undscanf
akzeptiert keine Eingabezeichenfolge mit Zeilenumbrüchen; sie hacken es bei jeder neuen Zeile in Stücke.Ausgabe anhand eines Fragenbeispiels
quelle
JavaScript (ES6) 124
129Verwenden der Zeichen 0 (*), 6 (C), 7 (.)
Ungolfed und erklärte
Test In der Firefox / FireBug-Konsole
Ausgabe
quelle
Perl, 66
Die Regexp Matching-Konflikte in der Brust endeten auf der langen Seite, so dass diesmal keine Konkurrenz zu CJam bestand.
Verwendet 0 und 2 für Leerzeichen und Leerzeichen in der Eingabe, 1 zum Markieren der Punkte auf der Ausgabe.
Probieren Sie es hier aus .
quelle
Python 2 - 281 Bytes
(Die Zeilen 8 und 9 enthalten ein einzelnes Tabulatorzeichen, das SE in 4 Leerzeichen umwandelt. Jede Zeile in diesem Programm enthält entweder 0 oder 1 Byte führende Leerzeichen.)
Eingabe:
0
für keine Truhe,2
für TruheAusgabe:
0
für keine Truhe,2
für bestehende Truhe,1
für mögliche neue TruheGott, das ist schrecklich. Ich muss ernsthaft aus der Übung sein. Ich habe jeden Trick geworfen, den ich kenne, und er kam heraus ... nun, er kam als 281 Bytes heraus und verlor gegen jede Antwort außer der in Regex , haha. Ich habe ehrlich gesagt das Gefühl, dass ich ein bisschen gut Golf gespielt habe, also schätze ich, dass mein Algorithmus einfach nicht optimal war.
Ungolfed:
quelle