혁신 재생을위한 아이콘 계산


11

혁신 은 플레이어가 선사 시대부터 현대에 이르기까지 시대를 뛰어 넘어 상대방보다 빠르게 업적을 달성하는 카드 게임입니다.

Innovation의 각 카드는 고유하며 여러 아이콘이있는 플레이어를 제공합니다. 각 카드를 2x3 격자로 취급하면 왼쪽 및 아래쪽 가장자리에있는 4 개의 슬롯 중 3 개는 항상 아이콘으로 표시됩니다 (검은 육각형의 기호는 계산되지 않음).

여기에 이미지 설명을 입력하십시오

이 게임에는 6 가지 유형의 아이콘 (성, 크라운, 잎, 전구, 공장 및 시계)이 있으며 chars을 임의로 사용하여 나타냅니다 012345. 사용 #검은 육각형을 표현하기 위해, 우리는 각 카드의 아이콘을 나타내는 네 개의 문자를 사용할 수 있습니다. 예를 들어 위의 카드는

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

이제 Innovation에서 놀이 공간의 카드는 더미로 그룹화되어 4 가지 방법 중 하나로 재생됩니다. 각 예에서 가장 왼쪽에있는 카드 03#0가 더미의 상단에 있다고 가정하면 위의 카드를 사용합니다 .

플레이 없음 : 상단 카드 만 표시

0..
3#0

왼쪽으로 플레이 : 상단 카드와 모든 카드의 오른쪽 1/3을 모두 볼 수 있습니다

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

오른쪽으로 펼치기 : 맨 위의 카드가 모두 표시되며 아래의 모든 카드 중 왼쪽 1/3

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

스플레이 업 : 맨 위 카드와 모든 카드의 맨 아래 절반을 모두 볼 수 있습니다.

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

도전

입력은 두 부분으로 구성된 단일 공백으로 구분 된 문자열입니다.

  • splay direction은 !<>^splay, splay left, splay right 또는 splay up을 각각 나타내지 않습니다.
  • 비어 있지 않은 카드 목록은 각각 4 자 길이이며 문자로 구성 012345#됩니다. 가장 왼쪽에있는 카드는 파일 맨 위에 있으며 각 카드에는 정확히 하나가 들어 있습니다 #.

답은 기능, 전체 프로그램 또는 이와 동등한 것일 수 있습니다 . 재생 방향이 첫 번째인지 마지막인지를 선택할 수 있습니다. 즉, 아래 두 가지 형식 중 하나를 선택하십시오.

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

출력은 각 아이콘의 개수를 나타내는 6 개의 숫자 목록입니다 (예 : 위의 카드 예).

! 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

예를 들어, 스 플레 없음 케이스에는 두 개의 0아이콘과 하나의 3아이콘이 표시되어 첫 번째 줄이 표시됩니다. #검은 육각형은 아이콘이 아니기 때문에 s 는 계산하지 않습니다 .

구분 기호로 구분되거나 언어의 자연스러운 목록 표현을 사용하여 목록을 표현하는 합리적이고 모호하지 않은 방법을 선택할 수 있습니다.

테스트 사례

! 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

같은 뭔가를 참고 !목록이 비어 있지 않은이 보장되기 때문에 유효하지 않은 입력입니다.


*이 도전의 목적으로, 우리는 파일 색상을 무시합니다.

답변:


5

CJam, 44 37 36 바이트

내가 너무 복잡하고 7 바이트를 절약하고 있음을 상기시켜 준 Sp3000에게 감사합니다.

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

여기에서 테스트하십시오.

설명

일부 관찰 :

  • 우리는 항상 첫 카드 전체를 세고 싶습니다.
  • 모든 재생은 접두사 또는 접미사 아이콘이 제거됩니다. !모든 문자를 <제거하고 ( 접두사 또는 접미사 4 자) 처음 3자를 >제거하고 마지막 2자를 ^제거하고 첫 문자를 제거합니다.

따라서 스플레이 모드를 올바른 잘림에 매핑하는 짧은 방법 만 있으면됩니다.

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.

잘림 스 니펫은 실제로 많은 구조를 가지고 있음을 알 수 있습니다. 각 재생 모드는 [0 1 2 3](특히 순서대로 "!^><") 하나의 숫자에 매핑되며 그 중 두 개는가 >있고 두 개는 <입니다. 많은 양의 바이트를 절약 할 수 있기 때문에이 부분을 마술처럼 생성하는 두 개의 해시를 찾고 있었지만 지금까지는 아무것도 찾을 수 없었습니다. (에서 올바른 문자를 선택하기 위해)를 사용하여 여러 "!^><"번의 패리티로 매핑 할 수 있지만 그 순서대로 깔끔하게 매핑하는 것을 찾지 못했습니다 . ( 아쉽게도 바이트를 저장하지 않는 순진한 솔루션을 제외하고 )31%"<>"[0 1 2 3]"!^><"#

또한 실제로 약간 더 유연합니다. !또한으로 구현 될 수 n>있는 위해 n > 3(접두사로 폐기 다). 불행히도, 나는 그런지도에 대한 간단한 기능을 찾을 수 없었습니다.


0

Pyth, 39 36 33 31 바이트

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

온라인으로 사용해보십시오. 테스트 스위트.

설명

  • Jtczd: 입력을 공백으로 나누고 첫 번째 부분을 제거한 다음 나머지를에 저장합니다 J.
  • m6: 0에서 5까지의 숫자에 대해 다음을 반복하십시오.
    • mtJ: 첫번째 카드를 제외한 모든 카드에 대해 다음을 반복합니다.
      • Chz: 입력에서 첫 번째 문자의 코드 포인트를 가져옵니다.
      • %*%33T19: !<>^(33, 60, 62, 94) 의 코드 포인트를 숫자 0, 4, 5, 14에 매핑합니다 . 정확한 계산은 cp % 33 * 10 % 19입니다.
      • yk: 현재 카드의 전원을 얻습니다. 이것은 카드의 모든 하위 시퀀스 목록입니다.
      • @: 이전에 계산 된 인덱스에 해당하는 파워 세트의 항목을 가져옵니다.
    • +hJ: 첫 번째 카드를 결과에 추가합니다.
    • s: 처리 된 카드를 서로 연결합니다.
    • /`d: 결과에서 현재 숫자의 발생 횟수를 계산합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.