Yenilik sunumları için simgeler sayma


11

İnovasyon , oyuncuların tarihlerden modern zamanlara, rakiplerinden daha hızlı başarılar kazanmak için çağlar boyunca savaştığı bir kart oyunudur.

İnovasyondaki her kart benzersizdir ve bir oyuncuya çeşitli simgeler sunar. Her bir karta 2x3 ızgara olarak davranırsak, sol ve alt kenarlardaki dört yuvadan üçü her zaman simgeler tarafından alınır (siyah altıgenlerdeki semboller sayılmaz).

resim açıklamasını buraya girin

Oyunda, karakterleri keyfi olarak temsil edeceğimiz 6 çeşit simge (kaleler, kronlar, yapraklar, ampuller, fabrikalar ve saatler) vardır 012345. Kullanılması #siyah altıgen temsil etmek, her kartta simgeleri temsil etmek dört karakter kullanabilirsiniz. Örneğin, yukarıdaki kartlar

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

Şimdi, İnovasyonda, oyun alanındaki kartlar dört yoldan biriyle gösterilen yığınlara * ayrılmıştır. Her örnek için, en soldaki kartın 03#0yığının en üstünde olduğu varsayılarak yukarıdaki kartları kullanacağız .

Splay yok: yalnızca üst kart görünür

0..
3#0

Sola yay : üstteki kart tamamen görünür ve aşağıdaki tüm kartların sağ üçte biri

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

Sağa doğru sağla : üstteki kart, aşağıdaki tüm kartların sol üçte biri kadar tamamen görülebilir

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

Ekranı açın : üstteki kartın tamamı ve aşağıdaki tüm kartların alt yarısı görünür.

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

Meydan okuma

Giriş, iki bölümden oluşan tek bir boşlukla ayrılmış dize olacaktır:

  • !<>^Sıçramayı, sola savrulmayı, sağa savrulmayı veya yukarı fırlatmayı temsil eden bir yiv yönü .
  • Her biri 4 karakter uzunluğunda ve karakterlerden oluşan boş olmayan bir kart listesi 012345#. En soldaki kart destenin üstündedir ve her kartta tam olarak bir tane bulunur #.

Cevaplar fonksiyonlar, tam programlar veya eşdeğeri olabilir . Ekran yönünün ilk mi yoksa son mu olduğunu seçebilirsiniz, yani aşağıdaki iki biçimden birini seçin:

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

Çıktı, her bir simgenin sayımını temsil eden altı sayının bir listesi olacaktır, örneğin yukarıdaki örnek kartlar için:

! 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

Örneğin, splay kasası olmayan iki 0simge ve bir 3simge gösteren ilk satırı verir. Biz sayılmaz o Not #siyah altıgenler simgeler olmadığından, s.

Listeyi temsil etmenin makul ve belirsiz olmayan bir yolunu seçebilirsiniz; örneğin, sınırlayıcı ile ayrılmış veya dilinizin doğal liste gösterimini kullanma.

Test senaryoları

! 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

!Listenin boş olmadığı garanti edildiğinden, benzer bir şeyin geçersiz giriş olduğunu unutmayın .


* Bu zorluğun amaçları için, kazık renklerini görmezden geliyoruz.

Yanıtlar:


5

CJam, 44 37 36 bayt

Bir şeyleri çok karmaşık yaptığımı ve 7 bayt tasarruf ettiğimi hatırlattığı için Sp3000'e teşekkürler.

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

Burada test edin.

açıklama

Bazı gözlemler:

  • Her zaman ilk kartın tamamını saymak istiyoruz.
  • Tüm gösterimler kaldırılan simgelerin ön eki veya son ekiyle sonuçlanır. !tümünü (bir önek veya dört karakterden oluşan bir sonek) <kaldırır, ilk üç karakteri >kaldırır, son iki karakteri ^kaldırır, ilk karakteri kaldırır.

Dolayısıyla, tek ihtiyacımız olan splay modunu doğru kesmeye eşlemek için kısa bir yol:

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.

Kesilme parçacıklarının aslında çok fazla yapıya sahip olduğunu fark edebiliriz. Her bir ekran modu [0 1 2 3], içinde bir sayı ile eşleşir (özellikle sırayla "!^><") ve ikisinde >ve ikisinde vardır <. Bu parçaları ayrı ayrı sihirli bir şekilde üreten iki karma bulmayı umuyordum, çünkü bu bir demet bayt kurtaracaktı, ancak şu ana kadar hiçbir şey bulamadım. (Doğru karakteri seçmek için) "!^><"ile alternatif parite sayılarına eşleştirebilirim , ancak onları bu sırayla düzgün bir şekilde eşleyen hiçbir şey bulamadım . ( Ne yazık ki hiçbir bayt tasarruf etmeyen naif çözüm hariç .)31%"<>"[0 1 2 3]"!^><"#

Ayrıca aslında biraz daha esnek olduğunu unutmayın. herhangi biri için !de uygulanabilir (her şeyi önek olarak atamak). Ne yazık ki, böyle bir harita için de basit bir işlev bulamadım.n>n > 3


0

Pyth, 39 36 33 31 bayt

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

Çevrimiçi deneyin. Test odası.

açıklama

  • Jtczd: girişi boşluklara böler, ilk kısmı kaldırır ve gerisini kaydeder J.
  • m6: 0 ile 5 arasındaki sayılar için aşağıdakileri tekrarlayın.
    • mtJ: Birincisi dışındaki tüm kartlar için aşağıdakileri tekrarlayın.
      • Chz: girişteki ilk karakterin kod noktasını al.
      • %*%33T19: !<>^(33, 60, 62, 94) kod noktalarını 0, 4, 5, 14 sayılarına eşleyin. Gerçekleştirilen kesin hesaplama cp % 33 * 10 % 19.
      • yk: mevcut kartın güç setini al. Bu, kartın tüm alt dizilerinin bir listesidir.
      • @: daha önce hesaplanan dizine karşılık gelen güç kümesinin öğesini almanızı sağlar.
    • +hJ: sonuca ilk kartı ekleyin.
    • s: işlenen kartları birleştirin.
    • /`d: Sonuçtaki geçerli sayının oluşumlarını sayın.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.