Risk Savaşı: Aşağı Gitmek


16

Risk'teki bir savaş için iki zar atma listesi verildiğinde, programınız veya işleviniz her oyuncunun kaç asker kaybettiğini vermelidir.

Arka fon

Bunu okumak zorunda değilsiniz, çünkü sadece arka plan. Durdurulmadan devam etmek için "Görev" alt başlığına atlayın.

Risk oyununda , bir oyuncu başka bir oyuncuya saldırabilir (aslında, bu kazanmak için gereklidir). Bir savaşın sonucu zar atar. Her savaş, her oyuncunun 2ordu parçalarını kaybedebileceği bir alt savaşlar dizisi olarak gerçekleşir.

Bir alt savaşta, defans oyuncusu ve saldırgan her biri, sayıları bu zorlukla ilgisi olmayan koşullara göre değişebilen birkaç zar atar. Saldırganın en değerli ölümü, savunucunun en değerli ölümü ile karşılaştırılır. Saldırganın ölümü savunanın ölümünden daha yüksekse, savunma oyuncusu bir taş kaybeder. Aksi takdirde, saldırgan tek bir parçayı kaybeder.

Daha sonra, her iki oyuncunun da en az iki zarı varsa, iki oyuncunun ikinci en yüksek değerli zarı karşılaştırılır. Yine, eğer saldırganın ölümü savunanın ölümünden daha yüksekse, savunma oyuncusu bir taş kaybeder. Aksi takdirde, saldırgan tek bir parçayı kaybeder.

(Defans bağları kazanır. Hem savunma oyuncusu hem de saldırgan a atarsa 4, saldırgan bir parçayı kaybeder.)

Zar Karşılaştırma

Wikipedia makalesinin bu alt savaşında, saldırganın zarları kırmızı ve savunucunun zarları beyazdır. Saldırganın en yüksek zarı 4ve savunmacının en yüksek zarı 3. Saldırgan daha yüksek olduğu için defans oyuncusu bir parçasını kaybeder. İkincisi 3, saldırgan ve 2savunma oyuncusu içindir. Saldırgan yine yüksek olduğu için defans oyuncusu başka bir taş kaybeder. Böylece bu alt savaşta, saldırgan hiçbir parçayı kaybetmez ve defans oyuncusu da 2parçayı kaybeder .

Üçüncü en yüksek parçaların karşılaştırılmadığına dikkat edin. Çünkü savunanın tek bir alt savaşta ikiden fazla zarı yoktur, bu yüzden karşılaştırılacak en yüksek üçüncü parça yoktur.

Görev

Hem saldırganın hem de Risk alt savaşının savunucusunun uygun olmayan bir şekilde ayrılmamış zar atışları (1 ila 6 dahil tamsayılar) göz önüne alındığında, her oyuncunun kaybettiği ordu parçalarının sayısını çıktılayın. Beş olasılığı göstermek için farklı çıktılara sahip olduğu sürece çıktı herhangi bir uygun biçimde olabilir. Sorunuzda bu farklı çıktıların neler olduğunu belirtmelisiniz.

Çıktı aşağıdaki gibi belirlenir: def=0ve ile başlayın atk=0. Saldırganın zar atışları listesinin en büyük değeri, savunucunun zar atışları listesinin en büyük değerinden büyükse, artırın def. Aksi takdirde, artırın atk.

Her iki zar atma listesinin uzunluğu en az ise 2, o zaman: saldırganın zar atma listesinin ikinci en büyük değeri listenin ikinci en büyük değerinden büyükse, artırın defve aksi takdirde artırın atk.

Son olarak, program veya fonksiyon aşağıdaki 5 çıkış olasılığının her biri için benzersiz bir tanımlayıcı çıkarmalıdır:

  ╔═══╦═══╗
  ║atk║def║
  ╠═══╬═══╣
  ║ 1 ║ 0 ║
  ║ 0 ║ 1 ║
  ║ 2 ║ 0 ║
  ║ 1 ║ 1 ║
  ║ 0 ║ 2 ║
  ╚═══╩═══╝

