Chłopaki ASCII o zmiennookim wzroku lubią zmieniać ASCII Ii
:
>_> <_< >_< <_>
Biorąc pod uwagę szereg zmiennokształtnych, rozstawionych lub oddzielnych linii, przesuń Ii
bok na bok, opuść ścianę i wyprostuj niebo:
Ii
Najkrótszy manewr wygrywa nagrodę.
Powiedz co
Napisz program lub funkcję, która pobiera ciąg dowolnej listy tych czterech emotikonów ASCII, oddzielonych spacją lub znakiem nowej linii (z opcjonalnym znakiem nowej linii):
>_>
<_<
>_<
<_>
Na przykład dane wejściowe mogą być
>_> >_> <_>
lub
>_> >_> <_>
(Metoda, którą wspierasz, zależy od ciebie.)
Każdy emotikon wykonuje inną akcję na znakach I
i i
, które zawsze zaczynają się tak:
Ii
>_>
przesuwaI
się w prawo o jeden, jeśli to możliwe, a następnie przesuwai
w prawo o jeden.<_<
przesuwaI
się w lewo o jeden, jeśli to możliwe, a następnie przesuwai
w lewo o jeden, jeśli to możliwe.>_<
przesuwaI
się w prawo o jeden, jeśli to możliwe, a następnie przesuwai
w lewo o jeden, jeśli to możliwe.<_>
przesuwaI
się w lewo o jeden, jeśli to możliwe, a następnie przesuwai
w prawo o jeden.
I
nie można go przesunąć w lewo, jeśli znajduje się na lewej krawędzi linii (tak jak jest na początku), i nie można go przesunąć w prawo, jeśli i
jest bezpośrednio w prawo (jak to jest na początku).
i
nie można go przesunąć w lewo, jeśli I
jest bezpośrednio w lewo (jak to jest początkowo), ale zawsze można przesunąć w prawo.
Pamiętaj, że przy tych regułach I
zawsze pozostanie po lewej stronie i
i I
przedtem próbuje się przenieść i
wszystkie emotikony.
Twój program lub funkcja musi wydrukować lub zwrócić ciąg ostatniego Ii
wiersza po zastosowaniu wszystkich przesunięć w podanej kolejności, używając spacji (
) lub kropek ( .
) dla pustej przestrzeni. Końcowe spacje lub kropki oraz pojedyncza nowa linia są opcjonalnie dozwolone w danych wyjściowych. Nie mieszaj spacji i kropek.
Na przykład dane wejściowe
>_> >_> <_>
ma moc wyjściową
I...i
ponieważ zmiany obowiązują jak
start |Ii >_> |I.i >_> |.I.i <_> |I...i
Najkrótszy kod w bajtach wygrywa. Tiebreaker jest wyżej głosowaną odpowiedzią.
Przypadki testowe
#[id number]
[space separated input]
[output]
Używanie .
dla jasności.
#0
[empty string]
Ii
#1
>_>
I.i
#2
<_<
Ii
#3
>_<
Ii
#4
<_>
I.i
#5
>_> >_>
.I.i
#6
>_> <_<
Ii
#7
>_> >_<
.Ii
#8
>_> <_>
I..i
#9
<_< >_>
I.i
#10
<_< <_<
Ii
#11
<_< >_<
Ii
#12
<_< <_>
I.i
#13
>_< >_>
I.i
#14
>_< <_<
Ii
#15
>_< >_<
Ii
#16
>_< <_>
I.i
#17
<_> >_>
.I.i
#18
<_> <_<
Ii
#19
<_> >_<
.Ii
#20
<_> <_>
I..i
#21
>_> >_> <_>
I...i
#22
<_> >_> >_> >_> <_> <_<
.I...i
#23
<_> >_> >_> >_> <_> <_< >_< <_< >_<
..Ii
#24
>_> >_< >_> >_> >_> >_> >_> >_> <_> <_> <_<
...I.....i
Odpowiedzi:
CJam, 33 bajty
Używa tego samego algorytmu, co moja odpowiedź w języku Python , z wyjątkiem indeksowania 0. Głównie:
<
na -1 i>
na 1I
i aplikowaniem doi
, zmieniamy pozycję, którą aktualizujemy po każdej strzaleDzięki @ MartinBüttner za grę w golfa na poziomie wyjściowym, startując 5 bajtów.
Wypróbuj online | Zestaw testowy
źródło
Perl,
595654 bajtówObejmuje +1 dla
-p
Uruchom z wejściem na STDIN, np
perl -p shifty.pl <<< ">_> <_< >_< <_>"
shifty.pl
:Wyjaśnienie
Instrukcje zastępców strunowe sterowania do
i
iI
, a reguła jest taka sama dla obu z nich, jeśli je sformułować jako:<
Przesuń się w lewo, jeśli jest miejsce po lewej stronie>
Przesuń się w prawo, jeśli po prawej stronie znajduje się spacja lub koniec łańcuchaZamienię zamianę
i
iI
ciąg docelowy na każdym kroku, więc muszę tylko zastosować regułę do jednej litery. To jesty/iI/Ii/
Będę chodził po łańcuchu kontrolnym, szukając
<
i>
używając podstawienia, które zwykle jest najkrótszym sposobem w Perlu, do przetworzenia czegoś znak po znaku. Aby uniknąć konieczności pisania$var =~
, chcę ciąg kontrolny w zmiennej domyślnej perla$_
. I ja też chcę w łatwy sposób odróżnić<
od>
. Wszystko to można osiągnąć za pomocąCiąg docelowy również chcę manipulować przy użyciu podstawień iz tego samego powodu też tego chcę
$_
.$_
bycie dwiema rzeczami naraz wydaje się niemożliwe.Mogę jednak zjeść ciasto i zjeść je, ponieważ
$_
wnętrze ciała substytucji nie musi pozostać takie samo jak$_
substytucja. Gdy Perl zaczął podstawiać ciąg, ciąg nie zmieni się, nawet jeśli zmienisz zmienną, z której pierwotnie pochodzi. Możesz więc zrobić coś takiego:Chcę zastąpić oryginał
$_
początkowym"Ii"
tylko za pierwszym razem, gdy wykonywane jest ciało substytucji (w przeciwnym razie ciągle resetuję ciąg docelowy). Zastąpienie to musi jednak nastąpić również dla pustego ciągu kontrolnego, więc nawet dla pustego ciągu kontrolnego ciało musi zostać wykonane co najmniej raz. Aby upewnić się, że podstacja działa przez dłuższy czas na początku łańcucha kontrolnego (nawet w przypadku pustych łańcuchów kontrolnych), zmieniam podstawienie na:Uruchomię
y/iI/Ii/
jako pierwszą rzecz w kodzie zastępczym. Chociaż$_
nadal jest łańcuchem kontrolnym, nie będzie go jeszcze zawierałIi
, więc jeśli transliteracja wskazuje, że nic się nie zmieniło, inicjuje się mój wyzwalacz$_
:Teraz mogę zaimplementować faktyczne przesunięcie liter. Ponieważ zaczynam od zamiany, wszystkie ruchy powinny być wykonywane dalej
i
, nieI
. Jeśli$1
jest ustawiony, przejdźi
w prawo:Jeśli
$1
nie jest ustawiony, przejdźi
w lewoZauważ, że na początku łańcucha kontrolnego, gdy pasuję
^
$1
, nie zostanie ustawiony, więc próbuje on przejśći
w lewo na początkowym ciąguIi
. To nie zadziała, ponieważ nie ma tam miejsca, więc ciąg początkowy pozostaje niezakłócony (dlatego zamiast tego umieściłem()
wokół )>
<
Pozostaje tylko jeden problem: pod koniec zewnętrznego podstawienia
$_
jest ustawiony wynik zewnętrznego podstawienia, niezależnie od tego, co zrobiłeś$_
wewnątrz ciała substytucji. Tak więc łańcuch docelowy z odpowiednim rozmieszczeniemi
iI
gubi się. W starszych perlach byłaby to fatalna wada. Nowsze perle mają jednakr
modyfikator, co oznacza: „wykonaj kopię oryginalnego łańcucha, dokonaj na nim podstawienia i zwróć wynikowy ciąg (zamiast liczby dopasowań)”. Kiedy używam tego tutaj, wynik jest taki, że zmodyfikowany ciąg poleceń zostaje odrzucony, podczas gdy oryginał$_
nie jest zakłócany przez perla i pozostawiony po podstawieniu. Jednak niepokojące, co robię,$_
wciąż trwa po tym, jak Perl został$_
sam. Więc na koniec$_
będzie właściwym ciągiem docelowym.Ta
-p
opcja zapewnia, że oryginalny ciąg jest w$_
środku, a także drukuje końcowy$_
.źródło
Ii
nieiI
.^
dopasowanie oznacza, że muszę je zamienić. Tak więc odwrotna inicjalizacja jest poprawna.LittleLua - 178 bajtów
Proste wdrożenie.
Nie golfowany:
Co to jest LittleLua?
LittleLua jest w toku. Próbuję wyrównać szanse pomiędzy moim wybranym językiem dla tych wyzwań a językami ezoterycznymi, które często mają niezwykle potężne wbudowane funkcje.
LittleLua to interpreter Lua 5.3.6 z dodatkowym modułem (LittleLua.Lua), a także nazwami funkcji i modułów zmniejszonymi. Te zmiany będą się rozwijać w ciągu następnego dnia lub dwóch, dopóki nie będę zadowolony, ale w tej chwili kilka największych zmian między LittleLua a standardowym tłumaczem Lua to:
Funkcje i moduły są zmniejszone:
Wbudowane zmienne
LittleLua ma kilka wbudowanych zmiennych, które zmniejszają niektóre zadania:
Wbudowane funkcje
Obecnie przygnębiająco mała lista, ale oto ona:
źródło
$
i użyj tego zamiastend
lube
-A-Za-z
znaki bez słów nie potrzebują wokół nich spacji, prawda? Że golić bajt zaend
/e
if
sięi
, oszczędzając jeden bajt za użytku, aend
doe
, oszczędzając dwa, ale zostawilielse
w spokoju? Nawet w tym prostym programie (5if
si 2else
s) marnujesz więcej bajtów,else
niż oszczędzaszif
. (Zakładam, że to planowana poprawa?)Siatkówka ,
10186Wypróbuj online
Zaoszczędź 15 bajtów dzięki daavko!
Wprowadza dane oddzielone znakiem nowej linii i dane wyjściowe, a oczy oddzielone są spacjami.
Wyjaśnienie:
Wyjaśnię jak krok po kroku. Wszystkie te etapy znajdują się w trybie wymiany Retiny. Oznacza to, że pierwszy wiersz jest wyrażeniem regularnym, a drugi wiersz jest łańcuchem zastępczym.
Dodaj inicjał
Ii
na końcu danych wejściowych.Strzałka wsteczna oddziela scenę od opcji. Znak opcji
(
wskazuje, że ten etap jest początkiem pętli etapów, które należy wykonywać wielokrotnie, aż do zakończenia pełnego cyklu bez zmiany danych wejściowych. Ponieważ ten otwarty nawias nigdy nie jest zamknięty, wszystkie pozostałe etapy są częścią tej pętli.Rzeczywisty etap jest bardzo prosty, jeśli pierwszym znakiem ciągu jest nowa linia, usuń ją. Ma to na celu ułatwienie obsługi pustych danych wejściowych, w przeciwnym razie golfista dodałby je do dwóch ostatnich etapów.
Tutaj opcja
s
powoduje, że metaznak Regex.
pasuje do nowych linii. Ten etap powoduje, że interlinia>
zostanie dopasowana,I
a następnie opcjonalna spacja. Następnie zamienia pasujące elementy na następujące po>
, następnie opcjonalne spacje (więc pusty ciąg znaków, jeśli spacja nie może być dopasowana), a następnieI
.Ten etap jest bardzo podobny do poprzedniego, tylko opcjonalna przestrzeń znajduje się przed
I
, a kolejność i oko są odwrócone.Obsługa
i
jest w rzeczywistości często prostsza, ponieważ nie musimy martwić się opcjonalnym dodawaniem lub usuwaniem, ponieważi
zawsze można to zrobić poprawnie. Dlai
przypadków dopasowujemy znak podkreślenia oraz znak większy / mniejszy, ale w przeciwnym razie stosujemy podobną logikę. Ten dodaje spację przedi
.Ponownie podobny do powyższego, ale usuwa znak przed,
i
jeśli znak ten jest spacją, w przeciwnym razie usuwa tylko emotikon.źródło
s`^_>(.*)i( |$)?
=>s`^_>(.*)i
i jego zamiana$1$#2$* i
=>$1 i
, is`^_<(.*?)( )?i
=>s`^_<(.*?) ?i
i jego zamiana$1i$2
=>$1i
.Python,
142141134122121 bajtówZaoszczędzono 19 bajtów dzięki xnor.
Przykład:
Wyjaśnienie:
źródło
i
zawsze pozostanie większy niżI
?I
, kropeki
, bez potrzeby tworzenia list i łączenia.GNU sed, 81 bajtów
(w tym +1 za
-r
flagę)Spowoduje to utworzenie nowego programu sed na podstawie danych wejściowych (które można zobaczyć, usuwając ostatni wiersz) i zastosowanie go do stanu początkowego
Ii
.Wyjaśnienie
<
i>
zastępują polecenia, które przesuwają odpowiednio wI
lewo i w prawo._
pracować nai
zamiastI
i
nie jest ograniczony żadną prawą krawędzią, więc nie dodawaj ani nie zajmuj miejsca po nimIi
.s///e
zawsze używa/bin/sh
jako powłoki, więc nie mogłem tego skrócić tak,sed '&'<<<Ii
jak chciałem (taka jest składnia przekierowań Bash).Wyniki testu
źródło
JavaScript (ES6)
176 171 168 155 148 147 142141 bajtówStosowanie
Degolfed (v6, v7 nie różni się zbytnio)
źródło
=>{ ... }
możesz zrobić wyrażenie i zaoszczędzić sporo bajtówMATL ,
5655504947 bajtówWypróbuj online!
źródło
Retina,
9186 bajtówPrawdopodobnie nie podjąłem najlepszego podejścia, więc prawdopodobnie można grać w golfa więcej. I nie, nie skopiowałem FryAmTheEggman (wiem, że są bardzo podobne w naszym podejściu). Nie widziałem nawet jego odpowiedzi, dopóki nie opublikowałem mojej.
Wypróbuj online
źródło
( |)
końca na ostatniej linii meczowej, ponieważ nigdy nie będzie już miejscai
. Również w przypadku ostatniej linii dopasowania nie potrzebujesz wspornika zamykającego dla pętli. Zamknięta pętla jest automatycznie zamykana na końcu pliku w Retinie.i
a potem coś zastępowałem. Zapomniałem je zmienić.JavaScript (ES6) 166 bajtów
Korzystając z odpowiedzi Charliego Wynna, udało mi się zaoszczędzić 10 bajtów, definiując Math.max jako M i wywołując M za każdym razem, gdy jego skrypt używa
(Nie napisałem tego golfa, zrobił to tutaj Charlie Wynn . Po prostu zmodyfikowałem go, aby go skrócić)
źródło
SyntaxError: missing : in conditional expression
na Firefox. Możesz to naprawić za pomocą_=>{I=0,i=1,M=Math.max;_.split` `.map(m=>(I=(m=m.split`_`)[0]=='<'?M(0,I-1):M(i-1,I+1))+(i=m[1]=='<'?M(I+1,i-1):i+1));(a=Array(i).fill`.`)[I]='I';return a.join``+'i'}
tego samego dokładnego rozmiaru.JavaScript (ES6), 115
118Edycja: 3 bajty zapisane dzięki CharlieWynn
p
oznacza liczbę spacji wcześniejI
;q
to liczba spacji międzyI
ii
. Żaden nie może być negatywny.Mniej golfa
Test
źródło
Siatkówka,
6158 bajtów3 bajty zapisane dzięki @FryAmTheEggman.
Wyjaśnienie nastąpi nieco później.
Wypróbuj online!
Zmodyfikowany kod z testem wsadowym.
źródło
Python 2,
9692 bajtówCałkiem szykowne rozwiązanie na zmienne wyzwanie. Wejście jak
f('>_> <_>')
, wyjście jak'I i'
.Program weryfikacyjny (przy założeniu, że
tests
jest to ciąg wielowierszowego przypadku testowego):Program odczytuje każdą strzałkę pojedynczo, zaczynając od
I=1, i=2
i wykorzystując indeksy 1. Nazwy zmiennych są nieco mylące, ponieważ zamieniają się rolami - po każdym znakuI
staje sięi
ii
jestI
aktualizowane. Znak jest aktualizowany tylko wtedy, gdy nie przesunąłby się ani na pozycję innego znaku, ani na pozycję 0.Na przykład
>_> <_> >_<
wykonujemy:To daje
' Ii'
zgodnie z życzeniem.źródło
Lua, 104 bajty
Stosowanie:
źródło
JavaScript (ES5),
153125 bajtówpobiera dane wejściowe poprzez ustawienie zmiennej
a
przed uruchomieniemNieco golfisty:
źródło
Mathematica, 125 bajtów
Czysta funkcja z pierwszym argumentem
#
. Chodzi o to, że każdy<_
,>_
,<
, i>
na wejściu odpowiada z reguły zastępowania znaków."<_"|">_"|">"|"<"
to ciąg znaków pasujący do dowolnego z tych czterech wyrażeń.StringCases[#,"<_"|">_"|">"|"<"]
znajdzie wszystkie takie dopasowania. Następnie zastępujemy (/.
) każdą"<_"
regułą zastępowania łańcucha".I"->"I."
, każdą">_"
regułą"I."->".I"
i tak dalej. Następnie chcę sekwencyjnie zastosować każdą regułę zamiany do łańcucha"Ii"
, aleStringReplace
będę szukał tylko dopasowań w częściach łańcucha, które nie zostały zamienione, więc zostawiliśmyFold
funkcjęStringReplace
nad listą reguł zastępowania z wartością początkową"Ii"
.Być może byłoby to bardziej zrozumiałe na przykładzie (tutaj
%
odnosi się do wyjścia poprzedniej komórki):źródło