Bir minimax ağacını değerlendirin


16

Alice ve Bob küçük bir oyun oynuyorlar. İlk olarak, iç düğümleri olmayan, yapraklarda sayılarla bir kök düğümden (kalın bir nokta ile gösterilir) bir ağaç çizerler. Herhangi bir düğümde çok sayıda çocuk olabilir.

ağaç

Kökten başlıyoruz ve ilk oynayan Alice (A). Mevcut düğümün çocuklarından birini seçmesi gerekiyor. Sonra Bob'un sırası geldi ve benzer şekilde bir çocuk düğümü seçti. Bu, bir yaprak düğüme ulaşılana kadar devam eder.

Bir yaprak düğüme ulaşıldığında oyun sona erer. Alice'in hedefi olabildiğince büyük bir değere sahip bir düğümde bitirmek ve Bob'un amacı mümkün olduğunca küçük bir değere sahip bir düğümde bitirmek.

Yuvalanmış dizi biçiminde bir ağaç verildiğinde, hem Alice hem de Bob mükemmel oynarsa ulaşılacak yaprağın değerini döndürür.


Örnekler:

18: [[67, [[100, [[67, 47], [86], 21, 16], [[46, [14], 35, 85], [71, [18, 63, 69], 99, 22], 3]]], [[18, 32, 42, 80]], [[36, 70], [86, 53, 46, 59], [[41], 86, 35]]], 3]
60: [[[84, 35], [44, 60]], [[24, 98], [16, 21]]]
58: [[53, 77], [58, [82, 41]], 52]
59: [[93, [100, 53], 58, 79], [63, 94, 59], [9, [55, 48]], [40, 10, 32]]
56: [[20, 10, [[[89, 22, 77, 10], 55], [24, 28, 30, 63]]], [[49, 31]], 17, 56]
0: [0]

Kök düğümün hiçbir zaman bir yaprak düğüm olmadığını ve en az bir yaprak düğümünü gösterdiğini varsayabilirsiniz. Yaprakların negatif olmayan sayılar olduğunu varsayabilirsiniz.


Bayt cinsinden en kısa kod kazanır.


Yanıtlar:


2

Jöle , 7 bayt

N߀¬¡ṂN

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Bu, @ xnor cevabındaki algoritmayı kullanır . Karşılaştırma amacıyla, alternatif olarak minima ve maxima'yı hesaplayan daha basit bir yaklaşım 8 bayt ağırlığındadır :

߀¬¡€Ṃ€Ṁ

Nasıl çalışır

N߀¬¡ṂN  Main link. Argument: x (array or integer)

N        Negate. For an array, this negates all integers in it.
   ¬     Logical NOT. For an array, this applies to all integers in it.
    ¡    Apply the second link to the left once if ¬ returned an array or 1, or not
         at all if it returned 0.
 ߀      Recursively call the main link on all elements at depth 1 of -x.
         If -x == 0, € will cast 0 to range before mapping ß over it. 
         Since the range of 0 is [], mapping ß over it simply yields [].
     Ṃ   Minimum.
         For an integer, Ṃ simply returns the integer. For [], Ṃ returns 0.
      N  Negate the minimum.

8

Python 2, 53 bayt

f=lambda l,c=1:c*l if l<[]else-min(f(x,-c)for x in l)

Ana soru maxve minher katman arasında nasıl dönüşüm yapılacağıdır . Bunu kullanarak, max(l) == -min([-x for x in l])her ikinci katmanı reddediyoruz ve geri çekiyoruz -min. Her ikinci katmanı reddetmek için c, dönüşümlü bir çarpan geçiririz +1ve -1bir yaprağa ulaştığımızda değerini çarpanla ayarlarız. l<[]Python 2, sayıları listelerden daha az olarak ele aldığından , koşul aracılığıyla bir yaprakta olduğunun farkındayız .

else/ifÜçgeni kısaltmak zordur, çünkü her iki dal bir Gerçek (sıfır olmayan) veya Falsey (sıfır) değeri verebilir.


1

JavaScript (ES6), 53 bayt

f=(a,s=1)=>a.map?s*Math.max(...a.map(b=>s*f(b,-s))):a

@ Xnor cevabına benzer bir yaklaşım kullanır. Sayılar sıfırdan farklıysa, yalnızca 49 bayt:

f=(a,s=1)=>+a||s*Math.max(...a.map(b=>s*f(b,-s)))

1

Pyth, 21 bayt

M?sIG*GH_hSmgd_HGLgb1

İlk Pyth cevabım! Yardım için Dennis'e teşekkürler :).

M                      # define a binary function (G, H)
 ?sIG                  # if G (first argument) is the same with s applied
                       # (check if it's an integer, so, a leaf node)
     *GH               # in such a case, calculate G*H
        _              # negation
         hS            # take the first element of the sorted list (that's the min)
           mgd_HG      # map over G, applying ourself (g) recursively,
                       # with the current lambda's value (d)
                       # and the negation of H
                 Lgb1  # Define a unary function to call our previous
                       # one with the correct base argument (1)

Bu harita için daha kısa bir sözdizimi var: mgd_Holabilir gR_H. Ayrıca, bir işlev tanımlamak yerine girdi alabilir Qve Lgb1onunla değiştirebilirsiniz gQ1.
lirtosiast

1

Mathematica, 13 bayt

-Min[#0/@-#]&

Veya eşdeğer olarak

Max[-#0/@-#]&

Bu, ağacı alan ve sonucu döndüren adsız bir işlev olarak değerlendirilir.

Bu aynı zamanda xnor'ın çözümü ile aynıdır: her seviyede listenin ve sonucun işaretini değiştiririz ve Minsonuna kadar kullanırız . Bu Mathematica'da inanılmaz derecede golfçü ortaya çıktı, çünkü:

  • Mintek tek numaralar veya listeler veya hatta birkaç liste alabilir. Sadece tüm argümanlarında minimum değeri verir. Bu, hem listelerde hem de yapraklarda (sadece yaprağı döndürdüğü yerde) çalıştığı anlamına gelir.
  • /@ ki bunun için kısadır Map Mathematica'da çok genel bir üst düzey işlevdir. Sadece bir işlevi listeler üzerinde eşlemekle kalmaz, aynı zamanda herhangi bir ifade üzerinde eşleyebilir. Sayılar böyle bir ifadedir, ancak eşlenecek öğe içermezler. Bu, herhangi bir işlevi sayılar üzerinde güvenle eşleştirebileceğimiz anlamına gelir, bu da sayıyı hiç etkilemez.

Bu iki şey birlikte, kodu koşulsuz olarak yazabileceğimiz anlamına gelir, çünkü MinveMap işlemleri sayılar üzerinde işlem yapılmaz ve daha sonra iki olumsuzlama iptal edilir, böylece işlev bir sayı verildiğinde kimlik haline gelir.

Son olarak, sayesinde#0 o birkaç bayt kaydeder Mathematica, içinde adsız özyinelemeli fonksiyonlar yazmak mümkündür.


0

Yakut, 46 bayt

minMax ve min arasında geçiş yapmak için @ xnor'ın hilesi kullanılır .

f=->n,a=1{n==[*n]?-n.map{|c|f[c,-a]}.min: a*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.