Misal

Defans: [3, 2] Saldırgan: [2, 4, 1] Maksimum defans oyuncusu 3ve maksimum saldırgan 4. 4>3, yani def=1 ikinci defans oyuncusu 2ve ikinci defans oyuncusu 2. Not(2>2), öyle atk=1. Çıkış daha sonra olabilir [1,1].

Test Durumları

Defender
Attacker
Output (as [def,atk])
-----
[1]
[1]
[0,1]
-----
[6,6]
[1,1,1]
[0,2]
-----
[1,2]
[5,2,3]
[2,0]
-----
[5]
[3,4]
[0,1]
-----
[4]
[4,5]
[1,0]
-----
[1,3]
[1,2,3]
[1,1]
-----
[4]
[4,5,6]
[1,0]
-----
[4,5]
[6,2]
[1,1]
-----
[5]
[6,1,3]
[1,0]
-----
[5,5]
[4,4,1]
[0,2]
-----
[2,5]
[2,2]
[0,2]
-----
[6,6]
[4,4,3]
[0,2]
-----
[2,1]
[4,3]
[2,0]
-----
[4]
[1,5]
[1,0]
-----
[1]
[5,2]
[1,0]
-----
[6,2]
[4]
[0,1]
-----
[4,2]
[2,5,5]
[2,0]
-----
[2]
[6,6,2]
[1,0]
-----
[6]
[2,6]
[0,1]
-----
[3,1]
[1]
[0,1]
-----
[6,2]
[3,5,2]
[1,1]
-----
[4,2]
[1,1]
[0,2]
-----
[4,3]
[5,4,1]
[2,0]
-----
[5,6]
[1,2]
[0,2]
-----
[3,2]
[4,4]
[2,0]
-----
[2]
[6,3,4]
[1,0]
-----
[1,4]
[6,2,4]
[2,0]
-----
[4,2]
[2,5,4]
[2,0]
-----
[5]
[6,2,1]
[1,0]
-----
[3]
[2,5,4]
[1,0]
-----
[5,4]
[2]
[0,1]
-----
[6,3]
[2,6,5]
[1,1]
-----
[3,1]
[4]
[1,0]
-----
[4]
[6,6,5]
[1,0]
-----
[6,3]
[4,2]
[0,2]
-----
[1,6]
[5,4]
[1,1]
-----
[3,6]
[4,4]
[1,1]
-----
[5,4]
[5,1,1]
[0,2]
-----
[6,3]
[5,4]
[1,1]
-----
[2,6]
[1,2]
[0,2]
-----
[4,2]
[3,5,5]
[2,0]
-----
[1]
[1,2,1]
[1,0]
-----
[4,5]
[1,6]
[1,1]
-----
[1]
[3,5,1]
[1,0]
-----
[6,2]
[6,2]
[0,2]

Örnek uygulama

Python 2 veya 3

def risk(atk_rolls,def_rolls):
    # set the rolls in descending order, e.g. [5,3,2]
    atk_rolls = sorted(atk_rolls,reverse = True)
    def_rolls = sorted(def_rolls,reverse = True)
    # minimum length.
    minlen = min(len(atk_rolls),len(def_rolls))
    atk_lost = 0
    def_lost = 0
    # compare the highest-valued rolls
    if atk_rolls[0]>def_rolls[0]:
        def_lost += 1
    else:
        atk_lost += 1
    if minlen == 2:
        # compare the second-highest-valued rolls
        if atk_rolls[1] > def_rolls[1]:
            def_lost += 1
        else:
            atk_lost += 1
    return [def_lost, atk_lost]    

