Putar titik-titiknya


46

Perkenalan

Matriks Boolean 2 × n dapat direpresentasikan sebagai string dari empat karakter . ':. String memiliki "baris atas" dan "baris bawah", dengan titik-titik mewakili 1s dan spasi kosong mewakili 0s. Misalnya, matriks 2 × 6

1 0 1 0 0 1
0 0 0 1 0 1

dapat direpresentasikan sebagai ' '. :. Tugas Anda adalah mengambil matriks dalam "bentuk terkompresi" ini, dan memutar isinya satu langkah searah jarum jam, seperti sabuk konveyor.

Memasukkan

Input Anda adalah string tunggal di atas karakter . ':. Panjangnya dijamin minimal 2.

Keluaran

Output Anda akan menjadi string input, tetapi dengan setiap titik diputar satu langkah ke arah searah jarum jam. Lebih eksplisit, titik-titik di baris atas lebih banyak tempat ke kanan, kecuali yang paling kanan, yang bergerak ke bawah. Titik-titik pada baris bawah bergerak satu langkah ke kiri, kecuali yang paling kiri, yang bergerak ke atas. Secara khusus, string output harus memiliki panjang yang sama dengan aslinya, dan spasi putih signifikan.

Contoh

Pertimbangkan string input :..:'., yang sesuai dengan matriks 2 × 6

1 0 0 1 1 0
1 1 1 1 0 1

Versi rotasi dari matriks ini adalah

1 1 0 0 1 1
1 1 1 0 1 0

yang sesuai dengan string ::. :'.

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan. Anda dapat memutuskan apakah input dan output dilampirkan dalam tanda kutip, dan satu baris tambahan juga dapat diterima di keduanya.

Uji kasus

Kasing uji ini dilampirkan dalam tanda kutip ganda.

"  " -> "  "
" ." -> ". "
". " -> "' "
"' " -> " '"
" '" -> " ."
": " -> "''"
"''" -> " :"
":." -> ":'"
":.'" -> ":'."
"..." -> ":. "
": :" -> "':."
"':." -> ".:'"
".:'" -> ": :"
"    " -> "    "
"::::" -> "::::"
":..:'." -> "::. :'"
" :  .:'" -> ". '.. :"
": ''. :" -> "'' :'.."
"........" -> ":...... "
"::::    " -> ":::''   "
"    ::::" -> "   ..:::"
" : : : : " -> ". : : : '"
".'.'.'.'.'" -> "'.'.'.'.'."
".. ::  '.' :." -> ": ..'' .' :.'"
".'  '.::  :.'. . ::.'  '. . .::'  :.'." -> "' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"

Jawaban:


11

JavaScript (ES6), 100 97 93 byte

Disimpan 4 byte berkat @ edc65

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

Bagaimana itu bekerja

Ini menentukan karakter yang perlu kita sisipkan dengan melakukan beberapa perhitungan pada karakter sebelum dan sesudah yang sekarang. Kami menjumlahkan:

  • Jika ini char pertama, dan ada titik di bagian bawah, 2;
  • Kalau tidak, jika yang sebelumnya memiliki titik di atas, 2.
  • Jika itu char terakhir, dan ada titik di atasnya, 1;
  • Jika tidak, jika yang di belakangnya memiliki titik di bagian bawah, 1.

Jumlah ini bagus untuk 0 untuk spasi, 1 untuk ', 2 untuk ., dan 3 untuk :.

Cuplikan tes


Sudah selesai dilakukan dengan baik. Hemat 4: s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])(balik 2 bagian sehingga saya dapat meningkatkan i, lebih sedikit regexp dan tes yang lebih sederhana, simpan prev c in q)
edc65

@ edc65 Terima kasih atas tipnya!
ETHproduk

9

Perl, 70 69 64 63 61 60 byte

Termasuk +2 untuk -lp

Jalankan dengan string input pada STDIN, mis

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

rotatedots.pl:

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

Penjelasan

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)

Spasi tidak dikonversi dalam kode di atas. Untuk perhitungan /2dan *2itu akan berperilaku seperti dan menjadi 0. Di posisi lain itu akan menjadi bagian dari "atau", tetapi 1 bit ruang adalah himpunan bagian dari satu bit 0dan akan memiliki efek yang sama seperti 0jika atau-ed dengan salah satu digit. Hanya jika karakter itu atau-ed dengan adalah ruang akan tetap ruang bukan menjadi 0. Tapi tidak apa-apa karena 0akan dikonversi kembali ke ruang angkasa.


