หมุนจุด


46

แนะนำ

2 × n . ':เมทริกซ์บูลีนสามารถแสดงเป็นสตริงของสี่ตัวอักษร สตริงมี "แถวบน" และ "แถวล่าง" ที่มีจุดแทน 1s และช่องว่างว่างแทน 0s ตัวอย่างเช่นเมทริกซ์ 2x6

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

' '. :สามารถแสดงเป็น งานของคุณคือทำเมทริกซ์ใน "ฟอร์มที่บีบอัด" นี้และหมุนรายการตามเข็มนาฬิกาหนึ่งขั้นตอนเช่นสายพานลำเลียง

อินพุต

การป้อนข้อมูลของคุณเป็นสตริงตัว. ':เดียว ความยาวของมันรับประกันอย่างน้อย 2

เอาท์พุต

เอาต์พุตของคุณจะเป็นสตริงอินพุต แต่ทุกจุดหมุนหนึ่งขั้นในทิศทางตามเข็มนาฬิกา ยิ่งไปกว่านั้นจุดบนแถวบนสุดจะอยู่ทางขวาหนึ่งจุดยกเว้นจุดขวาสุดซึ่งเลื่อนลง จุดบนแถวล่างเลื่อนไปหนึ่งก้าวทางซ้ายยกเว้นจุดซ้ายสุดซึ่งเลื่อนขึ้น โดยเฉพาะอย่างยิ่งสตริงเอาต์พุตต้องมีความยาวเท่ากันกับต้นฉบับและช่องว่างมีความสำคัญ

ตัวอย่าง

พิจารณาสตริงป้อนเข้า:..:'.ซึ่งสอดคล้องกับเมทริกซ์ 2 × 6

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

เมทริกซ์เวอร์ชันที่หมุนแล้วนี้คือ

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

::. :'ซึ่งสอดคล้องกับสตริง

กฎและการให้คะแนน

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต คุณสามารถตัดสินใจได้ว่าอินพุตและเอาต์พุตจะอยู่ในเครื่องหมายคำพูดหรือไม่และบรรทัดใหม่ต่อท้ายหนึ่งบรรทัดนั้นยังยอมรับได้ทั้งคู่

กรณีทดสอบ

กรณีทดสอบเหล่านี้อยู่ในเครื่องหมายคำพูดคู่

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

คำตอบ:


11

JavaScript (ES6), 100 97 93 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณ @ edc65

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

มันทำงานอย่างไร

สิ่งนี้จะตัดสินใจกับตัวละครที่เราต้องการแทรกโดยทำการคำนวณบางอย่างบนตัวอักษรก่อนและหลังตัวอักษรปัจจุบัน เราสรุป:

  • ถ้ามันเป็นถ่านตัวแรกและมันมีจุดที่ด้านล่าง 2;
  • มิฉะนั้นหากจุดก่อนหน้านั้นมีจุดอยู่ด้านบน 2
  • ถ้ามันเป็นถ่านตัวสุดท้ายและมันมีจุดอยู่ด้านบน 1;
  • มิฉะนั้นหากหนึ่งจุดหลังจากนั้นมีจุดที่ด้านล่าง 1

นี้สรุปอย่างเป็น 0 สำหรับพื้นที่ 1 ', 2 .และ :3

ตัวอย่างการทดสอบ


ทำได้ดี. บันทึก 4: s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])(พลิก 2 ส่วนเพื่อให้ฉันสามารถเพิ่ม i, ทดสอบ regexp น้อยลงและง่ายขึ้น, บันทึก prev c เป็น q)
edc65

@ edc65 ขอบคุณสำหรับเคล็ดลับ!
ETHproductions

9

Perl, 70 69 64 63 61 60 ไบต์

รวมถึง +2 สำหรับ -lp

เรียกใช้ด้วยสตริงอินพุตบน STDIN เช่น

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

rotatedots.pl:

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

คำอธิบาย

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)

