ทอยลูกเต๋า


16

ทอยลูกเต๋า

ดังนั้นฉันจึงทอยลูกเต๋าเมื่อไม่นานมานี้และคิดถึงความท้าทาย

รับลูกบาศก์ด้วยตาข่ายที่นำมาจากอินพุทและรายการการเคลื่อนไหวหาสี่เหลี่ยมที่ด้านล่างสุด

แผนที่ลูกบาศก์

ฉันจะใช้ภาพนี้สำหรับตัวอย่างที่นี่

อินพุต

คุณใช้สายอักขระพร้อมรายการการเคลื่อนไหว สตริงมีเฉพาะตัวอักษร ASCII ตัวใหญ่ N, S, W และ E สิ่งเหล่านี้สอดคล้องกับการหมุนคิวบ์หนึ่งขั้นในทิศทางนั้น

ในภาพหนึ่งตัว N จะทำให้ใบหน้าด้านล่างเป็น 6 ในภาพนี้ทิศเหนืออยู่ห่างจากกล้องทิศใต้อยู่ทางทิศตะวันออกและทิศตะวันตกอยู่ทางซ้าย

คุณยังใช้สตริงในรูปแบบต่อไปนี้: 1P 2P 3P 4P 5P 6P โดยที่แต่ละ P คือตำแหน่งจาก N, S, W, E, T และ B T & B อยู่ด้านล่างและด้านบน

ตัวเลขคือใบหน้าที่มีหมายเลขนั้นและตัวอักษรแสดงถึงตำแหน่งที่ใบหน้าอยู่ในกรณีที่ไม่ชัดเจนสุทธิจะถูกเรียงตามจำนวนเสมอดังนั้น 1P 2P 3P 4P 5P 6P ไม่เคย 2B 1T 3N 4S 5W 6E

ตำแหน่งในภาพคือ 1S 2B 3E 4W 5T 6N

เอาท์พุต

โปรแกรมของคุณควรแสดงหมายเลขที่ด้านล่าง

กรณีทดสอบ

(nothing), 1S 2B 3E 4W 5T 6N -> 2
N, 1S 2B 3E 4W 5T 6N -> 6
NS, 1S 2B 3E 4W 5T 6N -> 2
NWS, 1S 2B 3E 4W 5T 6N -> 2
NWSNWS, 1S 2B 3E 4W 5T 6N -> 2
NWSS, 1S 2B 3E 4W 5T 6N -> 3
NNNNNN, 1S 2B 3E 4W 5T 6N -> 5
SNWEEWS, 1N 2T 3E 4W 5B 6S, 6
SNEEWS, 1N 2T 3W 4S 5B 6E, 4

กฎอื่น ๆ

คุณอาจสมมติว่าลูกบาศก์อยู่บนระนาบแบนอนันต์อาจมีแรงเสียดทานบางอย่าง

ช่องโหว่มาตรฐานไม่อนุญาตแม้ว่าฉันจะไม่พบก็ตาม

สำหรับการป้อนข้อมูลที่ไม่ถูกต้องรหัสของคุณอาจทำอะไรก็ได้ยกเว้นเริ่มต้นการเปิดเผย

เนื่องจากโปรแกรมนี้ควรพอดีกับลูกเต๋าของฉันจึงควรมีขนาดเล็กที่สุด ฉันนับไบต์มีข้อยกเว้นบางภาษาเช่นโฟลเดอร์


2
กรณีทดสอบครั้งแรกที่มีความ(nothing) -> 2หมายว่าไม่มีเครือข่ายหรือไม่
Sp3000

2
" ในภาพหนึ่ง N จะทำให้ใบหน้าด้านล่าง 2 " ไม่ได้เป็นใบหน้าด้านล่างแล้ว 2?
paulvs

@ Sp3000, แก้ไข, ควรจะให้เน็ต แต่โค้ดของคุณควรจะสามารถจัดการกับคำสั่งการเคลื่อนไหวใด ๆ ไม่ได้
Rɪᴋᴇʀ

