イノベーションの広がりのアイコンを数える


11

イノベーションとは、プレイヤーが先史時代から現代まで時代を超えて戦い、対戦相手よりも早く成果を上げようとするカードゲームです。

イノベーションの各カードはユニークであり、プレーヤーに多くのアイコンを提供します。各カードを2x3グリッドとして扱う場合、左端と下端の4つのスロットのうち3つは常にアイコンで占められます(黒い六角形のシンボルはカウントされません)。

ここに画像の説明を入力してください

ゲームには6種類のアイコン(城、王冠、葉、電球、工場、時計)があり、それらをcharsを使用して任意に表し012345ます。使用して#黒の六角形を表現するために、我々は、各カード上のアイコンを表すために4つの文字を使用することができます。たとえば、上記のカードは

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

現在、Innovationでは、プレイエリアのカードはパイル*にグループ化され、4つの方法のいずれかで展開されます。各例では、左端のカード03#0が山の一番上にあると仮定して、上のカードを使用します。

表示なし:一番上のカードのみが表示されます

0..
3#0

左にスプレイ:一番上のカードが完全に表示され、下のすべてのカードの右3分の1も表示されます。

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

右に表示:一番上のカードが完全に表示され、下のすべてのカードの左3分の1も表示されます

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

スプレイアップ:一番上のカードが完全に表示され、下のすべてのカードの下半分が表示されます。

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

チャレンジ

入力は、2つの部分で構成されるスペースで区切られた単一の文字列になります。

  • スプレイ方向。これは!<>^、スプレイなし、左スプレイ、右スプレイ、または上スプレイをそれぞれ表すの1つです。
  • 空ではないカードのリスト。各カードは4文字の長さで、charsで構成されてい012345#ます。左端のカードは山の一番上にあり、各カードには1枚だけが含まれています#

回答は、関数、完全なプログラム、または同等のものです。スプレイの方向が最初か最後かを選択できます。つまり、以下の2つの形式のいずれかを選択できます。

> 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

たとえば、ノースプレイケースには2つの0アイコンと1つの3アイコンが表示され、最初の行が表示されます。#黒い六角形はアイコンではないため、をカウントしないことに注意してください。

リストを表現する合理的で曖昧さのない方法を選択できます。たとえば、区切り文字で区切ったり、言語の自然なリスト表現を使用したりできます。

テストケース

! 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](具体的には、順番に"!^><")1つの番号にマップされ、そのうち2つがを持ち>、2つがを持ち<ます。大量のバイトを節約できるように、これらのパーツを魔法のように別々に生成する2つのハッシュを見つけることを望んでいましたが、今のところ何も見つかりませんでした。私はマップでき"!^><"てパリティを交互の番号に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.