Thực hiện khối lập phương


10

Cubally là một ngôn ngữ bí truyền khá mới có khả năng tạo ra các câu trả lời ngắn, giống như golf cho một tập hợp vấn đề rất cụ thể. Điều độc đáo ở đây là nó lưu trữ bộ nhớ dưới dạng khối lập phương 3x3, làm cho các phép tính ít tầm thường hơn so với hầu hết các ngôn ngữ. Trong Lập thể, lập trình viên phải xoay khối bên trong để thao tác các giá trị được lưu trữ trên các mặt, sau đó sử dụng các giá trị đó trong tính toán của chúng. Các tính toán được thực hiện trên một số nguyên 32 bit được lưu trữ trên một mặt ảo được gọi là "notepad". Ngoài ra, Cubally có thể yêu cầu người dùng nhập và lưu trữ nó trong bộ đệm đầu vào chỉ bao gồm một giá trị số nguyên duy nhất.

Khối lập phương

Các mặt của khối lập phương là U p, D own, L eft, R ight, F ront và B ack:

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

Khi chương trình bắt đầu, khối được khởi tạo sao cho mỗi ô vuông trên mặt đó bằng với chỉ số dựa trên 0 của mặt đó:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Bất cứ khi nào một khuôn mặt được xoay, nó luôn luôn được xoay theo chiều kim đồng hồ:

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

Giá trị của một mặt được định nghĩa là tổng của mọi ô vuông trên mặt đó. Ví dụ, trong khối trên, giá trị của khuôn mặt 0là 3.

Cú pháp

Các lệnh được thực thi bằng cách trước tiên tải một lệnh vào bộ nhớ, sau đó truyền đối số cho nó để thực thi lệnh. Ví dụ, lệnh F1sẽ tải lệnh Fvào bộ nhớ, sau đó gọi nó với đối số 1. Ngoài ra, F13sẽ tải lệnh Fvào bộ nhớ, sau đó gọi nó bằng đối số 1, sau đó gọi nó bằng đối số 3. Bất kỳ ký tự không có chữ số nào cũng được coi là một lệnh và bất kỳ chữ số nào cũng được coi là một đối số.

Nhiệm vụ của bạn

Nhiệm vụ của bạn là triển khai khối bộ nhớ trong của Cuba bằng ngôn ngữ bạn chọn. Mã của bạn sẽ có thể thực thi một tập hợp con rất nhỏ của ngôn ngữ.

Các lệnh

  • R - Xoay mặt phải của khối lập phương theo chiều kim đồng hồ với số lần chỉ định.
  • L - Xoay mặt trái của khối lập phương theo chiều kim đồng hồ với số lần chỉ định.
  • U - Xoay mặt trên của khối lập phương theo chiều kim đồng hồ với số lần được chỉ định.
  • D - Xoay mặt dưới của khối lập phương theo chiều kim đồng hồ với số lần chỉ định.
  • F - Xoay mặt trước của khối lập phương theo chiều kim đồng hồ với số lần chỉ định.
  • B - Xoay mặt sau của khối lập phương theo chiều kim đồng hồ với số lần chỉ định.
  • %- Xuất giá trị trên mặt đã cho. Giá trị của một mặt được định nghĩa là tổng của tất cả các hình vuông trên mặt đó.

Quy tắc

  • Bạn có thể sử dụng bất kỳ ngôn ngữ nào được tạo trước hoặc sau ngày thử thách này được đăng để viết chương trình hoặc chức năng có khả năng giải quyết thử thách này.
  • Đầu vào sẽ được chuyển qua STDIN, dưới dạng chuỗi hoặc dưới dạng mảng ký tự (bạn chọn, vui lòng chỉ định).
  • Đầu ra phải được truyền cho STDOUT hoặc là đầu ra của hàm và nó phải là một số nguyên, một chuỗi chỉ chứa các chữ số hoặc một mảng các chữ số. Nếu ngôn ngữ của bạn yêu cầu bạn xuất ra một dòng mới, bạn có thể làm như vậy.
  • Đầu vào sẽ luôn ở định dạng sau : ([UDLRFB]\d*)*%[0-5]. Sẽ không có ký tự khoảng trắng trong đầu vào.
  • Đầu vào cho %sẽ luôn sử dụng chỉ mục dựa trên 0.

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.

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

%0 -> 0
%1 -> 9
%2 -> 18
%3 -> 27
%4 -> 36
%5 -> 45
R1%2 -> 27
RD3F2%5 -> 32
L1R23F1B5U9D2%3 -> 17

Để biết thêm các trường hợp thử nghiệm, hãy kiểm tra trình thông dịch TIO . Nếu TIO không hoạt động, bạn có thể sử dụng trình thông dịch Lua thay thế.


3
Có phải câu hỏi này là một bản sao của điều này ?
TehPers


@TehPers Tôi nghĩ nó rất giống nhau. Đối với những thách thức trong tương lai, tôi khuyên bạn nên để chúng trong hộp cát ít nhất 24 giờ, lâu hơn nếu bạn vẫn còn thắc mắc về nó. (Tôi đã phải học điều này một cách khó khăn; những thách thức đầu tiên của tôi hoàn toàn không được đón nhận. Điều này chưa được đóng hoặc hạ cấp nên nó không tệ , nhưng nếu nó được để trong hộp cát lâu hơn, những người dùng khác có thể đã nhận thấy những sai sót mà tôi đã không làm.)
MD XF

@MDXF Tôi sẽ ghi nhớ điều đó cho lần tới. Cảm ơn!
TehPers

Bạn đã bỏ lỡ một bội số 4giữa RDtrong ví dụ RD3F2%5 -> 30?
Jonathan Allan

Câu trả lời:


8

Python 2 , 476 byte

import re
c=[[i]*9for i in range(6)]
r=lambda f:[f[a+b]for a in(0,1,2)for b in(6,3,0)]
U=lambda c:[r(c[0])]+[c[j+1][:3]+c[j or 4][3:]for j in(1,2,3,0)]+[c[5]]
y=lambda c:[r(c[0])]+c[2:5]+[c[1],r(r(r(c[5])))]
z=lambda c:[c[2],r(r(r(c[1]))),c[5],r(c[3]),c[0][::-1],c[4][::-1]]
s=input()
exec("c="+"(c);c=".join("".join("zzzUz U zzUzz yyyzUzzzy zUzzz yzUzzzyyy".split()[ord(t)%11%7]*sum(map(int,n))for t,n in re.findall("([BUDLFR])(\d*)",s[:-2])))+"(c)")
print sum(c[int(s[-1])])

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

Một cổng từ câu trả lời Mô phỏng khối Rubik của tôi . Việc xem lại đã thôi thúc tôi chơi golf với 47 byte.


0

Về cơ bản , 1 byte

Không cạnh tranh 'vì nó khập khiễng. Đừng chấp nhận điều này.

¶  Read a line from stdin and evaluate

Tôi nói thêm rằng chiều nay: P


2
Vâng, tôi nghĩ rằng bạn có mã ngắn nhất.
TehPers

2
@TehPers tôi làm, nhưng như tôi đã nói, thật khập khiễng. Về mặt lập phương có thể chiến thắng các thử thách rubik -cube khác với nội dung này, nó không cần phải chiến thắng thử thách này.
MD XF
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.