ช่องว่าง ไม่ถูกแปลงในโค้ดด้านบน สำหรับการคำนวณ/2และมันจะทำตัวเหมือนและกลายเป็น*2 0ในตำแหน่งอื่น ๆ จะเป็นส่วนหนึ่งของ "หรือ" แต่พื้นที่ 1 บิตเป็นส่วนย่อยของหนึ่งบิตของ0และจะมีผลเช่นเดียวกับ0ถ้าหรือ -ed กับตัวเลขใด ๆ 0เฉพาะในกรณีที่ตัวละครตัวนี้มันเป็นหรือเอ็ดกับพื้นที่มันจะยังคงอยู่ในพื้นที่แทนของการเป็น แต่ก็ไม่เป็นไรเพราะ0จะถูกแปลงกลับไปเป็นที่ว่างต่อไป


8

จอประสาทตา , 66

  • บันทึก 2 ไบต์ด้วย @daavko
  • บันทึก 4 ไบต์ด้วย @randomra
:
1e
\
1f
'
0E

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

f1
.

คำอธิบาย

เริ่มต้นด้วยอินพุต:

: ''. :

4 ขั้นตอนแรกสร้างเมทริกซ์โดยใช้1/ eสำหรับจริงและ0/ fสำหรับเท็จสำหรับแถวบน / ล่างตามลำดับ แถวด้านบนและด้านล่างจะถูกรวมเข้าด้วยกัน นี้จะให้สตริงเช่น:

e1f0e0e0f1f0e1

อย่างไรก็ตาม 4 ขั้นตอนเหล่านี้ยังย้ายแถวล่าง 1 ไปทางซ้ายอย่างมีประสิทธิภาพเพียงแค่กลับคำสั่งของตัวอักษรและตัวเลข:

1e0f0e0e1f0f1e

Tเวที ransliteration ฝืนตัวเลขฐานสิบหกสำหรับตัวอักษรตัวแรกและครั้งสุดท้ายเท่านั้นแทนที่เช่นกับ0-9a-f f-a9-0นี่คือผลของการย้ายตัวละครซ้าย - ขวาขึ้นไปที่แถวบนสุดและตัวอักษรขวาบนลงไปที่แถวด้านล่าง:

ee0f0e0e1f0f11

ขั้นตอนต่อไปจะสลับคู่ตัวอักษรทุกตัวดังนั้นจึงเลื่อนแถวบน 1 ไปทางขวา ก่อนหน้านี้สิ่งนี้เกิด(\D)(\d)ขึ้น แต่กลับกลาย(.)(\d)เป็นว่าเพียงพอเพราะการแทนที่เกิดขึ้นจากซ้ายไปขวาเสมอดังนั้นตัวเลขสองหลักสุดท้ายจะไม่ถูกจับคู่โดยที่ไม่ถูกต้องเพราะอักขระตัวสุดท้ายจะถูกแทนที่แล้ว เมทริกซ์ได้ถูกหมุนอย่างสมบูรณ์ตามต้องการ:

e0e0f0e1e0f1f1

4 ขั้นตอนสุดท้ายจากนั้นแปลกลับเป็นรูปแบบดั้งเดิม:

'' :'..

ลองออนไลน์

testcases ทั้งหมดต่อหนึ่งบรรทัด , mการเพิ่มในTสายที่จะช่วยให้การรักษาที่แยกจากกันของสายการป้อนข้อมูลแต่ละ


7

เยลลี่, 32 30 29 ไบต์

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

สังเกตพื้นที่ต่อท้าย ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

พื้นหลัง

เราเริ่มต้นด้วยการพิจารณาสตริงอินพุต (เช่น, :..:'.) และย้อนกลับ

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

สำหรับตัวละครในแถวบนแต่ละเราตรวจสอบว่ามันเป็นและสำหรับตัวละครของแต่ละแถวด้านล่างถ้ามันเป็น': .:สิ่งนี้ทำให้ Booleans มีสองมิติ

100110
101111

ซึ่งเป็นเมทริกซ์จากคำถามโดยมีแถวด้านล่างกลับด้าน

เราลบบูลีนสุดท้ายของแต่ละแถวกลับลำดับของแถวกลับลำดับบูลีนในลำดับเดิมและสุดท้ายกลับแถวด้านบน

100110    10011    10111    010111    111010
101111    10111    10011    110011    110011

นี่ทำให้เมทริกซ์ที่หมุนได้จากคำถาม

สุดท้ายเราจะพิจารณาตัวเลขและเลขฐานสองของ Booleans แต่ละคอลัมน์'.:เพื่อรับอักขระที่เหมาะสม

332031    ::. :'

มันทำงานอย่างไร

,Ṛ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 ไบต์ขอบคุณ Jakube!

ลองได้ที่นี่หรือเรียกใช้ชุดทดสอบ

คำอธิบาย:

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

ดูเหมือนว่าฉันจะซับซ้อนเกินไป ^^ คุณช่วยเพิ่มคำอธิบายได้ไหม?
Denker

1
@DenkerAffe อยู่ในระหว่างการเพิ่มหนึ่ง :) เพิ่ม!
FryAmTheEggman