Özellikler

  • Giriş, yalnızca savunanın atışlarını ve saldırganın atışlarını açıkça kodlayan herhangi bir form olarak alınabilir .
  • Çıktı, yukarıda listelenen beş olasılıktan her biri için benzersiz bir çıktı sağlayan herhangi bir biçimde olabilir.
  • Savunucunun atışları kümedeki bir liste 1veya 2tamsayılardır [1,2,3,4,5,6]. Saldırganın rulo listesi vardır 1için 3sette tamsayılar [1,2,3,4,5,6].
  • Bu , her dilde en kısa kod kazanır! Do not golf dillerinde cevaplar diğer dillerdeki gönderme cevaplar sizi vazgeçirmek izin verin.

Bunu kum havuzunda gördüm, güzel soru
Noah Cristino


Saldırgan, maksimum atışını savunanın en yüksek atışına eşitse kaybeder, değil mi?
Bay Xcoder

1
Evet @ Mr.Xcoder, defans oyuncusu kazanır.
fireflame241

Bu nedenle yorumu sildim :)
Bay Xcoder

Yanıtlar:


8

NAND kapıları, 237

Logisim ile oluşturuldu

Girişler, soldan girilen 3 bitlik imzasızdır. Çıkışlar (2 bit) sağda.

Ekrana sığamayacak kadar büyük ve Logisim zum yapamıyor, bu nedenle görüntü siyah beyaz. Üzgünüm :(

Tüm test senaryoları için çalışır.

Bunu, büyük bölümlerin yeniden kullanılmasına izin vererek, bazı bellek devrelerini kullanarak yapmanın daha iyi bir yolu vardır.


4

Jöle ,  12  11 bayt

NṢ€>/Ṡḟ-o-S

Bir Defender, Attackerrulolar listesi (her biri liste olarak) alan -2ve arasında bir tamsayı 2(savunmacı kayıpları - saldırgan kayıpları) döndüren monadik bir bağlantı :

result : [def, atk]
    -2 : [  0,   2]
    -1 : [  0,   1]
     0 : [  1,   1]
     1 : [  1,   0]
     2 : [  2,   0]

Çevrimiçi deneyin! veya bir test paketine bakın(sonuçları OP biçimiyle eşler).

Nasıl?

NṢ€>/Ṡḟ-o-S - Link: list [list Def, list Atk]
N           - negate all the rolls
 Ṣ€         - sort €ach of the lists of -1*rolls (max rolls are to the left now)
    /       - reduce by:
   >        -   is greater than?  (when len(Atk) > len(Def) leaves trailing negatives)
     Ṡ      - sign (maps all negatives to -1; zeros and ones of comparison unchanged)
       -    - literal -1
      ḟ     - filter discard (remove the -1s)
         -  - literal -1
        o   - logical or, vectorises (replaces the zeros with minus ones)
          S - sum

2

Retina , 82 bayt

%O^`.
((.)+).*(¶(?<-2>.)+)(?(2)(?!)).*
$1$3
O$`.
$.%`
\d
$*1D
(1+)D1*\1

1+D
A
O`.

Çevrimiçi deneyin! İlk girdi satırı saldırganın zarları, ikincisi savunucunun zarları. (Ayrı satırlarda) döndürür AA, AD, DD, Aya da Duygun olduğu şekilde.



2

MATL , 23 bayt

oH2$S1&Y)Y&t1M>t~b,Y&sD

Çevrimiçi deneyin!

Savunucuların neden saldırganlardan daha fazla zarara izin verildiğinden emin değilim, ama belki de Riskte bu kadar usta değilim. Çekirdek program sadece >t~,sD, diğer tüm baytlar farklı giriş uzunluklarına izin vermek için orada, biraz sıralama atıldı. Giriş saldırgan, ardından defans oyuncusu, çıktı saldırgan kayıpları ve ardından defans kayıpları.

