Obróć kropki

46

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.

"  " -> "  "
" ." -> ". "
". " -> "' "
"' " -> " '"
" '" -> " ."
": " -> "''"
"''" -> " :"
":." -> ":'"
":.'" -> ":'."
"..." -> ":. "
": :" -> "':."
"':." -> ".:'"
".:'" -> ": :"
"    " -> "    "
"::::" -> "::::"
":..:'." -> "::. :'"
" :  .:'" -> ". '.. :"
": ''. :" -> "'' :'.."
"........" -> ":...... "
"::::    " -> ":::''   "
"    ::::" -> "   ..:::"
" : : : : " -> ". : : : '"
".'.'.'.'.'" -> "'.'.'.'.'."
".. ::  '.' :." -> ": ..'' .' :.'"
".'  '.::  :.'. . ::.'  '. . .::'  :.'." -> "' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
Zgarb
źródło

Odpowiedzi:

11

JavaScript (ES6), 100 97 93 bajtów

Zaoszczędzono 4 bajty dzięki @ edc65

s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])

Jak to działa

To decyduje o postaci, którą musimy wstawić, wykonując kilka obliczeń na znakach przed i po bieżącym. Sumujemy:

  • Jeśli jest to pierwszy znak, a na dole ma kropkę, 2;
  • W przeciwnym razie, jeśli poprzedni ma kropkę na górze, 2.
  • Jeśli jest to ostatni znak i ma na górze kropkę, 1;
  • W przeciwnym razie, jeśli następna ma kropkę na dole, 1.

To ładnie sumuje się do 0 za spację, 1 za ', 2 za .i 3 za :.

Testowy fragment kodu

ETHprodukcje
źródło
Dobra robota. Zaoszczędź 4: 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)
edc65
@ edc65 Dzięki za wskazówkę!
ETHprodukcje
9

Perl, 70 69 64 63 61 60 bajtów

Obejmuje +2 za -lp

Uruchom z ciągiem wejściowym na STDIN, np

perl -lp rotatedots.pl <<< ":..:'."

rotatedots.pl:

y/'.:/02/r=~/./;y/.':/01/;$_=$'.2*chop|$&/2 .$_;y;0-3; '.:

Wyjaśnienie

y/'.:/02/r                                        Construct bottom row but
                                                  with 2's instead of 1's
                                                  Return constructed value
                                                  (for now assume space
                                                  becomes 0 too)
          =~/./                                   Match first digit on bottom
                                                  row into $&. $' contains
                                                  the rest of the bottom row
                y/.':/01/                         Convert $_ to top row
                                                  (again assume space
                                                  becomes 0 too)
                             $'.2*chop            Remove last digit from
                                                  the top row, multiply by 2
                                                  and append to bottom row
                                       $&/2 .$_   Divide removed digit by
                                                  2 and prepend it to the
                                                  top row
                          $_=         |           "or" the top and bottom
                                                  row together. The ASCII
                                                  values of 0,1,2,3 have
                                                  00,01,10,11 as their last
                                                  two bits.