ทำเช่นเดียวกันกับคุณ สองสิ่งที่ฉันสังเกตเห็น: แลมบ์ดาL,hb_ebนี้สั้นลงหนึ่งไบต์และ.DR2Tสร้างผลิตภัณฑ์คาร์ทีเซียนและอีกสองสามคู่ แต่ไม่รวมเป็นตัวเลขและช่วยประหยัดพื้นที่
Jakube

@Jakube ขอบคุณ.Dเคล็ดลับมันเจ๋งจริงๆ!
FryAmTheEggman

5

Python 3, 145 141 130 ไบต์

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

คำอธิบาย

โซลูชัน golfed ใช้คุณสมบัติของ zip ดังต่อไปนี้zip('ABCD', 'xy') --> Ax By ดังนั้นzip(a[:l],a[l:])สามารถถูกแทนที่ด้วยzip(a,a[l:])และอนุญาตให้ลบนิยามของ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 

ผล

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

คุณสามารถบันทึกไม่กี่ไบต์โดยใส่สามบรรทัดสุดท้ายในหนึ่งบรรทัดโดยคั่นด้วยเครื่องหมายอัฒภาค
mbomb007

4

Pyth, 66 ไบต์

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

ลองที่นี่!

คำอธิบาย

สิ่งนี้สามารถแบ่งออกเป็น 3 ส่วน:

  • แปลงอินพุตเป็นอาเรย์แบนของคนและศูนย์
  • ทำการหมุน
  • แปลงกลับเป็น ASCII

แปลงอินพุต

นี่เป็นเรื่องเล็กน้อย อักขระแต่ละตัวถูกแมปด้วยวิธีต่อไปนี้:

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

อันแรกคือช่องว่าง
เราได้รายชื่อของ 2-tuples ที่เราไขว้กันเพื่อให้ได้ 2 แถวของเมทริกซ์ซึ่งทำให้แบน

รหัส

KlQJ.nCm @ [, 1Z, Z1, ZZ, 1 1)% Cd5Q # Q = อินพุต

KlQ # บันทึกความกว้างของเมทริกซ์เป็น K (ใช้ในภายหลัง)
       m Q # แมปอักขระแต่ละตัว d
                        % Cd5 # ASCII รหัสของ d modulo 5
        @ [, 1Z, Z1, ZZ, 1 1) # ใช้สิ่งนี้เป็นดัชนีในรายการค้นหา
   J.nC # ทรานสแฟลนและกำหนดให้กับ J

หมุน

เรามีเมทริกซ์เป็นอาร์เรย์แบนในและความกว้างของเมทริกซ์ในJ Kการหมุนสามารถอธิบายได้เป็น:

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

รหัส

s [: JKhKJhK: JtKK) # J = อาเรย์แบน K = ความกว้างของเมทริกซ์

s [) # เชื่อมต่อผลลัพธ์ทั้งหมดในรายการนี้
  : JKhK # J [K]
       JhK # J [K + 1:]
               : JtKK # J [K-1]

แปลงกลับ

jkm @ ". ':" id2Cc [) K # [) = รายการผลลัพธ์ของขั้นตอนข้างต้น

              c [) K # สับเป็น 2 แถว
             C # transpose เพื่อรับ 2 tuples กลับ
  m # แผนที่แต่ละ 2-tuple d
          id2 # ตีความ d เป็นไบนารีและแปลงเป็นทศนิยม
   @ ". ':" # ใช้เป็นดัชนีในสตริงการค้นหาเพื่อรับถ่านที่ถูกต้อง
