Wprowadzenie
„Yarr! Mieliśmy chłopca, który nazywał siebie„ programistą ”, który tworzy mapę naszego ukrytego skarbu! Ale to napisane z dziwnymi liczbami i literami!„ E5, N2, E3 ”… co to w ogóle robi znaczy? Szaleństwo! Nie mogę nawet napisać właściwej mapy skarbów, bezużytecznego kretyna. Napraw to dla nas! Podarujemy ci skarb!
Opis wyzwania
Grupa piratów ma problem z odczytaniem mapy skarbów. Czy potrafisz napisać program, który przekształci go w bardziej ... piracką formę?
Jako dane wejściowe otrzymasz oryginalną mapę skarbów. Jest to lista ciągów oddzielonych przecinkami, każdy ciąg składający się z części literowej (która mówi piratom, w którym kierunku powinni iść) oraz części liczbowej (która informuje piratów, ile kroków należy wykonać w tym kierunku). Na przykład następująca mapa skarbów:
E2,N4,E5,S2,W1,S3
oznaczałoby: „idź dwa kroki na wschód, idź cztery kroki na północ, idź pięć kroków na wschód, idź dwa kroki na południe, idź krok na zachód, a następnie trzy kroki na południe”.
Jako wyjście, będziesz wyjście mapę w formie graficznej, za pomocą znaków >
, ^
, v
, i <
jako wskaźniki. Oto wynik dla powyższego wejścia:
>>>>>v
^ v
^ v<
^ v
>>^ X
Zauważ, że zamiast tego ostatni krok na południu zastąpiliśmy X
. Dzieje się tak, ponieważ ostatnim krokiem jest miejsce, w którym znajduje się skarb, i jak wszyscy wiemy, piraci muszą mieć X na swoich mapach skarbów, w przeciwnym razie nie będą umieli go czytać.
Nawiasem mówiąc, mapa nigdy się nie przekroczy, więc nie musisz się martwić o nakładanie się. Ponadto możesz mieć końcowy nowy wiersz na końcu danych wyjściowych.
Przykładowe wejścia i wyjścia
S5,W2
v
v
v
v
v
X<
N1,E1,S1,E1,N1,E1,S2
>v>v
^>^X
N1
X
N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2
>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<
E21,S2
>>>>>>>>>>>>>>>>>>>>>v
X
N12,E11,S12,W2,N4
>>>>>>>>>>>v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ X v
^ ^ v
^ ^ v
^ ^<<
X
powinien on oznaczyć krok po ostatnim ruchu, tak jak wszystkie inne ruchy są liczone. Wyobraź sobie, że ostatnim krokiem jest N3: idziesz trzy kroki na północ i kopiesz, ale tu nic nie ma, zamiast tego musiałeś przejść 2 kroki. Nie mam nic przeciwko, jeśli zachowasz istniejącą regułę, ponieważ dodaje ona małą narożną skrzynkę do obsługi. Ale pamiętaj, co się stało z tym chłopcem.Odpowiedzi:
Rubin,
213 209 198 186178Przekaż wejście przez stdin.
To używa
y -> x -> char
słownika skonstruować mapę, gdzie zarównox
iy
może być ujemna. Po przeanalizowaniu danych wejściowych wyodrębniane jest globalne minimum współrzędnej x. Dla każdego wiersza iteruje następnie zakres od globalnego minimum do maksymalnego indeksu dla bieżącej linii i drukuje poprawny znak dla tego indeksu.Aby pozostać z tematem, wyrażenia, aby włączyć
NESW
do odpowiednich indeksów były bezwstydnie pirackich od SP3000 jest odpowiedź .Oryginalna wersja wykorzystująca
[x,y] -> char
słownik:źródło
Python 2,
249248244239237 bajtówDane wejściowe jak
"E2,N4,E5,S2,W1,S3"
.NSEW
jest mapowany[1, 3, 2, 0]
przezd=ord(c)%10%7
. O tym, czy zmienić,y
czy teżx
decydujed%2
, a czy o zwiększaniu czy zmniejszaniu decydujed-2|1
. Pierwsze i trzecie wyrażenie zostało znalezione brutalną siłą.Poza tym jest to proste użycie zagnieżdżonego słownika formularza
{y: {x: char}}
.(Podziękowania dla @joriki za pomoc w mapowaniu)
źródło
(d + 1 & 2) - 1
1|d%-3
(co jest negacją, ale zdałem sobie sprawę, że to też jest w porządku)!JavaScript (ES6), 260
To było interesujące ...
Dzięki @ETHproductions, @ edc65 i @vihan za pomoc!
Definiuje to funkcję anonimową, więc jej wywołanie dodaj
f=
do początku, aby nadać jej nazwę.Testować:
console.log(f("E2,N4,E5,S2,W1,S3"))
Wyjaśnienie:
źródło
i++
zfor
pętli do ostatniego miejsca, w którym jest używany, w tym przypadkuc=i++>r-2?"X":c
.v[0].repeat(+v.slice(1))
zamiastArray(v.slice(1)- -1).join(v[0])
i" ".repeat(j-p-1)
zamiastArray(j-p).join(" ")
oszczędzania 11 bajtów ogółem. Myślę, że możesz również umieścićF='forEach'
na początku funkcji, a następnie zmienić każdy.forEach
z nich na[F]
, oszczędzając kolejne 4.if
s, może to pomóc, jeśli zmniejszysz również zmienne w tym samym czasieq=x=y=2e3
oznacza to, że dane wyjściowe byłyby niepoprawne, gdybym tak powiedziałW9999
?PHP,
431417 bajtówUmieść go w pliku (
treasure.php
), usuń wcięcie, połącz linie (jest on tutaj zawinięty dla czytelności), umieść<?php
znacznik na początku pliku (nie jest wyświetlany tutaj, ponieważ technicznie nie jest częścią programu).Przykład wykonania:
Opcja
-d error_reporting=0
jest potrzebna, aby ukryć powiadomienia o wartościach nie znalezionych przy określonych indeksach w$z
.Aktualizacja:
Podczas przygotowywania niepublikowanej wersji kodu do opublikowania odkryłem, że zawiera on dwa niepotrzebne przypisania (12 bajtów) i spację, którą można usunąć (
as$i
); Również, wymieniającwhile
zfor
pętli i ściskając zadanie go (nie jest możliwe przy użyciuwhile
pętli) I zapisane innego bajtu.źródło
$count --;
.$argn
zapisz 3 bajtychop
zapisz 1 bajt"X"
->X
użyj stałych zapisz więcej bajtów$argn
. Zdaję sobie sprawę z tej"X"->X
sztuczki, ale prawdopodobnie zapomniałem o niej, kiedy napisałem to rozwiązanie. Piszę kod PHP od 2002 roku, ale do dzisiaj nie zauważyłem, że PHP zapewnia tęchop()
funkcję. Dziękuję za tę wskazówkę.Perl,
702613546474439338260 bajtówDzięki Dom Hastings za pomoc i jego wersję supergolfed.
Kod wykorzystuje tablicę 2D.
Wersja autorstwa Dom Hastings:
Moja mniej golfowa wersja 338 bajtów (dla odniesienia):
Test
źródło
use strict;
, nie potrzebujesz wszystkichmy
s, co pozwoli Ci zaoszczędzić co najmniej kilka bajtów.==
Jest także krótszy niżeq
ten ostatni wymaga spacji.$m
raz, więc zamiast przechowywać argument linii poleceń jako zmienną, możesz wywołać go bezpośrednio wsplit
, tj@m=split(',',$ARGV[0])
.$d
i$s
zmienne mogą być pobierane za pomocą wyrażenia regularnego, aby zaoszczędzić ci niektóre bajty($d,$s)=/^(.)(.+)$/
, i wszystkieforeach
mogą byćfor
(ponieważ są takie same. Możesz również być w stanie zapisać niektóre znaki zastępując niektóre z nichmap{
...}@x
ponieważ możesz zignorować parens wokół iterowanego elementu (działa to dobrze, jeśli musisz zawierać inne pętle). Jeśli używasz$ARGV[0]
, możesz zastąpić go popem, ale jeśli używasz skryptu tak, jakperl script.pl <<< "text"
możesz, możesz go użyć<>
!pop
aby zapisać kilka. Zamiast instrukcjiuse Swtich
iswitch
/case
można wykonać indywidualne kontrole, które mogą zaoszczędzić bajty. Coś jak również$y-="N"eq$d
będzie działać (ponieważ prawda1
i fałsz są''
). Często możesz używać słów jako słów kluczowych, więc$y-=N eq$d
zadziała! Istnieje kilka magicznych zmiennych, których można użyć do zapisania bajtów,$/
jest'\n'
i$"
jest' '
, ale czasami dosłowna nowa linia może również pomóc w zapisaniu znaku. Kolejną sztuczką (brudną!) Jest wielokrotne przypisywanie, aby zaoszczędzić jeszcze kilka, jak$a=0;$b=0;
może być$a=$b=0
.substr($_,0,1)
może byćsubstr$_,0,1
. Postfiks dla pętli i jeśli sprawdzanie może być również przydatne, jak wfor(@c){...}
vs,...for@c
ale nie możesz użyć;
w kodzie, musisz zamiast tego przecinek oddzielić (co nie zawsze działa, gdy wywołujesz funkcje). Istnieje wiele wspaniałych wskazówek także na codegolf.stackexchange.com/questions/5105/… . Powodzenia!Python 2, 394 bajty
Uruchom program, a następnie wklej do standardowego wejścia, np
"E2,N4,E5,S2,W1,S3"
To nie jest bardzo zoptymalizowane. Najpierw przebiega przez wejście, aby zarejestrować ścieżkę. Następnie wykonuje matematykę, aby określić właściwą pozycję początkową i rozmiar
o
. Następnie biegnie ponownie i ustawia odpowiednie wpisyo
jako jeden z>v<^X
. Główna spryt polega na ponownym użyciu tej samej funkcji dla obu tych przejść.źródło
XQuery 3.0, 498
XQuery często nie jest nawet lekko konkurencyjny, więc było fajnie.
Bez golfa
źródło
PHP, 496
514528Próbowałem szczęścia w PHP, wynik jest raczej długi, wciąż chcę to opublikować, dla zabawy.
Bez golfa
źródło
for(;$i++<$f;)
, próbować usuwać niepotrzebne nawiasy klamrowe, używać niezdefiniowanych stałych (N
) zamiast string ('N'
),…if
s spróbuj użyć operatorów trenary lub logicznych is. Pomoże to również, jeśli używasz PHP4.1 i używasz tablicy GET z punktami.JavaScript (ES6), 244
249 274Wiodące spacje i znaki nowej linii zostały dodane dla jasności i nie zostały policzone, z wyjątkiem nowej linii pod koniec połączenia połączenia, która jest znacząca i została policzona.
Przetestuj uruchomienie fragmentu kodu (tylko ECMAScript 6, Firefox i Safari 9)
źródło
C, 557
Wersja bez golfa:
Dynamiczna alokacja pamięci nie jest trudniejsza, ale malloc jest zdecydowanie za długim identyfikatorem, aby można go było zastosować w golfie kodowym. Wydaje mi się, że powinien istnieć jakiś nagłówek PCG.h, który jest automatycznie dołączany do gry w golfa w c, tylko po to, aby zewrzeć niektóre identyfikatory.
źródło
Groovy, 359
źródło
Common Lisp - 603
Implementacja bez macierzy: drukuje od góry do dołu, od lewej do prawej.
Analizuj i rozwija kierunki w ślad
(x y char)
elementów:Powstaje proste wejście „N3”
((0 0 #\^) (0 -1 #\^) (0 -2 #\X))
x
iy
y
najpierw, a następnie wedługx
Iteruj po posortowanej liście podczas przesuwania kursora
x - minx
,y - miny
należy wydrukować żądany znakPrzykłady
Wynik:
źródło
CoffeeScript,
303285 bajtówPokaż fragment kodu
źródło