y;0-3; '.:                  Convert the smashed together top and bottom rows
                            to the corresponding representation characters.
                            Drop the final ; since it is provided by -p
                            (after a newline which doesn't matter here)

Spacja nie jest konwertowana w powyższym kodzie. Do obliczeń /2i *2będzie się zachowywać jak i stanie 0. W pozostałych pozycjach będzie to część „lub”, ale 1 bit przestrzeni jest podzbiorem jednego bitu 0i będzie miał taki sam efekt, jak w 0przypadku 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ż 0i tak zostałby przekształcony z powrotem w kosmos.

Ton Hospel
źródło
8

Retina , 66

  • 2 bajty zapisane dzięki @daavko
  • 4 bajty zapisane dzięki @randomra
:
1e
\.
1f
„
0e

0f
T`h`Rh` ^. |. $
(.)(\re)
2 USD 1 USD
e1
:
e0
„
f0

f1
.

Wyjaśnienie

Począwszy od danych wejściowych:

: ''. :

Pierwsze 4 etapy konstruują macierz, używając odpowiednio 1/ edla true i 0/ fdla false odpowiednio dla górnego / dolnego wiersza. Górne i dolne rzędy są przeplatane razem. To dałoby ciąg taki jak:

e1f0e0e0f1f0e1

Jednak te 4 etapy również skutecznie przesuwają dolny rząd 1 w lewo, po prostu odwracając kolejność liter i cyfr:

1e0f0e0e1f0f1e

Etap Transliteracji odwraca cyfry szesnastkowe tylko dla pierwszego i ostatniego znaku, tzn. Zastępuje 0-9a-fje f-a9-0. W efekcie lewy dolny znak przenosi się do górnego rzędu, a prawy górny znak do dolnego rzędu:

ee0f0e0e1f0f11

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:

e0e0f0e1e0f1f1

Ostatnie 4 etapy tłumaczą się z powrotem do oryginalnego formatu:

'' :'..

Wypróbuj online.

Wszystkie przypadki testowe, po jednym w wierszu , mdodawane do Twiersza, aby umożliwić oddzielne traktowanie każdej linii wejściowej.

Cyfrowa trauma
źródło
7

Galaretka, 32 30 29 bajtów

,Ṛe€"“':“.:”µṪ€;"ṚU1¦ZḄị“'.: 

Zwróć 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ów

100110
101111

któ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.

100110    10011    10111    010111    111010
101111    10111    10011    110011    110011

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.

332031    ::. :'

Jak to działa

,Ṛe€"“':“.:”µṪ€;"ṚU1¦ZḄ‘ị“'.:   Main link. Argument: S (string)

 Ṛ                              Reverse S.
,                               Form a pair of S and S reversed.
     “':“.:”                    Yield ["':" ".:"].
  e€"                           For each character in S / S reversed, check if it
                                is an element of "':" / ".:".
                                Yield the corresponding 2D array of Booleans.

            µ                   Begin a new, monadic chain.
                                Argument: A (2D array of Booleans)
             Ṫ€                 Pop the last Boolean of each list.
                 Ṛ              Yield the reversed array of popped list.
               ;"               Prepend the popped items to the popped lists.
                  U1¦           Reverse the first list.
                     Z          Zip to turn top and bottom rows into pairs.
                      Ḅ         Convert each pair from base 2 to integer.
                        “'.:    Yield "'.: ".
                       ị        Retrieve the characters at the corr. indices.
Dennis
źródło
5

Pyth 38 36

L,hb_ebsXCyc2.>syCXzJ" .':"K.DR2T1KJ

2 bajty dzięki Jakube!

Wypróbuj tutaj lub uruchom pakiet testowy .

Wyjaśnienie:

L,hb_eb         ##  Redefine the function y to take two lists
                ##  and return them but with the second one reversed
                ##  Uses W to apply a function only if it's first argument is truthy
XzJ" .':"K.DR2T ##  Does a translation from the string " .':" to
                ##  .DR2T which is [0,1,2,3...,9] mapped to divmod by 2
                ##  (which is [0,0],[0,1],[1,0],[1,1], then some extra, unused values)
                ##  we also store the string and the list for later use in J and K
.>syC ... 1     ##  zip the lists to get the bits on top and below as two separate lists
                ##  apply the function y from before, flatten and rotate right by 1
Cyc2            ##  split the list into 2 equal parts again, then apply y and zip again
sX ... KJ       ##  apply the list to string transformation from above but in reverse
                ##  then flatten into a string
FryAmTheEggman
źródło
Wydaje się, że zrobiłem to zbyt skomplikowane ^^ Czy mógłbyś dodać wyjaśnienie?
Denker,
1
@DenkerAffe Był w trakcie dodawania jednego :) Dodano!
FryAmTheEggman
Czy to samo podejście jak ty. Zauważyłem dwie rzeczy: ta lambda L,hb_ebjest o jeden bajt krótsza i .DR2Ttworzy także produkt kartezjański oraz kilka innych par, ale nie zawiera cyfr i pomaga zaoszczędzić miejsce.
Jakube,
@Jakube dzięki, ta .Dsztuczka jest naprawdę fajna!
FryAmTheEggman
5

Python 3, 145 141 130 bajtów

def f(s):a=[i in"':"for i in s]+[i in".:"for i in s][::-1];return''.join(" '.:"[i+2*j]for i,j in zip([a[-1]]+a,a[-2:len(s)-2:-1]))

Wyjaśnienie

Golfed rozwiązanie wykorzystać następującą właściwość zip: zip('ABCD', 'xy') --> Ax By tak zip(a[:l],a[l:])można zastąpić zip(a,a[l:])i które pozwalają usunąć definicjęl

def f(s):
 l=len(s)-1
 #                ┌───── unfold input string :  123  -> 123456
 #                │                             654
 #  ──────────────┴──────────────────────────────
 a=[i in"':"for i in s]+[i in".:"for i in s][::-1]
 # ─────────┬─────────   ────────────┬───────────
 #          │                        └──── generate the second row and reverse it
 #          └─────────── generate the first row 

 return''.join(" '.:"[i+2*j]for i,j in zip([a[-1]]+a[:l],a[l:-1][::-1]))
 #             ──────┬──────           ─┬    ────────────┬───────────
 #                   │                  │                └──── rotate and create first/second new row :  123456  -> 612345  -> 612
 #                   │                  │                                                                                      543
 #                   │                  └ group pair of the first and second row : 612 -> (6,5),(1,4),(2,3)
 #                   │                                                             543
 #                   └─────────── replace pair by symbol 

Wyniki

>>> f(".'  '.::  :.'. . ::.'  '. . .::'  :.'.")
"' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
>>> f(".....''''''")
":...  '''':"
Erwan
źródło
Możesz zapisać kilka bajtów, umieszczając ostatnie trzy wiersze w jednym wierszu, oddzielając je średnikami.
mbomb007
4

Pyth, 66 bajtów

KlQJ.nCm@[,1Z,Z1,ZZ,1 1)%Cd5Qjkm@" .':"id2Ccs[:JKhK<JtK>JhK:JtKK)K

Wypróbuj tutaj!

Wyjaśnienie

Można to podzielić na 3 części:

  • Przekształć dane wejściowe w płaską tablicę zer i jedynek.
  • Wykonaj obrót.
  • Konwertuj go z powrotem na ASCII.

Konwertuj dane wejściowe

To jest dość trywialne. Każda postać jest mapowana w następujący sposób:

  -> (0,0)
. -> (0,1)
„-> (1,0)
: -> (1,0)

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

KlQJ.nCm @ [, 1Z, Z1, ZZ, 1 1)% Cd5Q # Q = wejście

KlQ # zapisz szerokość macierzy w K (przyzwyczaja się później)
       m Q # mapuj każdą postać d
                        % Cd5 # ASCII-kod d modulo 5
        @ [, 1Z, Z1, ZZ, 1 1) # użyj tego jako indeksu do listy odnośników
   J.nC # transponuj, spłaszcz i przypisz do J

Obracać się

Mamy macierz jako płaską macierz Ji szerokość macierzy w K. Obrót można opisać jako:

J[K] + J[:K-1] + J[K+1:] + J[K-1]

Kod

s [: JKhKJhK: JtKK) # J = płaska tablica, K = szerokość macierzy

s [) # Zsumuj wszystkie wyniki na tej liście
  : JKhK # J [K]
       JhK # J [K + 1:]
               : JtKK # J [K-1]

Konwertuj to z powrotem

jkm @ ". ':" id2Cc [) K # [) = wynikowa lista powyższego kroku

              c [) K # posiekaj na 2 rzędy
             C # transponuj, aby odzyskać 2-krotki
  m # mapa każda 2-krotek d
          id2 # interpretuj d jako binarne i konwertuj na dziesiętny
   @ ". ':" # użyj tego jako indeksu w ciągu wyszukiwania, aby uzyskać poprawny znak
jk # łączyć w jeden ciąg

Denker
źródło
3

Python 3, 166 154 153 150 146 138 137 135 132 127 bajtów

Edycja: Pożyczyłem użycie zipz odpowiedzi Erwona w Pythonie na końcu funkcji. i ich pomysł na użycie [::-1]odwrócenia, chociaż sam się zmieniłem. Jak się okazuje, cofnięcia nie były dobrym pomysłem dla mojej funkcji. Zmieniłem sposób gry formatw golfa. Przeniesiony ai bbezpośrednio do zipdalszej gry w golfa (niestosowanie golfa pozostaje niezmienione, ponieważ oddzielenie ai bjest 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óre zip(*[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 krotek ti v.

t,v=zip(*[divmod(708>>2*(ord(i)%5)&3,2)for i in input()])
print("".join(" '.:"[i+j*2]for i,j in zip((v[0],*t),(*v[1:],t[-1]))))

Nie golfowany:

def rotate_dots(s):
    # dots to 2 by len(s) matrix of 0s and 1s (but transposed)
    t = []
    v = []
    for i in s:
        m = divmod(708 >> 2*(ord(i)%5) & 3, 2)
            # ord(i)%5 of each char in . :' is in range(1,5)
            # so 708>>2 * ord & 3 puts all length-2 01-strings as a number in range(0,4)
            # e.g. ord(":") % 5 == 58 % 5 == 3
            # 708 >> 2*3 & 3 == 0b1011000100 >> 6 & 3 == 0b1011 == 11
            # divmod(11 & 3, 2) == divmod(3, 2) == (1, 1)
            # so, ":" -> (1, 1)
        t.append(m[0])
        v.append(m[1])

    # transposing the matrix and doing the rotations
    a = (v[0], *t)          # a tuple of the first char of the second row 
                            # and every char of the first row except the last char
    b = (v[1:], t[-1])      # and a tuple of every char of the second row except the first
                            # and the last char of the first row

    # matrix to dots
    z = ""
    for i, j in zip(a, b):
        z += " '.:"[i + j*2]    # since the dots are binary
                                # we take " '.:"[their binary value]
    return z
Sherlock9
źródło
2

Rubin, 166 163 bajtów

->s{a=s.tr(f=" .':",t='0-3').chars.map{|x|sprintf('%02b',x).chars}.transpose;a[1]+=[a[0].pop];a[0]=[a[1].shift]+a[0];a.transpose.map{|x|x.join.to_i 2}.join.tr t,f}

Fuj ... transposejest 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

Klamka
źródło
Czy mogę zasugerować trochę golfa? ->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}
manatwork
W końcu ☕ zadziałało. Szukał tego cały ranek: .map{|x|x.join.to_i 2}.join.tr'0-3',f.map{|x|f[x.join.to_i 2]}*''
manatwork
2

JavaScript ES6 125 bajtów

q=>(n=[...q].map(a=>(S=` .':`).indexOf(a))).map((a,i)=>(i?n[i-1]&2:n[0]&1&&2)|((I=n[i+1])>-1?I&1:n[i]&2&&1)).map(a=>S[a]).join``

Mapuję każdy znak na dwucyfrowy ekwiwalent binarny

 : becomes 3   11
 ' becomes 2   10
 . becomes 1   01
   becomes 0   00

i myślę o nich jako o sobie

3212021 becomes
1101010
1010001

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

Charlie Wynn
źródło
2

MATL , 40 39 bajtów

' ''.:'tjw4#mqBGnXKq:QKEh1Kq:K+hv!)XBQ)

Wypróbuj online! Wersja powiązana została vzastąpiona przez z &vpowodu zmian w języku po opublikowaniu tej odpowiedzi .

' ''.:'               % pattern string. Will indexed into, twice: first for reading 
                      % the input and then for generating the ouput
t                     % duplicate this string
j                     % input string
w                     % swap
4#m                   % index of ocurrences of input chars in the pattern string
qB                    % subtract 1 and convert to binay. Gives 2-row logical array
GnXKq:QKEh1Kq:K+hv!   % (painfully) build two-column index for rotation
)                     % index into logical array to perform the rotation
XBQ                   % transform each row into 1, 2, 3 or 4
)                     % index into patter string. Implicitly display
Luis Mendo
źródło
1

