Đếm các biểu tượng cho các mảng đổi mới


11

Đổi mới là một trò chơi bài nơi người chơi chiến đấu qua các thời đại, từ thời tiền sử đến thời hiện đại, trong nỗ lực kiếm thành tích nhanh hơn đối thủ của họ.

Mỗi thẻ trong Đổi mới là duy nhất và cung cấp cho người chơi một số biểu tượng. Nếu chúng ta coi mỗi thẻ là một lưới 2x3, thì ba trong số bốn khe ở cạnh trái và cạnh dưới sẽ luôn được đưa lên bởi các biểu tượng (các biểu tượng trong hình lục giác đen không được tính).

nhập mô tả hình ảnh ở đây

Trò chơi có 6 loại biểu tượng (lâu đài, vương miện, lá, bóng đèn, nhà máy và đồng hồ), mà chúng ta sẽ đại diện tùy ý sử dụng ký tự 012345. Sử dụng #để đại diện cho hình lục giác đen, chúng ta có thể sử dụng bốn ký tự để biểu thị các biểu tượng trên mỗi thẻ. Ví dụ, các thẻ ở trên là

0.. #.. 3.. 1..  -> 03#0 #331 355# 144#
3#0 331 55# 44#

Bây giờ, trong Đổi mới, các thẻ trong khu vực chơi được nhóm thành đống * được chơi theo một trong bốn cách. Đối với mỗi ví dụ, chúng tôi sẽ sử dụng các thẻ ở trên, giả sử thẻ ngoài cùng bên trái 03#0, nằm ở đầu đống.

Không có splay: chỉ nhìn thấy thẻ trên cùng

0..
3#0

Splay bên trái : thẻ trên cùng có thể nhìn thấy đầy đủ, cũng như thứ ba bên phải của tất cả các thẻ bên dưới

0..|.|.|.|
3#0|1|#|#|

Splay phải : thẻ trên cùng có thể nhìn thấy đầy đủ, cũng như thứ ba bên trái của tất cả các thẻ bên dưới

1|3|#|0..
4|5|3|3#0

Splay up : thẻ trên cùng có thể nhìn thấy đầy đủ, cũng như nửa dưới của tất cả các thẻ bên dưới.

0..
3#0
---
331
---
55#
---
44#

Các thách thức

Đầu vào sẽ là một chuỗi phân tách không gian duy nhất bao gồm hai phần:

  • Một hướng splay, là một trong những !<>^, đại diện cho không có splay, splay trái, splay phải hoặc splay lên tương ứng.
  • Một danh sách các thẻ không trống, mỗi thẻ dài 4 ký tự và bao gồm các ký tự 012345#. Thẻ ngoài cùng bên trái nằm ở đầu đống và mỗi thẻ chứa chính xác một #.

Câu trả lời có thể là chức năng, chương trình đầy đủ hoặc tương đương . Bạn có thể chọn hướng splay là đầu tiên hay cuối cùng, tức là chọn một trong hai định dạng dưới đây:

> 03#0 #331 355# 144#
03#0 #331 355# 144# >

Đầu ra sẽ là một danh sách sáu số đại diện cho số đếm cho mỗi biểu tượng, ví dụ cho các thẻ ví dụ ở trên:

! 03#0 #331 355# 144#  ->  2 0 0 1 0 0
< 03#0 #331 355# 144#  ->  2 1 0 1 0 0
> 03#0 #331 355# 144#  ->  2 1 0 3 1 1
^ 03#0 #331 355# 144#  ->  2 1 0 3 2 2

Chẳng hạn, trường hợp không có splay có hai 0biểu tượng và một 3biểu tượng hiển thị, đưa ra dòng đầu tiên. Lưu ý rằng chúng ta không tính #s, vì các hình lục giác đen không phải là biểu tượng.

Bạn có thể chọn bất kỳ cách biểu thị danh sách hợp lý và không mơ hồ nào, ví dụ như phân tách bằng dấu phân cách hoặc sử dụng biểu diễn danh sách tự nhiên của ngôn ngữ của bạn.

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

! 113#  ->  0 2 0 1 0 0
< 113#  ->  0 2 0 1 0 0
> 113#  ->  0 2 0 1 0 0
^ 113#  ->  0 2 0 1 0 0
! 000# 12#2  ->  3 0 0 0 0 0
< 000# 12#2  ->  3 0 1 0 0 0
> 000# 12#2  ->  3 1 1 0 0 0
^ 000# 12#2  ->  3 0 2 0 0 0
! 000# 111# 222#  ->  3 0 0 0 0 0
< 000# 111# 222#  ->  3 0 0 0 0 0
> 000# 111# 222#  ->  3 2 2 0 0 0
^ 000# 111# 222#  ->  3 2 2 0 0 0
! 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  0 0 0 2 0 1
< 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  1 1 2 5 1 1
> 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  0 3 3 7 1 1
^ 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  2 4 4 10 1 2

