opis problemu
Wyobraź sobie, że jesteś żółwiem na siatce. Otrzymałeś dwie liczby f i b , i patrzysz na wschód. Przeprowadzasz marsz przez siatkę, licząc każdą napotkaną komórkę, zgodnie z następującymi zasadami:
- Domyślnie zapisujesz liczbę w komórce, w której się znajdujesz, a następnie idziesz naprzód.
- Jeśli liczba jest podzielna przez f , piszesz
F
do komórki, w której się znajdujesz, następnie skręcasz w prawo, a następnie idziesz naprzód. - Jeśli liczba jest podzielna przez b , piszesz
B
do komórki jesteś w, a następnie skręcić w lewo, a następnie pieszo do przodu. - Jeśli liczba jest podzielna przez f i b , piszesz
FB
do komórki, w której się znajdujesz, a następnie idziesz naprzód. - Jeśli dojdziesz do kwadratu, na którym już byłeś, przestajesz.
Na przykład przestrzeganie tych reguł przy użyciu f = 3 i b = 5 wygeneruje taki wzór:
F 28 29 FB 1 2 F
26 4
F B B F
23 7
22 8
F B B F
19 11
F 17 16 FB 14 13 F
Wyzwanie
Napisać program lub funkcji, które przyjmuje dwa numery jako wejścia, odpowiadające F i B , i wytwarza na wyjściu wzorzec dla tych liczb podanych w powyższych zasad.
Wymagania dotyczące formatowania:
- Każda komórka ma szerokość dwóch znaków
- Zawartość komórki jest wyrównana do prawej w obrębie tych dwóch znaków
- Komórki w tym samym rzędzie są oddzielone spacją
- Pierwsza kolumna komórek musi zawierać niepustą komórkę
- Wszystkie wiersze muszą zawierać niepuste komórki
- Końcowe białe znaki nie są wymagane, ale dozwolone
- Jednak całkowita szerokość każdego wiersza nie może przekraczać 3-krotności liczby niepustych kolumn
Twój kod musi działać dla podanych przypadków testowych.
Standardowe luki są niedozwolone.
To jest kod golfowy; najkrótsza odpowiedź w bajtach wygrywa.
Przypadki testowe
(f = 3, b = 5 przypadek powtórzony tutaj dla wygody grzecznościowej).
f=3, b=5 ->
F 28 29 FB 1 2 F
26 4
F B B F
23 7
22 8
F B B F
19 11
F 17 16 FB 14 13 F
f=4, b=10 ->
F 25 26 27 F
23 29
22 1 2 3 F
21 5
FB 6
19 7
18 B 9 F
17 11
F 15 14 13 F
f=3, b=11 ->
F 16 17 F
14 19
13 1 2 F
F B 4
10 5
F 8 7 F
f=5, b=9 ->
F 41 42 43 44 1 2 3 4 F
39 6
38 7
37 8
F B B F
34 11
33 12
32 13
31 14
F 29 28 B B 17 16 F
26 19
F 24 23 22 21 F
f=5, b=13 ->
F 31 32 33 34 F
29 36
28 1 2 3 4 F
27 6
F B 7
24 8
23 9
22 B 12 11 F
21 14
F 19 18 17 16 F
Odpowiedzi:
JavaScript (ES6), 230
240Mniej golfa
Test
źródło
Python 2,
379338326 bajtówPobiera dane wejściowe jako dwie liczby, oddzielone przecinkiem. Na przykład.
4,5
lub(4,5)
Wersja, która działa, jeśli ścieżka jest dłuższa niż 99,
384343330 bajtówPokazuje 2 cyfry znaczące.
Przykłady:
input=(4,16)
input=(6,7)
(wersja obcinana)@Edit: Podziękowania dla Jonathana Allana, Coppera i shooqie za zaoszczędzenie mi kilku bajtów.
źródło
while((x,y)not in p.keys()):
nawhile(x,y)not in p:
ifor x,y in p.keys():
nafor x,y in p
. Możesz zmienićl,r=i%b==0,i%f==0
nal,r=i%b<1,i%f<1
id=(d+[0,1][r]-[0,1][l])%4
nad=(d+r-l)%4
. Możesz zmienićs=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);p[(x,y)]=s
nap[(x,y)]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2)
. Może być więcejh*[' ']for x in range
zamiast[' ']*h for x in range
. Ponadtox+=[-1,1][d==1]
można go zastąpićx+=(d==1)*2-1
iy+=[1,-1][d==2]
można go zastąpićy+=(d!=2)*2-1
. Czyf,b=inputtt
literówka?p[(x,y)]
=>p[x,y]
(nie jestem pewien, czy to działa w Pythonie 2)Excel VBA,
347421 bajtówNowa wersja, aby sprostać wymaganiom dotyczącym białych znaków. Brak tego w mojej pierwszej wersji był niedopatrzeniem z mojej strony, ale odbija się to na liczbie bajtów ... Teraz odcina i wkleja używany zakres do komórki
A1
.Oto stara wersja, do której nie przeniesiono wyniku końcowego
A1
Zaczyna się od 70, 70 (lub BR70 w Excelu) i obchodzi go. Funkcja jest wywoływana z parametrami
f
ib
jako:Call t(4, 16)
@ Neil właśnie zapisał mi garść bajtów, dzięki!
źródło
q=q-1
sięq=q+3
iSelect Case q
zSelect Case q Mod 4
czym można się pozbyć dwóch poprzednich wypowiedzi.However, the total width of each row must not exceed 3 times the number of non-empty columns
Wydaje mi się, że zostało to dodane, aby uniknąć konfiguracji dużej siatki i zacząć nieco dalej od granicyExcel VBA,
284278277261259255254253251 bajtówSub
rutynowe które ma jako wartości wejściowe,F
,B
a wyjścia do komórek naSheets(1)
przedmiot (który jest ograniczony doSheets(1)
przedmiotu zaoszczędzić 2 bajty)Stosowanie:
źródło
C, 349 bajtów
Kompiluje z gcc (z dużą ilością ostrzeżeń)
Nieco bardziej wcięta wersja:
Oto wersja 364 bajtów, która obsługuje liczby większe niż 100
źródło
Perl, 275 bajtów
W celu zapewnienia czytelności podano wcięcia i nie stanowi ono części kodu.
Wyjaśnienie:
Kod działa poprzez śledzenie skrótu wszystkich miejsc, w których przebywał żółw, oraz zapisania odpowiedniej wartości
%m
. Na przykład: in3 5
,$m{0,2}
zawiera2
i$m{1,-3}
=26
. Kontynuuje się w ten sposób, aż dotrze do miejsca, które zostało już zdefiniowane. Dodatkowo śledzi bieżące granice ścieżki żółwia, wykorzystując$a,$b,$c,$d
jako maksima i minimum.Kiedy dotrze do miejsca, w którym już był, drukuje ścieżkę, używając granic, wszystko wypełnione spacjami.
Nie ma ograniczeń co do wielkości ścieżki ani wielkości liczb.
źródło
PHP , 292 bajtów
Wypróbuj online!
Wcięcia są dla jasności, nie liczone.
Stosuje ten sam algorytm co odpowiedź Perla. Śledź, gdzie żółw był w układzie 2D,
$a
śledzi, gdzie żółw jest zwrócony, i$u, $d, $l, $r
śledź granice drukowania.str_pad
pozwala nam upewnić się, że każdy wpis ma dokładnie 3 spacje dla formatowania wydruku.Z jakiegoś powodu nie mogę pojąć, PHP nie przeszkadza mi, że nie inicjuję połowy zmiennych na 0, ale psuje formatowanie, jeśli nie inicjuję innych, chociaż zwykle traktuje niezainicjowane zmienne jako 0, gdy są one pierwsze używany. Stąd
$x=$y=$u=$l=0
trochę.źródło
Python 2 ,
267262258249245243 bajtówWypróbuj online!
źródło