JavaScript, 311 bajtów

Prawdopodobnie można go znacznie poprawić:

a=(s=prompt()).length-1;o=s[0]==":"||s[0]=="."?s[1]==":"||s[1]=="."?":":"'":s[1]==":"||s[1]=="."?".":" ";for(i=1;i<a;i++)o+=s[i-1]=="'"||s[i-1]==":"?s[i+1]=="."||s[i+1]==":"?":":"'":s[i+1]=="."||s[i+1]==":"?".":" ";alert(o+=s[a]==":"||s[a]=="'"?s[a-1]==":"||s[a-1]=="'"?":":"'":s[a-1]==":"||s[a-1]=="'"?".":" ")
Jens Renders
źródło
Może coś ustawić s[i-1]? To może zaoszczędzić trochę bajtów.
Rɪᴋᴇʀ
To samo z s[i+1].
Rɪᴋᴇʀ
1
Spróbuj użyć funkcji strzałek ES6 i wyszukiwania, również użycie <zamiast ==może zaoszczędzić sporo bajtów. Możesz także
sprawdzić
1
@Downgoat Jak używać <zamiast==
Jens Renders
1

JavaScript (ES6), 237 210 204 188 182 178 bajtów

Kredyt dla @Downgoat za uratowanie 16 bajtów w przeglądzie 188 bajtów

