Przedstawienia
Matryca logiczna 2 × n może być reprezentowana jako ciąg czterech znaków . ':
. Ciąg ma „górny rząd” i „dolny rząd”, z kropkami reprezentującymi 1s i pustymi spacjami reprezentującymi 0s. Na przykład macierz 2 × 6
1 0 1 0 0 1
0 0 0 1 0 1
może być reprezentowany jako ' '. :
. Twoim zadaniem jest pobranie matrycy w tej „skompresowanej formie” i obrócenie jej wpisów o jeden krok zgodnie z ruchem wskazówek zegara, jak taśma przenośnika.
Wejście
Twój tekst jest pojedynczym ciągiem znaków . ':
. Jego długość wynosi co najmniej 2.
Wynik
Twój wynik będzie ciągiem wejściowym, ale z każdą kropką obróconą o jeden krok w kierunku zgodnym z ruchem wskazówek zegara. Mówiąc dokładniej, kropki w górnym rzędzie znajdują się o jedno miejsce po prawej stronie, z wyjątkiem skrajnie prawej, która przesuwa się w dół. Kropki w dolnym rzędzie przesuwają się o jeden krok w lewo, z wyjątkiem skrajnego lewego, który przesuwa się w górę. W szczególności ciąg wyjściowy musi mieć tę samą długość co oryginał, a spacje są znaczące.
Przykład
Rozważ ciąg wejściowy :..:'.
, który odpowiada macierzy 2 × 6
1 0 0 1 1 0
1 1 1 1 0 1
Obrócona wersja tej matrycy to
1 1 0 0 1 1
1 1 1 0 1 0
co odpowiada ciągowi ::. :'
.
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone. Możesz zdecydować, czy dane wejściowe i wyjściowe są ujęte w cudzysłowy, a jeden końcowy znak nowej linii jest również dopuszczalny w obu.
Przypadki testowe
Te przypadki testowe są ujęte w podwójne cudzysłowy.
" " -> " "
" ." -> ". "
". " -> "' "
"' " -> " '"
" '" -> " ."
": " -> "''"
"''" -> " :"
":." -> ":'"
":.'" -> ":'."
"..." -> ":. "
": :" -> "':."
"':." -> ".:'"
".:'" -> ": :"
" " -> " "
"::::" -> "::::"
":..:'." -> "::. :'"
" : .:'" -> ". '.. :"
": ''. :" -> "'' :'.."
"........" -> ":...... "
":::: " -> ":::'' "
" ::::" -> " ..:::"
" : : : : " -> ". : : : '"
".'.'.'.'.'" -> "'.'.'.'.'."
".. :: '.' :." -> ": ..'' .' :.'"
".' '.:: :.'. . ::.' '. . .::' :.'." -> "' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])
(odwróć 2 części, abym mógł zwiększyć i, mniej wyrażeń regularnych i prostszy test, zapisz poprzednie cw q)Perl,
706964636160 bajtówObejmuje +2 za
-lp
Uruchom z ciągiem wejściowym na STDIN, np
rotatedots.pl
:Wyjaśnienie
Spacja
nie jest konwertowana w powyższym kodzie. Do obliczeń
/2
i*2
będzie się zachowywać jak i stanie0
. W pozostałych pozycjach będzie to część „lub”, ale 1 bit przestrzeni jest podzbiorem jednego bitu0
i będzie miał taki sam efekt, jak w0
przypadku dowolnej z cyfr. Tylko jeśli postać, z którą jest orodowana, jest spacją, pozostanie spacją, zamiast stać się spacją0
. Ale to w porządku, ponieważ0
i tak zostałby przekształcony z powrotem w kosmos.źródło
Retina , 66
Wyjaśnienie
Począwszy od danych wejściowych:
Pierwsze 4 etapy konstruują macierz, używając odpowiednio
1
/e
dla true i0
/f
dla false odpowiednio dla górnego / dolnego wiersza. Górne i dolne rzędy są przeplatane razem. To dałoby ciąg taki jak:Jednak te 4 etapy również skutecznie przesuwają dolny rząd 1 w lewo, po prostu odwracając kolejność liter i cyfr:
Etap
T
ransliteracji odwraca cyfry szesnastkowe tylko dla pierwszego i ostatniego znaku, tzn. Zastępuje0-9a-f
jef-a9-0
. W efekcie lewy dolny znak przenosi się do górnego rzędu, a prawy górny znak do dolnego rzędu:Następny etap zamienia następnie każdą parę liter i cyfr, przesuwając w ten sposób górny rząd 1 w prawo. Wcześniej tak było
(\D)(\d)
, ale okazuje się, że(.)(\d)
jest to wystarczające, ponieważ podstawienia zawsze następują od lewej do prawej, więc ostatnie dwie cyfry nie zostaną przez to błędnie dopasowane, ponieważ przedostatni znak zostanie już zastąpiony. Matryca została teraz całkowicie obrócona zgodnie z wymaganiami:Ostatnie 4 etapy tłumaczą się z powrotem do oryginalnego formatu:
Wypróbuj online.
Wszystkie przypadki testowe, po jednym w wierszu ,
m
dodawane doT
wiersza, aby umożliwić oddzielne traktowanie każdej linii wejściowej.źródło
Galaretka,
323029 bajtówZwróć uwagę na spację końcową. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
tło
Zaczynamy od rozważenia ciągu wejściowego (np.
:..:'.
) I jego odwrotności.Dla każdego znaku w górnym rzędzie sprawdzamy, czy należy do
':
, i dla każdego znaku w dolnym rzędzie, jeśli należy.:
. Daje to tablicę 2D booleanówktóra jest matrycą z pytania, z odwróconym dolnym rzędem.
Usuwamy ostatnią wartość logiczną każdego wiersza, odwracamy kolejność wierszy, poprzedzamy wartości logiczne w ich oryginalnej kolejności, a na koniec odwracamy górny wiersz.
Daje to obróconą macierz z pytania.
Na koniec uważamy każdą kolumnę liczby logicznej za liczbę binarną i indeks do,
'.:
aby uzyskać odpowiednie znaki.Jak to działa
źródło
Pyth
38362 bajty dzięki Jakube!
Wypróbuj tutaj lub uruchom pakiet testowy .
Wyjaśnienie:
źródło
L,hb_eb
jest o jeden bajt krótsza i.DR2T
tworzy także produkt kartezjański oraz kilka innych par, ale nie zawiera cyfr i pomaga zaoszczędzić miejsce..D
sztuczka jest naprawdę fajna!Python 3,
145141130 bajtówWyjaśnienie
Golfed rozwiązanie wykorzystać następującą właściwość zip:
zip('ABCD', 'xy') --> Ax By
takzip(a[:l],a[l:])
można zastąpićzip(a,a[l:])
i które pozwalają usunąć definicjęl
Wyniki
źródło
Pyth, 66 bajtów
Wypróbuj tutaj!
Wyjaśnienie
Można to podzielić na 3 części:
Konwertuj dane wejściowe
To jest dość trywialne. Każda postać jest mapowana w następujący sposób:
Pierwszy to biały znak.
Otrzymujemy listę 2-krotek, które transponujemy, aby uzyskać 2 rzędy macierzy, która następnie zostaje spłaszczona.
Kod
Obracać się
Mamy macierz jako płaską macierz
J
i szerokość macierzy wK
. Obrót można opisać jako:Kod
Konwertuj to z powrotem
źródło
Python 3,
166154153150146138137135132127 bajtówEdycja: Pożyczyłem użycie
zip
z odpowiedzi Erwona w Pythonie na końcu funkcji.i ich pomysł na użycieJak się okazuje, cofnięcia nie były dobrym pomysłem dla mojej funkcji. Zmieniłem sposób gry[::-1]
odwrócenia, chociaż sam się zmieniłem.format
w golfa. Przeniesionya
ib
bezpośrednio dozip
dalszej gry w golfa (niestosowanie golfa pozostaje niezmienione, ponieważ oddzieleniea
ib
jest przydatne w celu uniknięcia bałaganu w moim wyjaśnieniu)Edycja: Zapożyczony
(some number)>>(n)&(2**something-1)
z tej odpowiedzi przez xnor w konkursie Music Interval Solver . Zaśmiecenie, którezip(*[divmod(et cetera, 2) for i in input()])
prawdopodobnie można lepiej zagrać w golfa, ale podoba mi się celowość, jaką zapewnia użycie dwóch krotekt
iv
.Nie golfowany:
źródło
Rubin,
166163 bajtówFuj ...
transpose
jest za długi.Sztuczki wykorzystane tutaj:
sprintf('%02b',x)
Aby przekonwertować"0"
,"1"
,"2"
,"3"
na"00"
,"01"
,"10"
, i"11"
odpowiednio. Co zaskakujące, drugi argument nie musi być najpierw przekształcony w liczbę całkowitą.Rotacja odbywa się za pośrednictwem
a[1].push a[0].pop;a[0].unshift a[1].shift;
, co moim zdaniem było co najmniej trochę sprytne (jeśli nie nadmiernie gadatliwe w Ruby). W każdym razie symetria jest ładna estetycznie: Pźródło
->s{a=s.tr(f=" .':",'001').chars;b=s.tr(f,'0101').chars;b<<a.pop;([b.shift]+a).zip(b).map{|x|x.join.to_i 2}.join.tr'0-3',f}
.map{|x|x.join.to_i 2}.join.tr'0-3',f
→.map{|x|f[x.join.to_i 2]}*''
JavaScript ES6 125 bajtów
Mapuję każdy znak na dwucyfrowy ekwiwalent binarny
i myślę o nich jako o sobie
Zapisuję to n
Dla każdego znaku (0-3) n sprawdzam sąsiadów, dodając bit najwyższego rzędu lewego sąsiada do bitu najniższego rzędu prawego sąsiada. jeśli i == 0 (pierwszy znak) używam własnego bitu niższego rzędu zamiast bitu wyższego rzędu lewego sąsiada.
jeśli n [i + 1]> - 1 oznacza, że otrzymaliśmy 0,1,2,3, więc jeśli to fałsz, trafiamy na ostatni element.
Kiedy tak się dzieje, używam własnego bitu najwyższego rzędu postaci zamiast dolnego bitu prawego sąsiada
odwzoruj to z powrotem na
.':
ląd i ponownie dołącz do tej tablicyźródło
MATL ,
4039 bajtówWypróbuj online! Wersja powiązana została
v
zastąpiona przez z&v
powodu zmian w języku po opublikowaniu tej odpowiedzi .źródło
JavaScript, 311 bajtów
Prawdopodobnie można go znacznie poprawić:
źródło
s[i-1]
? To może zaoszczędzić trochę bajtów.s[i+1]
.<
zamiast==
może zaoszczędzić sporo bajtów. Możesz także<
zamiast==
JavaScript (ES6),
237210204188182178 bajtówKredyt dla @Downgoat za uratowanie 16 bajtów w przeglądzie 188 bajtów
Aktualizacja: Miałem falę mózgową i zredukowałem pierwszą operację
s
do jednegomap
połączenia zamiast dwóch osobnychŁadny druk i objaśnienie
źródło
s=>(r=" .':",a=[],s=[...s].map(c=>('00'+r.indexOf(c).toString(2)).slice(-2)).map(n=>(a.push(n[0]),n[1]),a.splice(0,0,s.shift()),s.push(a.pop()),a.map((v,i)=>r[parseInt(v+s[i],2)]).join``)
działa?Perl,
144142137131 bajtówDodano bajt dla
-n
flagi.Prawie ten sam algorytm jak moja odpowiedź Ruby , tylko krótszy, ponieważ ... Perl.
Nieprzyjemnie
@a=(shift@b,@a)
jest krótszy niżunshift@a,shift@b
.Niestety są one tej samej długości:
Dzięki Ton Hospel za 5 bajtów i msh210 za bajt!
źródło
..@a
zamiast..$#a
? (Być możeoct
umiera lub zwraca 0 lub coś. Nie próbowałem tego.)//g
sprintf
bardzo długo.map$_%2,/./g
imap$_/2|0,//g
prawie musi być krótszy (niesprawdzony)Python 3,
294287283 bajtówWaaayyyyyy za długo, ale spróbuję zagrać w golfa w niektórych bajtach:
źródło
Lua, 139 bajtów
Stosowanie:
źródło