Gra wideo Minecraft polega na umieszczaniu i usuwaniu różnego rodzaju bloków w siatce liczb całkowitych 3D, która tworzy świat wirtualny. Każdy punkt sieci może zawierać dokładnie jeden blok lub być pusty ( oficjalnie blok „ powietrzny ”). W tym wyzwaniu zajmiemy się tylko jedną poziomą płaszczyzną 2D świata 3D i jednym rodzajem bloku: skrzyniami .
Skrzynie pozwalają graczom przechowywać przedmioty. Kiedy dwie skrzynie są prostopadle przylegające do tej samej płaszczyzny poziomej, ich tekstury łączą się i tworzy się podwójna skrzynia o podwójnej pojemności. Nie można zrobić nic większego niż podwójna skrzynia; nie ma potrójnych skrzyń ani poczwórnych skrzyń.
Blok skrzyni można umieścić w pustym kracie tylko wtedy, gdy wszystkie cztery sąsiadujące ze sobą prostopadle punkty są puste lub jeśli dokładnie jeden zawiera blok skrzyni, który nie jest już częścią podwójnej skrzyni. Te zasady rozmieszczania zapewniają, że bloki skrzyń łączące się w podwójne skrzynie nigdy nie będą dwuznaczne.
Załóżmy na przykład, że .
jest to puste miejsce i C
skrzynia: (Liczby są również pustym miejscem i służą wyłącznie do identyfikacji).
.......C..
.1.C2.C3..
........5C
.CC4..CC..
..........
- Skrzynię można umieścić w miejscu 1, ponieważ jej 4 sąsiadów jest pustych.
- Skrzynię można umieścić w miejscu 2, ponieważ sąsiednia skrzynia nie jest (jeszcze) częścią podwójnej skrzyni.
- Skrzyni nie można umieścić w miejscu 3, ponieważ istniałaby dwuznaczność co do sposobu tworzenia podwójnej skrzyni.
- Skrzyni nie można umieścić w miejscu 4, ponieważ sąsiednia skrzynia jest już częścią podwójnej skrzyni.
- Skrzynia może zostać umieszczona w miejscu 5. Podwójna skrzynia sąsiadująca po przekątnej niczego nie wpływa.
Zakładając, że obszar poza siatką jest pusty, zmiana każdej .
na siatce na pozycję, *
jeśli można tam umieścić skrzynię, powoduje:
******.C**
***C**C.**
*..***..*C
.CC.*.CC.*
*..***..**
*
Oczywiście nie wszystkie pola mogą być jednocześnie zajęte przez skrzynie, ale jeśli masz tylko jedną skrzynię, można ją umieścić w dowolnej z nich.
Wyzwanie
Napisz program lub funkcję, która pobiera a .
i C
grid, i zmienia każdy .
na a, *
jeśli można tam umieścić skrzynię, drukując lub zwracając wynikową siatkę.
Dane wejściowe mogą pochodzić ze standardowego wejścia lub pliku lub jako argument ciągu funkcji.
Możesz założyć, że dane wejściowe są dobrze uformowane - tj. Idealnie prostokątna siatka tekstu, o szerokości i wysokości co najmniej 1 znaku, zawierająca tylko
.
iC
Możesz opcjonalnie założyć, że po ostatnim wierszu znajduje się znak nowej linii (i może być jedna na wyjściu ).Możesz założyć, że rozmieszczenie skrzyń na wejściu jest zgodne z powyższymi zasadami. Nigdy nie będzie dwuznaczności, które skrzynie tworzą podwójne skrzynie.
W razie potrzeby można użyć dowolnych trzech odrębnych druku ASCII znaków w miejsce
.
,C
i*
. Nie możesz używać czegoś innego zamiast nowych linii.Wszystkie skrzynie są normalnymi skrzyniami. Nie uwięzione skrzynie lub skrzynie końcowe .
Punktacja
Zgłoszenie z najmniejszą liczbą bajtów wygrywa.
W przypadku wyzwania związanego z Minecraft, które jest nieco trudniejsze, spróbuj Nether Portal Detection .
Odpowiedzi:
CJam,
82 76 66 62 5854 bajtówFormat wejściowy oczekuje
0
dla komórki powietrznej i8
komórki piersiowej. Dane wyjściowe zawierają1
dla wszystkich komórek, które można umieścić za pomocą skrzyni.AKTUALIZACJA :
Naprawiono błąd. Zwiększony o 3 bajty :(grał w golfa dalej :). 4 bajty zapisane dzięki @ Sp3000Przykładowe dane wejściowe:
Wynik:
Chyba już skończyłem grać w golfa ...
Wyjaśnienie
Wypróbuj online tutaj
źródło
.NET Regex ( Retina ),
434416310 + 1 = 311 bajtówPo ostatnim wyzwaniu, na które odpowiedziałem w wyrażeniu regularnym (Wyzwanie Nether Portal, z którym łączy się to wyzwanie), w końcu postanowiłem napisać narzędzie wiersza polecenia, które działa jako interpreter wyrażeń regularnych w stylu .NET, dzięki czemu mogę odpowiadać na pytania z wyrażeniami regularnymi bez rzucania wyzwania, że nie są one samodzielnym językiem. Nazwałem to Retina.
Teraz to wyzwanie nie nadaje się zbyt dobrze do przedłożenia wyrażenia regularnego, ale musiałem teraz użyć Retiny. ;) (Plus, Sp3000 wezwał mnie do zrobienia tego na czacie.) Oto więc:
Plik Regex
Plik zastępczy
Plik wyrażeń regularnych to głównie wyrażenia regularne, z wyjątkiem tego, że
`
pozwala umieścić w pliku kilka opcji, w tym przypadku po prostu tryb wielowierszowy. Po otrzymaniu dwóch plików Retina automatycznie przyjmuje tryb zamiany wszystkich plików. Te dwa pliki definiują program, który odczytuje dane wejściowe ze STDIN i drukuje wynik do STDOUT.Możesz go również przetestować na RegexHero i RegexStorm . Wyrażenie regularne działa zarówno z końcowym znakiem nowej linii, jak i bez niego, i używa
_
zamiast.
. (Najwyraźniej RegexStorm czasami ma problemy, jeśli nie ma końcowego nowego wiersza, ale RegexHero wydaje się dobrze obsługiwać oba przypadki).W wyrażeniu regularnym występuje straszna ilość duplikacji i mam kilka pomysłów na znaczne skrócenie go ... Spróbuję później, a następnie dodam wyjaśnienie. Tymczasem daj mi znać, czy możesz znaleźć jakieś dane wejściowe, które dają zły wynik.
źródło
J,
7573 bajtówUżywa formatu w pytaniu, używając odpowiednio
.
/*
/C
dla spacji / powierzchni użytkowej / skrzyni.Edycja: naprawia mały błąd (przypadkowo użyłem torusa zamiast poprawnie traktować otoczenie jako pustą przestrzeń).
Wyjaśnienie
źródło
C 193
2 niepotrzebne nowe znaki dla jasności. Zmiany w odniesieniu do nieoznakowanego kodu obejmują: znaki jako kody ascii zamiast literałów znaków; przegrupowanie v = 0, strlen i strchr w celu zapisania znaków (strchr jest najbrzydszy, ponieważ oznacza, że obliczenia, które w innym przypadku zostałyby wykonane tylko raz, są wykonywane 5 razy na komórkę!)
Funkcje C nie przyjmują ciągów jako argumentów ani nie zwracają ich jako wartości, więc najlepsze, co mogę zrobić, to:
q
wskaźnik do ciągu wejściowego. Funkcja modyfikuje ciąg, a gdy funkcja zwróci, wynik znajduje się w oryginalnym ciągu.Podsumowując zasady:
pusty kwadrat (który nie zawiera C ani nowej linii) może zostać przekonwertowany, jeśli ma maksymalnie 1 sąsiada z C
... I ten sąsiad nie ma sąsiadów z C.
Funkcja g zawiera funkcję f, która powraca od głębokości 1 do głębokości 0. Przy tylko 2 poziomach rekurencji wystarczy proste
f(r,0)
wywołanie rekurencyjne, nie ma takiej potrzebyf(r,d-1)
!Nieskluczony kod w programie testowym
Wejściowy ciąg testowy jest zakodowany na stałe.
gets
iscanf
nie zaakceptuje ciągu wejściowego z nowymi liniami; kroją go na kawałki przy każdej nowej linii.Dane wyjściowe oparte na przykładzie pytania
źródło
JavaScript (ES6) 124
129Używanie znaków 0 (*), 6 (C), 7 (.)
Nie golfił i wyjaśnił
Przetestuj w konsoli Firefox / FireBug
Wynik
źródło
Perl, 66
Dopasowanie wyrażeń regularnych do klatki piersiowej zakończyło się na dłuższą metę, więc tym razem nie konkurowano z CJam.
Używa 0 i 2 dla pustych i skrzynek na wejściu, 1 do zaznaczenia miejsc na wyjściu.
Wypróbuj tutaj .
źródło
Python 2 - 281 bajtów
(Wiersze 8 i 9 są oznaczone pojedynczym znakiem tabulacji, który SE konwertuje na 4 spacje. Każda linia w tym programie ma 0 lub 1 bajt wiodących białych znaków).
Wkład:
0
brak skrzyni,2
skrzyniaOuput:
0
brak skrzyni,2
istniejąca skrzynia,1
ewentualna nowa skrzyniaBoże, to jest okropne. Muszę poważnie zrezygnować z praktyki. Rzuciłem każdą sztuczką, którą znam, i wyszło ... no cóż, wyszło jako 281 bajtów, tracąc każdą odpowiedź oprócz tej w wyrażeniu regularnym , haha. Naprawdę czuję, że grałem w golfa całkiem dobrze, więc zgaduję, że mój algorytm był po prostu mniej niż idealny.
Nie golfowany:
źródło