Xoay các dấu chấm


46

Giới thiệu

Một ma trận Boolean 2 × n có thể được biểu diễn dưới dạng một chuỗi gồm bốn ký tự . ':. Chuỗi có "hàng trên" và "hàng dưới", với các dấu chấm đại diện cho 1 và khoảng trống đại diện cho 0. Ví dụ: ma trận 2 × 6

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

có thể được đại diện như ' '. :. Nhiệm vụ của bạn là lấy một ma trận ở "dạng nén" này và xoay các mục của nó một bước theo chiều kim đồng hồ, giống như một băng chuyền.

Đầu vào

Đầu vào của bạn là một chuỗi trên các ký tự . ':. Chiều dài của nó được đảm bảo ít nhất là 2.

Đầu ra

Đầu ra của bạn sẽ là chuỗi đầu vào, nhưng với mỗi dấu chấm được xoay một bước theo chiều kim đồng hồ. Rõ ràng hơn, các dấu chấm ở hàng trên có thêm một vị trí bên phải, ngoại trừ vị trí ngoài cùng bên phải, di chuyển xuống. Các chấm ở hàng dưới di chuyển một bước sang trái, ngoại trừ điểm ngoài cùng bên trái, di chuyển lên. Cụ thể, chuỗi đầu ra phải có cùng độ dài với bản gốc và khoảng trắng là đáng kể.

Thí dụ

Hãy xem xét chuỗi đầu vào :..:'., tương ứng với ma trận 2 × 6

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

Phiên bản xoay của ma trận này là

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

tương ứng với chuỗi ::. :'.

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép. Bạn có thể quyết định liệu đầu vào và đầu ra có được đặt trong dấu ngoặc kép hay không, và một dòng mới có thể được chấp nhận trong cả hai.

Các trường hợp thử nghiệm

Những trường hợp thử nghiệm được đính kèm trong dấu ngoặc kép.

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

Câu trả lời:


11

JavaScript (ES6), 100 97 93 byte

Đã lưu 4 byte nhờ @ edc65

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

Làm thế nào nó hoạt động

Điều này quyết định nhân vật chúng ta cần chèn bằng cách thực hiện một số tính toán trên ký tự trước và sau ký tự hiện tại. Chúng tôi tổng hợp:

  • Nếu đó là char đầu tiên và nó có một dấu chấm ở phía dưới, 2;
  • Mặt khác, nếu cái trước nó có một dấu chấm trên đầu, 2.
  • Nếu đó là char cuối cùng và nó có một dấu chấm trên đầu, 1;
  • Mặt khác, nếu cái sau nó có một dấu chấm ở phía dưới, 1.

Điều này tổng hợp độc đáo đến 0 cho một không gian, 1 cho ', 2 cho .và 3 cho :.

Kiểm tra đoạn


Làm tốt. Lưu 4: s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])(lật 2 phần để tôi có thể tăng i, ít regrec và kiểm tra đơn giản hơn, lưu trước c trong q)
edc65

@ edc65 Cảm ơn vì tiền boa!
Sản xuất ETH

9

Perl, 70 69 64 63 61 60 byte

Bao gồm +2 cho -lp

Chạy với chuỗi đầu vào trên STDIN, vd

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

rotatedots.pl:

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

Giải trình

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)

Không gian không được chuyển đổi trong mã trên. Đối với các tính toán /2*2nó sẽ hành xử như thế nào và trở thành 0. Ở các vị trí khác, nó sẽ là một phần của "hoặc", nhưng 1 bit không gian là tập con của một bit 0và sẽ có tác dụng tương tự như 0nếu hoặc ed với bất kỳ chữ số nào. Chỉ khi nhân vật mà nó là hoặc phù hợp với một không gian thì nó sẽ vẫn là một không gian thay vì trở thành một 0. Nhưng điều đó ổn thôi vì 0dù sao cũng đã được chuyển đổi trở lại không gian.


8

Võng mạc , 66

  • 2 byte được lưu nhờ @daavko
  • 4 byte được lưu nhờ @randomra
:
1e
\.
1f
'
0e