8

Retina , 66

  • 2 byte disimpan berkat @daavko
  • 4 byte disimpan berkat @randomra
:
1e
\.
1f
'
0e

0f
T`h`Rh` ^. |. $
(.) (\ d)
$ 2 $ 1
e1
:
e0
'
f0

f1
.

Penjelasan

Dimulai dengan input:

: ''. :

4 tahap pertama membangun matriks, masing-masing menggunakan 1/ euntuk true dan 0/ funtuk false untuk baris atas / bawah. Baris atas dan bawah saling terkait. Ini akan menghasilkan string seperti:

e1f0e0e0f1f0e1

Namun, 4 tahap ini juga secara efektif memindahkan baris bawah 1 ke kiri, hanya dengan membalik urutan huruf dan angka:

1e0f0e0e1f0f1e

Tahap Transliteration membalikkan digit hex untuk karakter pertama dan terakhir saja, yaitu menggantikan 0-9a-fdengan f-a9-0. Ini memiliki efek memindahkan karakter kiri bawah ke atas ke baris atas dan karakter kanan atas ke bawah ke baris bawah:

ee0f0e0e1f0f11

Tahap selanjutnya kemudian menukar setiap pasangan huruf-digit, dengan demikian memindahkan baris atas 1 ke kanan. Sebelumnya ini adalah (\D)(\d), tetapi ternyata itu (.)(\d)cukup karena pergantian selalu terjadi dari kiri ke kanan sehingga dua digit terakhir tidak akan secara keliru dicocokkan dengan ini, karena karakter kedua dari belakang akan sudah diganti. Matriks sekarang telah sepenuhnya dirotasi sesuai kebutuhan:

e0e0f0e1e0f1f1

4 tahap terakhir kemudian terjemahkan kembali ke format asli:

'' :'..

Cobalah online.

Semua testcases, satu per baris , mditambahkan ke Tbaris untuk memungkinkan perlakuan terpisah dari setiap jalur input.


7

Jelly, 32 30 29 byte

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

Perhatikan ruang trailing. Cobalah online! atau verifikasi semua kasus uji .

Latar Belakang

Kita mulai dengan mempertimbangkan string input (misalnya, :..:'.) dan kebalikannya.

:..:'.
.':..:

Untuk setiap karakter di baris atas, kami memeriksa apakah itu milik ':, dan untuk setiap karakter dari baris bawah jika itu milik .:. Ini memberikan array 2D Boolean

100110
101111

yang merupakan matriks dari pertanyaan, dengan baris bawah terbalik.

Kami menghapus Boolean terakhir dari setiap baris, membalikkan urutan baris, mengubah urutan Boolean dalam urutan aslinya, dan akhirnya membalikkan baris atas.

100110    10011    10111    010111    111010
101111    10111    10011    110011    110011

Ini menghasilkan matriks yang diputar dari pertanyaan.

Akhirnya, kami menganggap setiap kolom Booleans nomor biner dan indeks ke dalam '.:untuk mendapatkan karakter yang sesuai.

332031    ::. :'

Bagaimana itu bekerja

,Ṛ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.

5

Pyth, 38 36

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

2 byte berkat Jakube!

Cobalah di sini atau jalankan Test Suite .

Penjelasan:

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

Sepertinya saya melakukannya terlalu rumit ^^ Apakah Anda keberatan menambahkan penjelasan?
Denker

1
@DenkerAffe Sedang menambahkan satu :) Ditambahkan!
FryAmTheEggman

Lakukan pendekatan yang sama seperti Anda. Dua hal yang saya perhatikan: lambda L,hb_ebini lebih pendek satu byte, dan .DR2Tjuga menciptakan produk Cartesian dan beberapa pasangan lagi, tetapi tidak dan dalam digit dan membantu menghemat ruang.
Jakube

@ Jakube terima kasih, .Dtrik itu sangat keren!
FryAmTheEggman

5

Python 3, 145 141 130 byte

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]))

Penjelasan

Solusi golf menggunakan properti zip berikut: zip('ABCD', 'xy') --> Ax By jadi zip(a[:l],a[l:])dapat diganti dengan zip(a,a[l:])dan yang memungkinkan untuk menghapus definisil

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 

Hasil

>>> f(".'  '.::  :.'. . ::.'  '. . .::'  :.'.")
"' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
>>> f(".....''''''")
":...  '''':"

Anda dapat menyimpan beberapa byte dengan meletakkan tiga baris terakhir pada satu baris, dipisahkan oleh titik koma.
mbomb007

4

Pyth, 66 byte

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

Coba di sini!

Penjelasan

Ini dapat dipecah menjadi 3 bagian:

  • Konversikan input ke dalam array datar satu dan nol.
  • Lakukan rotasi.
  • Ubah kembali menjadi ASCII.

Konversi input

Ini cukup sepele. Setiap karakter dipetakan dengan cara berikut:

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

Yang pertama adalah spasi.
Kami mendapatkan daftar 2-tupel yang kami transpos untuk mendapatkan 2 baris matriks yang kemudian diratakan.

Kode

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

KlQ # simpan lebar matriks dalam K (akan digunakan nanti)
       m Q # memetakan setiap karakter d
                        % Cd5 # ASCII-kode d modulo 5
        @ [, 1Z, Z1, ZZ, 1 1) # gunakan ini sebagai indeks ke dalam daftar pencarian
   J.nC # transpos, ratakan dan tetapkan ke J

Memutar

Kami memiliki matriks sebagai array datar Jdan lebar matriks dalam K. Rotasi dapat digambarkan sebagai:

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

Kode

s [: JKhKJhK: JtKK) # J = array datar, K = lebar matriks

s [) # Concat semua hasil dalam daftar ini
  : JKhK # J [K]
       JhK # J [K + 1:]
               : JtKK # J [K-1]

Konversikan kembali

jkm @ ". ':" id2Cc [) K # [) = daftar yang dihasilkan dari langkah di atas

              c [) K # memotong menjadi 2 baris
             C # transpos untuk mendapatkan 2-tupel kembali
  m # memetakan setiap 2-tupel d
          id2 # menafsirkan d sebagai biner dan mengonversi menjadi desimal
   @ ". ':" # gunakan itu sebagai indeks ke dalam string pencarian untuk mendapatkan karakter yang benar
jk # gabung menjadi satu string


3

Python 3, 166 154 153 150 146 138 137 135 132 127 byte

Edit: Saya sudah meminjam penggunaan zipdari Erwan ini jawabannya Python pada akhir fungsi. dan ide mereka untuk menggunakan [::-1]pembalikan, meskipun saya memasukkan twist sendiri. Ternyata, pembalikan itu bukan ide yang baik untuk fungsi saya. Saya telah mengubah penggunaan saya formatuntuk bermain golf lebih lanjut. Pindah adan blangsung ke zipuntuk golf lebih lanjut (ungolfing tetap tidak berubah karena pemisahan adan bada berguna untuk menghindari kekacauan dalam penjelasan saya)

Sunting: Dipinjam (some number)>>(n)&(2**something-1)dari jawaban ini oleh xnor pada tantangan Pemutar Interval Musik . Kekacauan yang zip(*[divmod(et cetera, 2) for i in input()])mungkin bisa golf lebih baik, meskipun saya suka kemanfaatan yang diberikannya dari menggunakan dua tuple tdan 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]))))

Tidak Disatukan:

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

2

Ruby, 166 163 byte

->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}

Yuck ... transposeterlalu panjang.

Trik yang digunakan di sini:

  • sprintf('%02b',x)untuk mengkonversi "0", "1", "2", "3"menjadi "00", "01", "10", dan "11"masing-masing. Anehnya, argumen kedua tidak tidak harus dikonversi menjadi integer pertama.

  • Rotasi dilakukan melalui a[1].push a[0].pop;a[0].unshift a[1].shift;, yang saya pikir setidaknya sedikit pintar (jika tidak terlalu bertele-tele di Ruby). Simetrinya bagus secara estetika: P


Bolehkah saya menyarankan sedikit golf? ->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

Akhirnya ☕ membuat efeknya. Sedang mencari ini sepanjang pagi: .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 byte

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``

Saya memetakan setiap karakter ke setara biner dua digit

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

dan saya menganggap mereka sebagai satu di atas yang lain

3212021 becomes
1101010
1010001

Saya menyimpannya ke n

Untuk setiap karakter (0-3) dari n, saya memeriksa tetangganya, menambahkan bit urutan tertinggi dari tetangga kiri ke bit urutan terendah dari tetangga kanan. jika saya == 0 (karakter pertama) saya menggunakan bit urutan yang lebih rendah itu sendiri daripada bit urutan yang lebih tinggi tetangga sebelah kiri.

jika n [i + 1]> - 1 itu berarti kita mendapat 0,1,2,3 jadi ketika itu salah kita menekan elemen terakhir.

Ketika itu terjadi, saya menggunakan bit urutan tertinggi karakter itu sendiri, bukan bit tetangga kanan yang lebih rendah

memetakan itu kembali ke .':tanah dan bergabung dengan array itu kembali bersama


2

MATL , 40 39 byte

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

Cobalah online! Versi tertaut telah vdiganti oleh &v, karena perubahan bahasa setelah jawaban ini diposting .

' ''.:'               % 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

1

JavaScript, 311 byte

Mungkin bisa ditingkatkan banyak:

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]=="'"?".":" ")

Mungkin mengatur sesuatu s[i-1]? Itu bisa menghemat beberapa byte.
Rɪᴋᴇʀ

Sama dengan s[i+1].
Rɪᴋᴇʀ

1
Coba gunakan fungsi panah ES6 dan pencarian, juga menggunakan <alih-alih ==dapat menghemat beberapa byte. Anda mungkin juga ingin checkout Tips untuk Golf di JS dan Tips untuk golf di ES6
Downgoat

1
@Downgoat Bagaimana Anda bisa menggunakannya <sebagai ganti==
Jens Renders

1

JavaScript (ES6), 237 210 204 188 182 178 bytes

Kredit ke @Downgoat untuk menghemat 16 byte dalam revisi 188-byte

Pembaruan: Saya memiliki gelombang otak dan mengurangi operasi pertama smenjadi satu mappanggilan, bukan dua yang terpisah

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``)

Cukup Cetak & Penjelasan

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``
)

1
tidak: 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``)bekerja?
Downgoat

Maaf karena tidak membalas ini sebelumnya, tidak melihat pemberitahuan - alat pengembang saya memberi saya pengecualian "karakter ilegal"
RevanProdigalKnight

Dapat berfungsi seperti yang Anda katakan - tampaknya ketika saya menyalinnya ada beberapa karakter tambahan yang tidak terlihat di dalamnya yang tidak muncul di alat pengembang browser.
RevanProdigalKnight

1

Perl, 144 142 137 131 byte

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

Byte ditambahkan untuk -nbendera.

Algoritma yang hampir sama dengan jawaban Ruby saya , hanya lebih pendek, karena ... 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

Obnoxiously, @a=(shift@b,@a)lebih pendek dari unshift@a,shift@b.

Sayangnya, ini panjangnya sama:

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

Terima kasih kepada Ton Hospel untuk 5 byte dan msh210 untuk satu byte!


Bisakah Anda menggunakan ..@abukan ..$#a? (Mungkin octmati atau mengembalikan 0 atau sesuatu. Saya belum mencobanya.)
msh210

Tidak perlu mengubah spasi menjadi 0. Ini akan mengevaluasi sebagai 0 untuk sprintf anyways. Juga singkirkan tanda kurung di regex. Jika tidak ada tangkapan, seluruh pertandingan dikembalikan untuk//g
Ton Hospel

@ msh210 Itu memang berhasil; Terima kasih!
Gagang Pintu

@TonHospel Terima kasih, memasukkannya ke dalam jawaban (meskipun jelas milikmu masih sepenuhnya menghancurkan milikku dari air).
Gagang Pintu

Itu sprintfsangat panjang. map$_%2,/./gdan map$_/2|0,//ghampir harus lebih pendek (belum teruji)
Ton Hospel

0

Python 3, 294 287 283 byte

Waaayyyyyy terlalu lama, tapi saya akan mencoba bermain golf beberapa byte:

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)

0

Lua, 139 byte

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

Pemakaian:

$ lua conveyor.lua ".'  '.::  :.'. . ::.'  '. . .::'  :.'."
' ' .:.''..'.'. ..:' ' .'. ...'''..'.'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.