o    % Convert input to numeric array, padding with zeroes 
H2$S % Sort row-wise (specified to prevent 1v1 sorting)
1&Y) % Split attacker/defender
Y&t  % Logical and to filter out excess dice. Duplicate for 'do twice' later.
1M>  % Get throws again, decide who won
t~   % And the inverse to decide who lost
b,   % Bubble filter to the top. Do twice:
  Y& % Apply filter
  sD % Sum of losses. Display.

2

JavaScript (SpiderMonkey) , 97 83 78 bayt

d=>a=>{for(u=v=0;d.sort()>[]&a.sort()>[];)a.pop()>d.pop()?u++:v++
return[u,v]}

Çevrimiçi deneyin!

-4 bayt ve @ovs ve @Craig
sayesinde düzeltildi Ayre -1 bayt @Shaggy sayesinde


İki savunmacıya karşı bir saldırgan için çalışmaz.
Neil

Ah hmm bunu düşünmedim. Ben tamir edeceğim
WaffleCohn

2
Bu işe yarayabilir.
ovs

@ ovs'un çözümü tüm test senaryolarını geçiyor, birkaç bayt da kaydedebilirsiniz (tio bağlantısı çok büyüktü):d=>a=>{for(u=v=0;d.sort()>[]&a.sort()>[];)a.pop()>d.pop()?u++:v++;return[u,v]}
Craig Ayre

İlk satır sonu gereksiz ve size bir bayt maliyeti.
Shaggy

2

Kabuk , 10 bayt

M#eI¬¤z>Ö>

Çevrimiçi deneyin!

İki ayrı rulo listesi olarak giriş yapın, op.

açıklama

¤z>Ö> her listeyi azalan düzende sıralar ve ardından karşılık gelen öğeleri karşılaştırarak sıkıştırır (ve daha uzun listeyi kısaltır).

M#eI¬2 öğeli bir listesini (oluşturur esayıları ile) ( #truthy değerleri (kimlik kadar olan) I(mantıksal yoluyla) ve falsy değerleri ¬)


1

Perl 5 , 66 + 1 (-a) = 67 bayt

@A=sort split/ /,<>;$b+=@A?pop@A>$_?-1:1:0for reverse sort@F;say$b

Çevrimiçi deneyin!

Giriş:

İki çizgi. Birinci sıra savunmacı (oyuncu 1), ikinci sıra saldırgan (oyuncu 2). Boşluklarla ayrı ayrı rulolar.

Çıktı:

Savunucuya karşı savunucunun gücünde etkili değişikliği gösterir.

Output Attacker Defender
   2      0        2        Defender wins both
   1      0        1        Defender wins the only roll
   0      1        1        Attacker wins first, defender wins second
  -1      1        0        Attacker wins the only roll
  -2      2        0        Attacker wins both rolls

"Program veya işlev 5 çıkış seçeneğinin her biri için benzersiz bir tanımlayıcı çıkarmalıdır." Sizinki [1, 1] için iki çıktıya sahiptir. Lütfen bunu düzeltmek için cevabınızı düzenleyin (sadece sıralayın veya
toplayın

Altı sorunun ne? Daha spesifik. :) 6 baytlık bir maliyetle değiştirdim.
Xcali


0

R , 46 bayt

function(x,y)s(s(y,T)[1:2]>s(x,T)[1:2])
s=sort

Çevrimiçi deneyin!

Bütün bunlar üç çeşit ve bir karşılaştırma ... artı ortadaki ilk iki elementin çıkarılması.

Girilen zar zarlarının iki vektörüdür.

Çıktı aşağıdaki gibi kodlanmıştır:

╔═══╦═══╗
║atk║def║
╠═══╬═══╣
║ 10TRUE01FALSE20TRUE  TRUE11FALSE TRUE02FALSE FALSE
╚═══╩═══╝

R'de ayıklama argümanını geri dönüştürmediği için çalışır, ancak NAistenen uzunluğa ulaşmak için sonucu doldurur .

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.