Aktualizacja: Miałem falę mózgową i zredukowałem pierwszą operację sdo jednego mappołączenia zamiast dwóch osobnych

s=>(r=" .':",a=[],s=[...s].map(c=>(t=('00'+r.indexOf(c).toString(2)).slice(-2),a.push(t[0]),t[1])),a.splice(0,0,s.shift()),s.push(a.pop()),a.map((v,i)=>r[+('0b'+v+s[i])]).join``)

Ładny druk i objaśnienie

s => (
  r = " .':", // Map of characters to their (numerical) binary representations (e.g. r[0b10] = "'")
  a = [],     // extra array needed
  // Spread `s` into an array
  s = [...s].map(c => (
    // Map each character to a `0`-padded string representation of a binary number, storing in `t`
    t = ('00' + r.indexOf(c).toString(2)).slice(-2)),
    // Put the first character of `t` into `a`
    a.push(t[0]),
    // Keep the second character for `s`
    t[1]
  )),
  // Put the first character of `s` in the first index of `a`
  a.splice(0,0,s.shift()),
  // Append the last character of `a` to `s`
  s.push(a.pop(),
  // Rejoin the characters, alternating from `a` to `s`, representing the rotated matrix, and map them back to their string representation
  // Use implicit conversion of a binary number string using +'0b<num>'
  a.map((v,i) => r[+('0b' + v + s[i])]).join``
)
RevanProdigalKnight
źródło
1
działa: 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?
Downgoat
Przepraszam, że nie odpowiedziałem na to wcześniej, nie widziałem powiadomienia - moje narzędzia dla programistów dają mi wyjątek „nielegalnej postaci”
RevanProdigalKnight
Sprawił, że działał tak, jak go ułożyłeś - najwyraźniej, kiedy go skopiowałem, było w nim kilka niewidzialnych znaków, które nie pojawiły się w narzędziach programistycznych przeglądarki.
RevanProdigalKnight
1