Lưu ý rằng một cái gì đó như !là đầu vào không hợp lệ, vì danh sách được đảm bảo là không trống.


* Vì mục đích của thử thách này, chúng tôi bỏ qua màu cọc.

Câu trả lời:


5

CJam, 44 37 36 byte

Cảm ơn Sp3000 đã nhắc nhở tôi rằng tôi đang làm quá nhiều thứ và tiết kiệm 7 byte.

rci7%"3>0<2<1>"2/=6,slS%{W$~+}*fe=p;

Kiểm tra nó ở đây.

Giải trình

Một số quan sát:

  • Chúng tôi luôn muốn đếm toàn bộ thẻ đầu tiên.
  • Tất cả các splays sẽ dẫn đến một tiền tố hoặc hậu tố của các biểu tượng bị loại bỏ. !xóa tất cả chúng (là tiền tố hoặc hậu tố gồm bốn ký tự), <xóa ba ký tự đầu tiên, >xóa hai ký tự cuối, ^xóa ký tự đầu tiên.

Vì vậy, tất cả những gì chúng ta cần là một cách ngắn để ánh xạ chế độ splay sang cắt ngắn chính xác:

rci   e# Read the splay mode and convert to its character code.
7%    e# Take modulo 7. This maps "<!>^" to [4 5 6 3], respectively. Modulo 4 those are
      e# are all distinct (namely [0 1 2 3], respectively).
"3>0<2<1>"
      e# Push this string.
2/    e# Split it into chunks of 2, ["3>" "0<" "2<" "1>"]. Each chunk is CJam code which
      e# performs one of the truncations.
=     e# Select the correct snippet. This works, because array indexing is cyclic in CJam.
6,s   e# Push the string "012345".
lS%   e# Read the remainder of the input and split into space-separated tokens.
{     e# Now we're abusing the fold operation to apply our snippet to every card except
      e# the first, while also combining them all back into a single string.
  W%  e#   Copy the bottom of the stack (the truncation snippet).
  ~   e#   Evaluate it.
  +   e#   Append it the string we're building.
}*
fe=   e# For each character in "012345", count the occurrences in our new string.
p     e# Pretty-print the array.
;     e# Discard the truncation snippet which was still at the bottom of the stack.

Chúng ta có thể nhận thấy rằng các đoạn cắt ngắn thực sự có rất nhiều cấu trúc. Mỗi chế độ splay ánh xạ tới một số theo [0 1 2 3](cụ thể, theo thứ tự "!^><") và hai trong số chúng có >và hai có <. Tôi đã hy vọng tìm thấy hai hàm băm tạo ra các phần riêng biệt một cách kỳ diệu, vì điều đó sẽ tiết kiệm được một loạt byte, nhưng cho đến nay tôi không thể tìm thấy bất cứ thứ gì. Tôi có thể ánh xạ "!^><"tới các số chẵn lẻ xen kẽ với 31%(để chọn đúng ký tự "<>"), nhưng tôi không tìm thấy bất cứ thứ gì ánh xạ gọn gàng chúng [0 1 2 3]theo thứ tự đó. (Ngoại trừ giải pháp ngây thơ "!^><"#mà không may không lưu bất kỳ byte nào.)

Cũng lưu ý rằng nó thực sự linh hoạt hơn một chút. !cũng có thể được thực hiện như n>đối với bất kỳ n > 3(loại bỏ mọi thứ làm tiền tố). Thật không may, tôi cũng không thể tìm thấy bất kỳ chức năng đơn giản nào cho bản đồ như vậy.


0

Pyth, 39 36 33 31 byte

Jtczdm/s+hJm@yk%*%Chz33T19tJ`d6

Hãy thử trực tuyến. Bộ thử nghiệm.

Giải trình

  • Jtczd: tách đầu vào theo khoảng trắng, xóa phần đầu tiên và lưu phần còn lại vào J.
  • m... 6: lặp lại sau cho số 0-5.
    • m... tJ: lặp lại sau cho tất cả các thẻ trừ cái đầu tiên.
      • Chz: lấy điểm mã của ký tự đầu tiên trong đầu vào.
      • %*%Liên kết 33T19: ánh xạ các điểm mã của !<>^(33, 60, 62, 94) thành các số 0, 4, 5, 14. Phép tính chính xác được thực hiện là cp % 33 * 10 % 19.
      • yk: lấy quyền hạn của thẻ hiện tại. Đây là danh sách tất cả các phần sau của thẻ.
      • @: lấy mục của powerset tương ứng với chỉ số được tính trước đó.
    • +hJ: nối thẻ đầu tiên vào kết quả.
    • s: ghép các thẻ đã xử lý lại với nhau.
    • /Kết quả `d: đếm số lần xuất hiện của số hiện tại trong kết quả.
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.