jk # เข้าร่วมเป็นหนึ่งสตริง


3

Python 3, 166 154 153 150 146 138 137 135 132 127 ไบต์

แก้ไข:ผมเคยยืมมาใช้zipจากErwan คำตอบของงูใหญ่ในตอนท้ายของการทำงาน และความคิดของพวกเขาที่จะใช้[::-1]การพลิกกลับแม้ว่าฉันจะบิดตัวเอง เมื่อกลับกลายเป็นว่าการกลับรายการไม่ใช่ความคิดที่ดีสำหรับฟังก์ชั่นของฉัน ฉันเปลี่ยนformatการเล่นกอล์ฟต่อไป ย้ายaและbเข้าสู่zipการเล่นกอล์ฟโดยตรงต่อไป (การที่ยังไม่ได้นั่งยังคงไม่เปลี่ยนแปลงเนื่องจากการแยกaและbมีประโยชน์ในการหลีกเลี่ยงความยุ่งเหยิงในคำอธิบายของฉัน)

แก้ไข:ยืม(some number)>>(n)&(2**something-1)จากคำตอบนี้โดย XNOR บนความท้าทายเพลงช่วง ความยุ่งเหยิงที่zip(*[divmod(et cetera, 2) for i in input()])สามารถอาจจะแข็งแรงเล่นกอล์ฟที่ดีกว่า แต่ผมทำเช่นเดียวกับความได้เปรียบมันทุนจากการใช้สอง tuples และ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]))))

Ungolfed:

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

ทับทิม, 166 163 ไบต์

->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 ... transposeยาวเกินไป

เทคนิคที่ใช้ที่นี่:

  • sprintf('%02b',x)การแปลง"0", "1", "2", "3"เข้า"00", "01", "10"และ"11"ตามลำดับ น่าแปลกที่อาร์กิวเมนต์ที่สองไม่จำเป็นต้องแปลงเป็นจำนวนเต็มก่อน

  • การหมุนทำได้ผ่านa[1].push a[0].pop;a[0].unshift a[1].shift;ซึ่งฉันคิดว่าอย่างน้อยฉลาด (ถ้าไม่ verbose มากเกินไปในทับทิม) ความสมมาตรนั้นดีมากแล้วล่ะ: P


ฉันขอแนะนำให้เล่นกอล์ฟสักเล็กน้อยได้ไหม? ->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]}*''
ทำงาน

2

Javascript ES6 125 ไบต์

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

ฉันแมปอักขระแต่ละตัวเป็นเลขฐานสองเทียบเท่า

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

และฉันคิดว่าพวกเขาเป็นหนึ่งในที่อื่น ๆ

3212021 becomes
1101010
1010001

ฉันบันทึกมันไว้ที่ n

สำหรับอักขระแต่ละตัว (0-3) ของ n ฉันจะตรวจสอบว่าเป็นเพื่อนบ้านเพิ่มบิตลำดับสูงสุดของเพื่อนบ้านซ้ายไปยังบิตลำดับต่ำสุดของเพื่อนบ้านขวา ถ้าฉัน == 0 (ตัวอักษรตัวแรก) ฉันใช้มันเป็นบิตลำดับที่ต่ำกว่าของตัวเองแทนบิตลำดับสูงกว่าของเพื่อนบ้านซ้าย

ถ้า n [i + 1]> - 1 หมายความว่าเราได้รับ 0,1,2,3 ดังนั้นเมื่อมันเป็นเท็จเราก็ตีองค์ประกอบสุดท้าย

เมื่อสิ่งนั้นเกิดขึ้นฉันใช้บิตลำดับสูงสุดของตัวละครแทนบิตล่างของเพื่อนบ้านที่ถูกต้อง

แผนที่ที่กลับไปยัง.':ดินแดนและเข้าร่วมอาร์เรย์นั้นกลับมารวมกัน


2

MATL , 40 39 ไบต์

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