Perl, 144 142 137 131 bajtów

y/.':/1-3/;s/./sprintf'%02b ',$&/ge;@a=/\b\d/g;@b=(/\d\b/g,pop@a);@a=(shift@b,@a);say map{substr" .':",oct"0b$a[$_]$b[$_]",1}0..@a

Dodano bajt dla -nflagi.

Prawie ten sam algorytm jak moja odpowiedź Ruby , tylko krótszy, ponieważ ... Perl.

y/.':/1-3/;                         # transliterate [ .':] to [0123]
s/./sprintf'%02b ',$&/ge;           # convert each digit to 2-digit binary
@a=/\b\d/g;                         # grab the 1st digit of each pair
@b=(/\d\b/g,                        # 2nd digit of each pair
pop@a);                             # push the last element of a to b
@a=(shift@b,@a);                    # unshift the first element of b to a
say                                 # output...
map{                                # map over indices of a/b
substr" .':",oct"0b$a[$_]$b[$_]",1  # convert back from binary, find right char
}0..@a                              # @a is length of a

Nieprzyjemnie @a=(shift@b,@a)jest krótszy niż unshift@a,shift@b.

Niestety są one tej samej długości:

y/ .':/0-3/;s/./sprintf'%02b ',$&/ge;
s/./sprintf'%02b ',index" .':",$&/ge;

Dzięki Ton Hospel za 5 bajtów i msh210 za bajt!

Klamka
źródło
Czy możesz użyć ..@azamiast ..$#a? (Być może octumiera lub zwraca 0 lub coś. Nie próbowałem tego.)
msh210
Nie trzeba konwertować spacji na 0. W każdym razie będzie to 0 dla sprintu. Pozbądź się także nawiasu w wyrażeniu regularnym. Jeśli nie ma przejęcia, cały mecz jest zwracany dla//g
Ton Hospel
@ msh210 To rzeczywiście działa; dzięki!
Klamka
@TonHospel Thanks, włączyłem je do odpowiedzi (choć oczywiście twoje wciąż całkowicie wydmuchuje moje z wody).
Klamka
To sprintfbardzo długo. map$_%2,/./gi map$_/2|0,//gprawie musi być krótszy (niesprawdzony)
Ton Hospel
0

Python 3, 294 287 283 bajtów

Waaayyyyyy za długo, ale spróbuję zagrać w golfa w niektórych bajtach:

z=input()
x=len(z)
M=[0,1,2,3]
for Q in M:z=z.replace(":'. "[Q],"11100100"[Q*2:Q*2+2])
a=[]
b=[]
for X in range(x):a+=[z[X*2]];b+=[z[X*2+1]]
b=b[1:]+[a.pop()]
c=[b[0]]+a
z=""
for X in range(len(c)):
 y=c[X]+b[X]
 for Q in M:y=y.replace("11100100"[Q*2:Q*2+2],":'. "[Q])
 z+=y
print(z)
Adnan
źródło
0

Lua, 139 bajtów

print(((...):gsub(".",{[" "]="NN@",["."]="YN@",["'"]="NY@",[":"]="YY@"}):gsub("(.)@(.?)","%2%1"):gsub("..",{NN=" ",NY=".",YN="'",YY=":"})))

Stosowanie:

$ lua conveyor.lua ".'  '.::  :.'. . ::.'  '. . .::'  :.'."
' ' .:.''..'.'. ..:' ' .'. ...'''..'.'
Egor Skriptunoff
źródło