0f
T`h`Rh` ^. |. $
(.)(\Cười mở miệng)
$ 2 $ 1
e1
:
e0
'
f0

F1
.

Giải trình

Bắt đầu với đầu vào:

: ''. :

4 giai đoạn đầu tiên xây dựng ma trận, lần lượt sử dụng 1/ efor true và 0/ ffor false cho các hàng trên cùng / dưới cùng. Các hàng trên cùng và dưới cùng được đặt xen kẽ với nhau. Điều này sẽ mang lại một chuỗi như:

e1f0e0e0f1f0e1

Tuy nhiên, 4 giai đoạn này cũng có hiệu quả di chuyển hàng dưới 1 sang trái, chỉ đơn giản bằng cách đảo ngược thứ tự của các chữ cái và chữ số:

1e0f0e0e1f0f1e

Các Tchữ số đảo ngược giai đoạn ransliteration hex cho chữ cái đầu tiên và cuối cùng mà thôi, tức là thay thế 0-9a-fvới f-a9-0. Điều này có tác dụng di chuyển nhân vật dưới cùng bên trái lên hàng trên cùng và nhân vật trên cùng bên phải xuống hàng dưới cùng:

ee0f0e0e1f0f11

Giai đoạn tiếp theo sau đó hoán đổi mọi cặp chữ số, từ đó di chuyển hàng trên 1 sang bên phải. Trước đây điều này là (\D)(\d), nhưng hóa ra (.)(\d)là đủ vì sự thay thế luôn xảy ra từ trái sang phải và do đó hai chữ số cuối cùng sẽ không bị khớp nhầm bởi điều này, bởi vì ký tự áp chót sẽ được thay thế. Ma trận hiện đã được xoay hoàn toàn theo yêu cầu:

e0e0f0e1e0f1f1

4 giai đoạn cuối cùng sau đó dịch trở lại định dạng ban đầu:

'' :'..

Hãy thử trực tuyến.

Tất cả các testcase, mỗi dòng trên một dòng , mđược thêm vào Tdòng để cho phép xử lý riêng từng dòng đầu vào.


7

Thạch, 32 30 29 byte

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

Lưu ý không gian dấu. Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Lý lịch

Chúng tôi bắt đầu bằng cách xem xét chuỗi đầu vào (ví dụ :..:'.:) và đảo ngược của nó.

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

Đối với mỗi ký tự ở hàng trên cùng, chúng tôi kiểm tra xem nó có thuộc về không ':và cho mỗi ký tự của hàng dưới cùng nếu nó thuộc về .:. Điều này mang lại cho mảng Booleans 2D

100110
101111

đó là ma trận từ câu hỏi, với hàng dưới cùng đảo ngược.

Chúng tôi xóa Boolean cuối cùng của mỗi hàng, đảo ngược thứ tự của các hàng, thêm vào Booleans theo thứ tự ban đầu và cuối cùng đảo ngược hàng trên cùng.

100110    10011    10111    010111    111010
101111    10111    10011    110011    110011

Điều này mang lại ma trận xoay từ câu hỏi.

Cuối cùng, chúng tôi coi mỗi cột của Booleans là một số nhị phân và chỉ mục '.:để có được các ký tự phù hợp.

332031    ::. :'

Làm thế nào nó hoạt động

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

Bình thường 38 36

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

2 byte nhờ Jakube!

Dùng thử tại đây hoặc chạy Test Suite .

Giải trình:

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

Có vẻ như tôi đã làm nó quá phức tạp ^^ Bạn có phiền khi thêm một lời giải thích không?
Denker

1
@DenkerAffe đã ở giữa thêm một :) Đã thêm!
FryAmTheEggman

Đã làm cách tiếp cận như bạn. Hai điều tôi nhận thấy: lambda L,hb_ebnày ngắn hơn một byte và .DR2Tcũng tạo ra sản phẩm Cartesian và một vài cặp khác, nhưng không và trong một chữ số và giúp tiết kiệm một không gian.
Jakube

@Jakube cảm ơn, .Dmẹo đó thực sự rất tuyệt!
FryAmTheEggman 11/03/2016

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

Giải trình

Giải pháp chơi gôn sử dụng thuộc tính sau của zip: zip('ABCD', 'xy') --> Ax By vì vậy zip(a[:l],a[l:])có thể được thay thế bằng zip(a,a[l:])và cho phép loại bỏ định nghĩa về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 

Các kết quả

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

Bạn có thể lưu một vài byte bằng cách đặt ba dòng cuối cùng trên một dòng, cách nhau bằng dấu chấm phẩy.
mbomb007

4

Bình thường, 66 byte

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

Hãy thử nó ở đây!

Giải trình

Điều này có thể được chia thành 3 phần:

  • Chuyển đổi đầu vào thành một mảng phẳng của những cái và số không.
  • Làm vòng quay.
  • Chuyển đổi nó trở lại thành ASCII.

Chuyển đổi đầu vào

Điều này là khá tầm thường. Mỗi nhân vật được ánh xạ theo cách sau:

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

Đầu tiên là một khoảng trắng.
Chúng tôi nhận được một danh sách gồm 2 bộ dữ liệu mà chúng tôi chuyển đổi để có được 2 hàng của ma trận mà sau đó được làm phẳng.

KlQJ.nCm @ [, 1Z, Z1, ZZ, 1 1)% Cd5Q # Q = đầu vào

KlQ # lưu chiều rộng của ma trận trong K (sẽ được sử dụng sau)
       m Q # ánh xạ mỗi ký tự d
                        % Cd5 # ASCII-mã của d modulo 5
        @ [, 1Z, Z1, ZZ, 1 1) # sử dụng điều này làm chỉ mục vào danh sách tra cứu
   J.nC # hoán vị, làm phẳng và gán cho J

Quay

Chúng ta có ma trận là mảng phẳng trong Jvà chiều rộng của ma trận trong K. Xoay có thể được mô tả là:

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

s [: JKhKJhK: JtKK) # J = mảng phẳng, K = chiều rộng của ma trận

s [) # concat tất cả các kết quả trong danh sách này
  : JKhK # J [K]
       JhK # J [K + 1:]
               : JtKK # J [K-1]

Chuyển đổi lại

jkm @ ". ':" id2Cc [) K # [) = danh sách kết quả của bước trên

              c [) K # chặt thành 2 hàng
             C # hoán vị để lấy lại 2-tuples
  m # ánh xạ mỗi 2-tup
          id2 # diễn giải d là nhị phân và chuyển thành thập phân
   @ ". ':" # sử dụng chỉ mục đó thành một chuỗi tra cứu để có được char chính xác
jk # tham gia vào một chuỗi


3

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

Chỉnh sửa: Tôi đã mượn cách sử dụng ziptừ câu trả lời Python của Erwan ở cuối hàm. và ý tưởng của họ để sử dụng [::-1]đảo ngược, mặc dù tôi đặt trong vòng xoắn của riêng tôi. Hóa ra, đảo ngược không phải là một ý tưởng tốt cho chức năng của tôi. Tôi đã thay đổi việc sử dụng formatđể chơi gôn. Di chuyển abtrực tiếp vào zipđể chơi gôn tiếp theo (không đánh bóng vẫn không thay đổi vì sự tách biệt abcó ích để tránh sự lộn xộn trong lời giải thích của tôi)

Chỉnh sửa: Mượn (some number)>>(n)&(2**something-1)từ câu trả lời này của xnor trong thử thách Trình giải quyết khoảng thời gian âm nhạc . Sự lộn xộn zip(*[divmod(et cetera, 2) for i in input()])có lẽ có thể được đánh golf tốt hơn, mặc dù tôi thích sự nhanh nhẹn mà nó cấp từ việc sử dụng hai bộ dữ liệu tv.

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

Ung dung:

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}

Ái chà ... transposequá dài.

Thủ thuật được sử dụng ở đây:

  • sprintf('%02b',x)để chuyển đổi "0", "1", "2", "3"vào "00", "01", "10", và "11"tương ứng. Đáng ngạc nhiên, đối số thứ hai không phải chuyển đổi thành số nguyên đầu tiên.

  • Việc xoay vòng được thực hiện thông qua a[1].push a[0].pop;a[0].unshift a[1].shift;, điều mà tôi nghĩ là ít nhất là thông minh một chút (nếu không quá dài dòng trong Ruby). Đối xứng là đẹp về mặt thẩm mỹ, dù sao: P


Tôi có thể đề nghị để chơi golf một chút không? ->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 11/03/2016

Cuối cùng, đã tạo ra hiệu ứng của nó. Đã tìm kiếm điều này cả buổi sáng: .map{|x|x.join.to_i 2}.join.tr'0-3',f.map{|x|f[x.join.to_i 2]}*''
manatwork 11/03/2016

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

Tôi ánh xạ mỗi ký tự thành một số nhị phân hai chữ số

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

và tôi nghĩ họ là một trong những người khác

3212021 becomes
1101010
1010001

Tôi lưu nó vào n

Đối với mỗi ký tự (0-3) của n, tôi kiểm tra hàng xóm của nó, thêm bit thứ tự cao nhất của hàng xóm bên trái vào bit thứ tự thấp nhất của hàng xóm bên phải. if i == 0 (ký tự đầu tiên) Tôi sử dụng bit thứ tự thấp hơn của riêng nó thay vì bit thứ tự cao hơn của hàng xóm bên trái.

if n [i + 1]> - 1 có nghĩa là chúng ta có 0,1,2,3 vì vậy khi đó là sai, chúng ta nhấn phần tử cuối cùng.

Khi điều đó xảy ra, tôi sử dụng bit thứ tự cao nhất của nhân vật thay vì bit thấp hơn của hàng xóm bên phải

ánh xạ trở lại .':đất liền và nối mảng đó lại với nhau


2

MATL , 40 39 byte

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

Hãy thử trực tuyến! Phiên bản được liên kết đã được vlặp lại bởi &v, vì những thay đổi trong ngôn ngữ sau khi câu trả lời này được đăng .

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

Có thể được cải thiện rất nhiều:

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

Có lẽ đặt một cái gì đó để s[i-1]? Điều đó có thể tiết kiệm một số byte.
R

Tương tự với s[i+1].
R

1
Hãy thử sử dụng các hàm mũi tên ES6 và tra cứu, cũng sử dụng <thay vì ==có thể giúp bạn tiết kiệm được một vài byte. Bạn cũng có thể muốn kiểm tra Mẹo chơi gôn trong JSMẹo chơi gôn trong ES6
Downgoat 10/03/2016

1
@Downgoat Làm thế nào bạn có thể sử dụng <thay vì==
Jens

1

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

Tín dụng cho @Downgoat để lưu 16 byte trong phiên bản 188 byte

Cập nhật: Tôi đã tẩy não và giảm thao tác đầu tiên sthành một mapcuộc gọi thay vì hai cuộc gọi riêng biệt

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

In đẹp & Giải thích

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
không: 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``)làm việc?
Hạ cấp

Xin lỗi vì đã không trả lời sớm hơn, đã không thấy thông báo - các công cụ dành cho nhà phát triển của tôi đang cho tôi một ngoại lệ "nhân vật bất hợp pháp"
RevanProdigalKnight 11/03/2016

Làm cho nó hoạt động như bạn đặt nó - rõ ràng khi tôi sao chép nó, có một số ký tự vô hình bổ sung trong đó không xuất hiện trong các công cụ phát triển trình duyệt.
RevanProdigalKnight 11/03/2016

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 thêm cho -ncờ.

Khá nhiều thuật toán giống như câu trả lời Ruby của tôi , chỉ ngắn hơn, bởi vì ... 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

Đáng ghét, @a=(shift@b,@a)là ngắn hơn unshift@a,shift@b.

Than ôi, đây là cùng một chiều dài:

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

Cảm ơn TonMedel cho 5 byte và msh210 cho một byte!


Bạn có thể sử dụng ..@athay vì ..$#a? (Có lẽ octchết hoặc trả về 0 hoặc một cái gì đó. Tôi chưa thử.)
msh210

Không cần phải chuyển đổi không gian thành 0. Nó sẽ đánh giá là 0 cho mọi cách chạy nước rút. Cũng thoát khỏi dấu ngoặc trong regex. Nếu không có sự bắt giữ, toàn bộ trận đấu sẽ được trả lại cho//g
TonMedel 11/03/2016

@ msh210 Điều đó thực sự hoạt động; cảm ơn!
Doorknob

@TonH rửa Cảm ơn, kết hợp những câu đó vào câu trả lời (mặc dù rõ ràng là bạn vẫn hoàn toàn thổi tôi ra khỏi nước).
Doorknob

Điều đó sprintfthật dài. map$_%2,/./gmap$_/2|0,//ggần như có được ngắn hơn (chưa được kiểm tra)
Tôn Hospel

0

Python 3, 294 287 283 byte

Waaayyyyyy quá lâu, nhưng tôi sẽ thử chơi một số 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=":"})))

Sử dụng:

$ lua conveyor.lua ".'  '.::  :.'. . ::.'  '. . .::'  :.'."
' ' .:.''..'.'. ..:' ' .'. ...'''..'.'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.