1
คุณวัดขนาดของลูกเต๋าเป็นไบต์?
Cyoce

@Cyoce ไม่เพียงข้อความในแต่ละหน้า ดังนั้นใบหน้าที่มี🍄บนนั้นจะเท่ากับ 4 ไบต์ สำหรับความท้าทายนี้ฉันต้องการให้พอดีกับรหัสที่คุณเขียนบนลูกเต๋าของฉัน ในการทำเช่นนั้นฉันต้องการรหัสขนาดเล็ก
Rɪᴋᴇʀ

คำตอบ:


8

CJam, 43 40 37 34 bytes

ขอบคุณเดนนิสที่ช่วยฉันประหยัด 6 ไบต์

lW%3/$1f=q{i8%"ÉĔɠƂ!"=i\m!=}/c

ทดสอบที่นี่

คำอธิบาย

lW%    e# Read the first line and reverse it.
S/     e# Split it around spaces.
$      e# Sort it. This puts the faces in order [B E N S T W].
1f=    e# Select the second character from each face, which is the number.
q      e# Read the remainder of the input (the instructions).
{      e# For each instruction...
  i8%  e#   Convert the character (NWSE) to an integer and take modulo 8.
  "ÉĔɠƂ!"=i
       e#   Use that to (cyclically) index this string and convert *that* character
       e#   to an integer.
  \    e#   Swap with the list of faces.
  m!   e#   Generate all permutations of the faces.
  =    e#   Select the permutation corresponding to the above integer.
}/     e# At the end of the loop, the bottom face will be the first character.
c      e# Convert the string to a character, which discards everything but the bottom face.

สำหรับวิธีการแม็พอักขระการสอนกับการเรียงสับเปลี่ยนนี่เป็นตารางที่มีประโยชน์:

   i   8%  5%  ""=   i   [0 1 2 3 4 5]m!=

N  78   6   1   Ĕ   276  [2 1 4 0 3 5]
W  87   7   2   ɠ   608  [5 0 2 3 1 4]
S  83   3   3   Ƃ   386  [3 1 0 4 2 5]
E  69   5   0   É   201  [1 4 2 3 5 0]

ฉันได้รวม5%คอลัมน์ไว้เพราะนั่นคือสิ่งที่การทำดัชนีแบบวนซ้ำในสตริงนั้นโดยปริยาย สำหรับการเรียงสับเปลี่ยนสี่ครั้งเราจะเห็นว่าแต่ละอันแยกจากกันสองฝั่ง (ตรงกันข้าม) และไม่มีการแตะต้องและอนุญาตอีกสี่รอบ


คุณจะแสดงถึงการเรียงสับเปลี่ยนเป็นอักขระ Unicode เหล่านั้นได้อย่างไร Ĕแสดงถึงการเปลี่ยนแปลงของ N [2 1 4 0 3 5] อย่างไร? ฉันจ้องมองมาหลายชั่วโมงแล้ว
paulvs

1
@paulvs รหัสตัวละครที่มีĔ ให้รายการของการเปลี่ยนลำดับทั้งหมด 720 รายการ และเกิดขึ้นเป็นดัชนีของในรายการนั้น 2766e![0 1 2 3 4 5]276[2 1 4 0 3 5]
Martin Ender

ฉันหวังว่าจะมีคนตอบมากกว่านี้ แต่คุณก็สั้นที่สุด ยินดีด้วย.
Rɪᴋᴇʀ

5

Perl, 166 158 154 144 139 135 134 132 116 ไบต์

รวม +1 สำหรับ -p

s/(\d)(.)/$h{$2}=$1/eg;$N='NTSB',$S='STNB',$E='ETWB',$W='WTEB';map{@h{@l}=@h{(@l=$$_=~/./g)[1..3,0]}}/\w/g;$_=$h{B}

ด้วยความคิดเห็น:

                                    # example input: "NS, 1S 2B 3E 4W 5T 6N"
