Menghitung ikon untuk Inovasi splays


11

Inovasi adalah permainan kartu di mana pemain bertempur selama berabad-abad, dari prasejarah hingga zaman modern, dalam upaya untuk mendapatkan prestasi lebih cepat dari lawan mereka.

Setiap kartu dalam Inovasi unik, dan memberikan sejumlah ikon kepada pemain. Jika kita memperlakukan setiap kartu sebagai kisi 2x3, maka tiga dari empat slot di tepi kiri dan bawah akan selalu diambil oleh ikon (simbol dalam heksagon hitam tidak dihitung).

masukkan deskripsi gambar di sini

Gim ini memiliki 6 jenis ikon (kastil, mahkota, dedaunan, bola lampu, pabrik, dan jam), yang akan kami wakili secara sewenang-wenang menggunakan karakter 012345. Menggunakan #untuk mewakili segi enam hitam, kita dapat menggunakan empat karakter untuk mewakili ikon pada setiap kartu. Misalnya, kartu di atas adalah

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

Sekarang, dalam Inovasi, kartu di area bermain dikelompokkan ke dalam tumpukan * yang disusun dalam salah satu dari empat cara. Untuk setiap contoh kita akan menggunakan kartu di atas, dengan asumsi kartu paling kiri 03#0,, berada di bagian atas tumpukan.

Tanpa bentang: hanya kartu atas yang terlihat

0..
3#0

Berputar ke kiri : kartu teratas sepenuhnya terlihat, serta sepertiga kanan dari semua kartu di bawah ini

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

Berputar ke kanan : kartu teratas sepenuhnya terlihat, serta sepertiga kiri dari semua kartu di bawah ini

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

Melebar ke atas : kartu teratas sepenuhnya dapat dilihat, serta bagian bawah dari semua kartu di bawah ini.

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

Tantangan

Input akan menjadi string yang dipisahkan oleh spasi tunggal yang terdiri dari dua bagian:

  • Arah splay, yang merupakan salah satu dari !<>^, mewakili tidak ada splay, splay kiri, splay kanan atau splay masing-masing.
  • Daftar kartu yang tidak kosong, yang masing-masing terdiri dari 4 karakter dan terdiri dari karakter 012345#. Kartu paling kiri berada di bagian atas tumpukan, dan setiap kartu berisi persis satu #.

Jawaban dapat berupa fungsi, program lengkap atau setara . Anda dapat memilih apakah arah rentang pertama atau terakhir, yaitu memilih salah satu dari dua format di bawah ini:

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

Output akan berupa daftar enam angka yang mewakili hitungan untuk setiap ikon, misalnya untuk kartu contoh di atas:

! 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

Misalnya, kotak tanpa bentang memiliki dua 0ikon dan satu 3ikon yang menunjukkan, memberikan baris pertama. Perhatikan bahwa kami tidak menghitung #s, karena segi enam hitam bukan ikon.

Anda dapat memilih cara yang masuk akal dan tidak ambigu untuk merepresentasikan daftar, misalnya dipisahkan oleh pembatas atau menggunakan representasi daftar alami bahasa Anda.

Uji kasus

! 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

Perhatikan bahwa sesuatu seperti !input tidak valid, karena daftar dijamin tidak kosong.


* Untuk keperluan tantangan ini, kami mengabaikan warna tumpukan.

Jawaban:


5

CJam, 44 37 36 byte

Terima kasih kepada Sp3000 untuk mengingatkan saya bahwa saya terlalu rumit dan menghemat 7 byte.

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

Uji di sini.

Penjelasan

Beberapa pengamatan:

  • Kami selalu ingin menghitung seluruh kartu pertama.
  • Semua splays akan menghasilkan awalan atau akhiran dari ikon yang dihapus. !menghapus semuanya (yang merupakan awalan atau akhiran empat karakter), <menghapus tiga karakter pertama, >menghapus dua karakter terakhir, ^menghapus karakter pertama.

Jadi yang kita butuhkan hanyalah cara singkat untuk memetakan mode splay ke pemotongan yang benar:

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.

Kita dapat melihat bahwa potongan truncation sebenarnya memiliki banyak struktur. Setiap mode splay memetakan ke satu nomor [0 1 2 3](khusus, dalam urutan "!^><"), dan dua di antaranya memiliki >dan dua memiliki <. Saya berharap menemukan dua hash yang secara ajaib menghasilkan bagian-bagian ini secara terpisah, karena itu akan menghemat banyak byte, tetapi sejauh ini saya tidak dapat menemukan apa pun. Saya dapat memetakan "!^><"ke sejumlah paritas bolak-balik dengan 31%(untuk memilih karakter yang benar dari "<>"), tetapi saya belum menemukan apa pun yang memetakan mereka dengan rapi [0 1 2 3]dalam urutan itu. (Kecuali solusi naif "!^><"#yang sayangnya tidak menyimpan byte.)

Perhatikan juga bahwa ini sebenarnya sedikit lebih fleksibel. !juga dapat diimplementasikan n>untuk apa saja n > 3(membuang semuanya sebagai awalan). Sayangnya, saya belum dapat menemukan fungsi sederhana untuk peta semacam itu.


0

Pyth, 39 36 33 31 byte

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

Cobalah online. Suite uji.

Penjelasan

  • Jtczd: pisahkan input dengan spasi, hapus bagian pertama, dan simpan sisanya ke J.
  • m6: Ulangi yang berikut untuk angka 0 hingga 5.
    • mtJ: Ulangi yang berikut untuk semua kartu kecuali yang pertama.
      • Chz: dapatkan titik kode karakter pertama dalam input.
      • %*%33T19: Memetakan titik kode dari !<>^(33, 60, 62, 94) ke angka 0, 4, 5, 14. Perhitungan tepat yang dilakukan adalah cp % 33 * 10 % 19.
      • yk: dapatkan powerset dari kartu saat ini. Ini adalah daftar semua urutan kartu.
      • @: dapatkan item dari powerset yang sesuai dengan indeks yang dihitung sebelumnya.
    • +hJ: tambahkan kartu pertama ke hasilnya.
    • s: menyatukan kartu yang diproses bersama.
    • /... `d: hitung kemunculan angka saat ini dalam hasil.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.