ลองออนไลน์! รุ่นที่เชื่อมโยงได้vrepaced โดย&vเพราะการเปลี่ยนแปลงในภาษาหลังจากคำตอบนี้ถูกโพสต์

' ''.:'               % 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 ไบต์

สามารถปรับปรุงได้มาก:

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

อาจจะตั้งค่าบางสิ่งบางอย่างเพื่อs[i-1]? ที่สามารถบันทึกบางไบต์
Rɪᴋᴇʀ

s[i+1]เช่นเดียวกันกับ
Rɪᴋᴇʀ

1
ลองใช้ฟังก์ชั่นลูกศร ES6 และการค้นหาการใช้<แทน==อาจช่วยให้คุณประหยัดได้ไม่กี่ไบต์ คุณอาจต้องการเช็คเอาต์Tips สำหรับการเล่นกอล์ฟใน JSและTips สำหรับการเล่นกอล์ฟใน ES6
Downgoat

1
@Downgoat คุณสามารถใช้<แทนได้อย่างไร==
Jens Renders

1

JavaScript (ES6), 237 210 204 188 182 178 ไบต์

มอบเครดิตให้แก่@Downgoatสำหรับการบันทึก 16 ไบต์ในการแก้ไข 188- ไบต์

อัปเดต: ฉันมีคลื่นสมองและลดการทำงานครั้งแรกsเป็นการmapโทรครั้งเดียวแทนที่จะแยกสองสาย

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

พริตตี้พิมพ์ & คำอธิบาย

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
ไม่: 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``)ทำงานหรือไม่
Downgoat

ขออภัยที่ไม่ตอบกลับก่อนหน้านี้ไม่เห็นการแจ้งเตือน - เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ของฉันให้ข้อยกเว้น "ตัวละครที่ผิดกฎหมาย" แก่ฉัน
RevanProdigalKnight

ให้มันทำงานตามที่คุณวางไว้ - เห็นได้ชัดว่าเมื่อฉันคัดลอกมันมีอักขระที่มองไม่เห็นพิเศษอยู่ในนั้นซึ่งไม่ปรากฏในเครื่องมือสำหรับนักพัฒนาเบราว์เซอร์
RevanProdigalKnight

1

Perl, 144 142 137 131 ไบต์

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

ไบต์เพิ่มสำหรับ-nธง

อัลกอริทึมเดียวกันกับคำตอบ Ruby ของฉันค่อนข้างสั้นเพราะ ... 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

น่าสะพรึงกลัว, จะสั้นกว่า@a=(shift@b,@a)unshift@a,shift@b

อนิจจาเหล่านี้มีความยาวเท่ากัน:

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

ขอบคุณTon Hospel 5 ไบต์และmsh210ต่อไบต์!


คุณสามารถใช้..@aแทนได้..$#aหรือไม่? (อาจoctตายหรือส่งคืน 0 หรือบางสิ่งบางอย่างฉันไม่ได้ลอง)
msh210

ไม่จำเป็นต้องแปลงพื้นที่เป็น 0 มันจะประเมินเป็น 0 สำหรับ sprintf อย่างไรก็ตาม ยังกำจัดวงเล็บใน regex หากไม่มีการจับภาพการแข่งขันทั้งหมดจะถูกส่งคืนสำหรับ//g
Ton Hospel

@ msh210 ใช้งานได้จริง ขอบคุณ!
Doorknob

@TonHospel ขอบคุณรวมเข้าไว้ในคำตอบ (แม้ว่าจะเห็นได้ชัดว่าคุณยังคงระเบิดออกจากน้ำอย่างสมบูรณ์)
Doorknob

นั่นsprintfคือนานเกินไป map$_%2,/./gและmap$_/2|0,//gเกือบจะต้องสั้นลง (ยังไม่ทดลอง)
Ton Hospel

0

Python 3, 294 287 283 ไบต์

Waaayyyyyy ยาวเกินไป แต่ฉันจะพยายามตีกอล์ฟเป็นจำนวนไบต์:

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

ลัวะ 139 ไบต์

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

การใช้งาน:

$ lua conveyor.lua ".'  '.::  :.'. . ::.'  '. . .::'  :.'."
' ' .:.''..'.'. ..:' ' .'. ...'''..'.'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.