Piet jest interesującym językiem programowania z wielu powodów. Dzisiaj skupimy się na jednym celu: poleceniu rzutu . Polecenie roll pochodziło z PostScript i jest potężnym sposobem na manipulowanie stosem.
Polecenie roll wyświetla dwa górne elementy stosu i używa ich jako parametrów. Nazwiemy pierwszą wartość pop up turns
i drugą depth
. Obrót do głębokości n zajmie najwyższy element stosu, uczyni go n-tym elementem stosu i przesunie każdy z elementów powyżej jednego o jeden. Jeśli turns
jest ujemne, dzieje się to w przeciwnym kierunku. Oznacza to, że n-ty element jest przenoszony na górę, a pozostałe elementy są przenoszone w dół. To się powtarza abs(turns)
.
Wyzwanie
Napisz program lub funkcję, która pobiera stos i zwraca ten stos po wykonaniu rzutu.
Zasady
- Dane wejściowe i wyjściowe mogą być w postaci listy, tablicy, ciągu z ogranicznikiem, przekazywanych w jednym elemencie na raz lub w innym rozsądnym formacie. Dane wyjściowe muszą być w tym samym formacie co dane wejściowe.
depth
nigdy nie będzie ujemny i nigdy nie będzie większy niż długość stosu.- Stos wejściowy zawsze będzie zawierał co najmniej dwa elementy.
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w każdym języku. W związku z tym nie przyjmę odpowiedzi.
- Standardowe luki są zabronione.
Przypadki testowe
in: out:
2
4
1 3
2 4
3 1
4 2
5 5
6 6
in: out:
-2
3
1 2
2 3
3 1
in: out:
-42
0
1 1
2 2
3 3
4 4
5 5
Odpowiedzi:
Haskell ,
6462 bajtówEdycja: -2 bajty: @xnor widział coś, o czym myślałem źle.
r
pobiera i zwraca listęInt
s.Wypróbuj online!
splitAt n l
dzieli listęl
na indeksn
,mod
oblicza pozostałą część podziału,++
łączy listy.źródło
(%)=splitAt
infix.JavaScript (ES6),
4947 bajtówEdycja: Zapisano 2 bajty dzięki @Shaggy, biorąc elementy stosu jako osobne parametry. Wyjaśnienie:
1
przesuwa górny element dodepth
elementu. Kolejność2
przesuwa dwa górne elementy itp. Można to jednak osiągnąć, przesuwając elementy między zakrętem a głębokością do przodu.splice
usuwa te elementy iconcat
dołącza je do pozostałych elementów. (Mógłbym zamiast tego użyć rozumienia tablicowego, ponieważ ma on tę samą długość.)slice
do drugiego parametrusplice
to liczba elementów do usunięcia.źródło
(t%d+d)%d
to samo cot%d
?%
jest resztą, więc daje negatywną odpowiedź, gdyt
jest negatywna.(t,d,...a)=>
reguł, które pozwalają na przekazywanie danych wejściowych w jednym elemencie na raz.CJam, 31 bajtów
Dane wejściowe i wyjściowe są tablicami na stosie, przy czym ostatni element reprezentuje górę stosu.
Ślad stosu:
źródło
Mathematica,
5850 bajtówEdycja: Podziękowania dla Martina Endera za zapisanie 8 bajtów.
Wyjaśnienie:
Czysta funkcja, która oczekuje listy, w której początek listy reprezentuje górę stosu. Przekazujemy elementy listy do czystej funkcji
Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&
.x
jest ustawiony na sekwencję elementów zaczynającą się od trzeciego argumentu., następnie obracamy pierwsze#2
(drugi argument) elementyx
w lewo#
(pierwszy argument) razy, a następnieJoin
pozostałe elementyx
.Oszczędzałoby to
3
bajty, gdybyśmy po prostu przekazali elementy stosu jako argumenty bezpośrednio do funkcji, zamiast początkowo znajdować się na liście, ale wtedy formaty wejściowe i wyjściowe nie pasowałyby.Oryginalne rozwiązanie:
Jest coś naprawdę satysfakcjonującego w tym łańcuchu funkcji infix. Zamienia listę na pierwszy element
t
, drugi elementd
i pozostałe elementy,x
w wyniku czego pierwszed
elementy zostają obrócone{x}
w lewot
i połączone z pozostałymi elementami{x}
.źródło
±
wstawionej jednobajtowej funkcji prefiksu reguły zastępowania, a kolejny 1 bajt, wykorzystującTakeDrop
w następujący sposób:±{t_,d_,x___}:=#~RotateLeft~t~Join~#2&@@{x}~TakeDrop~d
...&[1, 1, 3, 4]
i powrotu,{3, 4}
lub wykonaj to ręcznieApply
na początku:Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&
(aby być jasnym, moja pierwsza sugestia pomija@@#&
.)Rubinowy, 40 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako listę, zwraca listę. Fakt, że istnieje wbudowany system
rotate
, który może obsługiwać zarówno dodatnie, jak i ujemne obroty, czyni to banalnym.źródło
Python,
141988774 bajty11 bajtów zapisanych dzięki @Cole
Pobiera dane wejściowe jako listę, gdzie ostatni element jest na górze stosu.
Używa sztuczki 0ⁿ do filtrowania zerowej głębokości i operatora modulo dopasowującego znaki w pythonie, aby określić część listy do pocięcia.
źródło
f(s,t,d)
?f(s,t,d)
(dane wejściowe to cały stos).r=-t%d-d
. Również zastąpienies*0**d
przezs*(d<1)
zachowuje liczbę bajtów, ale może poprawia czytelność (nie to, że to jest cel). Nie wiedziałem tego jednak0**0==1
w Pythonie, to interesujące.-t%d-d
jako wartość (jak ja wcześniej), bo gdyd
jest0
to ten wywoła wyjątek dzielenie przez zero.JavaScript ES6,
10992 bajtówWypróbuj online!
Odbiera dane wejściowe w postaci tablicy liczb całkowitych.
Ma również liczbę do strzałki: P
Wyjaśnienie:
Kod używa funkcji shift do wyodrębnienia pierwszych dwóch elementów listy.
Następnie otrzymuje wartość bezwzględną pierwszego elementu, czyli liczbę zwojów.
Ponieważ Javascript jest indeksowany na zero, indeks głębokości należy zmniejszyć o 1.
Jeśli wskaźnik głębokości wynosiłby 0 lub 1, nic nie powinno się zmienić, ale ze względu na spadek wskaźnik 0 spowodowałby zmiany. Dlatego wyjdź z pętli, jeśli indeks głębokości nie jest <= 0.
Funkcja łączenia (a, b) zwraca pod-tablicę o długości b z początkowym indeksem a z tablicy i pozostawia oryginalną tablicę bez tych elementów.
Po połączeniu z resztą oryginalnej tablicy, jest to pojedynczy obrót tablicy przy indeksie głębokości.
Wykonując tę operację n razy, gdzie n jest liczbą zwojów, wynikowa tablica jest wynikiem operatora przechyłu.
źródło
Python 2 , 48 bajtów
Wypróbuj online!
źródło
TI-Basic,
141150 bajtów (niekonkurencyjny)Edycja: naprawiono wielkość liter, w której głębokość wynosi zero (+9 bajtów)
TI-Basic nie obsługuje list o długości 0, więc to podejście nie zadziała dla danych wejściowych o dwóch długościach.
Wyjaśnienie:
źródło
seq(
.Partia, 163 bajty
Pobiera dane wejściowe jako parametry wiersza polecenia i wyświetla listę rozdzieloną spacjami. Parametry pomiędzy
t
id
są wyodrębniane dor
zmiennej, aby można je było dodać dos
zmiennej, która odbiera wszystkie pozostałe parametry.źródło