s/(\d)(.)/$h{$2}=$1/eg;             # construct %h ( S=>1, B=>2, E=>3, W=>4, B=>2, N=>6 )

                                    # = Transformations =
$N='NTSB',                          # N becomes T, T becomes S, S becomes B, B becomes N
$S='STNB',
$E='ETWB',
$W='WTEB';

map {                               # iterate the moves "NS"
    @h{ @l } =                      # LHS: bulk-assign new values; @l defined in RHS
      @h{                           # RHS: init @l, transform
          (@l=$$_=~/./g)            # get transform, put ('N','T','S','B') in @l for LHS
          [1..3,0]                  # construct a rotated slice for RHS
    }    
} /\w/g;                            # match the movements in list context

$_=$h{B}                            # assign the bottom face to output.


ไฟล์อินพุต:

, 1S 2B 3E 4W 5T 6N
N, 1S 2B 3E 4W 5T 6N
NS, 1S 2B 3E 4W 5T 6N
NWS, 1S 2B 3E 4W 5T 6N
NWSNWS, 1S 2B 3E 4W 5T 6N
NWSS, 1S 2B 3E 4W 5T 6N
NNNNNN, 1S 2B 3E 4W 5T 6N
SNWEEWS, 1N 2T 3E 4W 5B 6S
SNEEWS, 1N 2T 3W 4S 5B 6E

ทำงานด้วย

perl -p dice.pl < input.txt

เอาท์พุท: 262223564


  • อัปเดต 158การใช้$N, $S, $E, $Wตัวแปรโกลบอลแทนการ%t = {N=>, S=>, E=>, $W=>}บันทึก 8 ไบต์

  • ปรับปรุง 154เนื่องจากความต้องการคือการที่การส่งออกโปรแกรมจำนวนไม่พิมพ์ขึ้นบรรทัดใหม่print "$h{B}\n"ช่วยประหยัด 4 print $h{B}ไบต์:

  • อัปเดต 144บันทึก 10 ไบต์ด้วยการทำ

    ($s)=/^(\w+),/;            s/(\d)(.)/$h{$2}=$1/eg;
    

    แทน

    ($s,@i)=split /,? |\n/;    %h=reverse map{split//}@i;
    
  • อัปเดต 139ย้าย regex สำหรับคำสั่งไปยังจุดสิ้นสุดเพื่อกำจัดตัวแปรประหยัด 6 ไบต์

  • อัปเดต 135บันทึก 4 ไบต์ในการแทน@l[0..3,0]@l[1..3],$l[0]

  • อัปเดต 134บันทึก 1 ไบต์โดยใช้การมอบหมาย@l=split//,$$_เป็นค่า

  • อัปเดต 132บันทึก 2 ไบต์โดยทำแทน/^\w+/ && $&/^(\w+)/ && $1

  • อัปเดต 129บันทึก 3 ไบต์โดยใช้-pแทน-nและกำหนด $ _ สำหรับการพิมพ์

  • อัปเดต 116บันทึก 13 ไบต์โดยการเขียนใหม่เข้าไปsplit//, /^\w+/ && $&/^\w+/g



4

Python 2, 204 ไบต์

คิดว่าเป็นเวลาที่จะตอบคำถามของฉันเอง

def x(p,m):
    d={p[3*i-2]:i for i in range(1,7)}
    for j in m:n=2if j in'NE'else-2;x='BSTN'if j in'NS'else'BETW';d[x[0]],d[x[1]],d[x[2]],d[x[3]]=d[x[1+n]],d[x[(2+n)%4]],d[x[(3+n)%4]],d[x[0+n]]
    print d['B']

ไม่สั้นมาก แต่ใช้งานได้

ทำงานเป็น:

x('1B 2T 3N 4S 5W 6E','SNEEWS')
#Output: 4

แก้ไข : นับไบต์ผิด ตอนนี้อีกต่อไป :(


BTW ขอบคุณ xnor สำหรับแมโคร python
Rɪᴋᴇʀ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.