Advent Challenge 2: Mevcut Kasa Baskını!


9

<< Önceki Sonraki >>

Meydan okuma

Artık Noel Baba nihayet mevcut kasasına nasıl gireceğini anladı, elflerin bir şekilde önüne geçtiğini ve bazı hediyelerini çaldığını fark etti! Ancak kasadan nasıl ayrılacağını henüz çözemediler, bu yüzden Noel Baba hepsini yakalamaya çalışıyor. Noel Baba ve elflerin her ikisi de koşmak için sonsuz enerjiye sahipler, ancak ne yazık ki elfler daha yüksek bir enerji sonsuzluğuna sahipler, bu yüzden her yerde döngülere koşarlarsa elfler özgürleşti.

Herhangi bir iki düğüm arasında bir yürüyüş bulunan ndüğümlerin ve ekenarların bir grafiği ve elflerin ve Noel Baba'nın pozisyonları göz önüne alındığında , Santa'nın yorulmadan önce kaç elf yakalayabileceğini belirleyin.

Kovalamaca sıra tabanlı. Her döngü, elflerin hepsi aynı anda hareket ederler (birbirleri boyunca ve aynı düğüme de hareket edebilirler) ve sonra Noel Baba hareket edecektir. Noel Baba bir elf ile aynı düğüme ilerlerse, o elf'i yakaladı. Her elf bir adımda sadece bir düğümden komşusuna hareket edebilir. Aynı şey başlangıçta Noel Baba için de geçerli, ancak yakaladığı her elf için Noel Baba bir adım daha atabilir. Yani, eğer Noel Baba bir elf yakaladıysa, bir düğümden komşusunun komşusuna geçebilir. Bu, bir düğüme gidip sonra geri gidebileceği anlamına gelir. Bununla birlikte, Noel Baba bu süre zarfında çok hızlı koştuğu için, ara adımlarda geçen hiçbir elfleri yakalamayacaktır (bu yüzden A'da A, A B'ye bağlı, B C'ye bağlı, bir elf var B ve Santa A -> B -> C'den hareket eder, elf henüz yakalanmamıştır). Ancak, Noel Baba'nın bu kadar çok adımı aynı anda taşıması gerekmez; her turda 1 + 'ya (yakalanan elf sayısı) kadar hareket eder.

Tüm elflerin her turu hareket ettirmesi gerektiğini ve bir elf Noel Baba'nın düğümüne hareket ederse yakalandıklarını unutmayın.

Tüm varlıklar (elfler, Noel Baba) başlangıçta farklı düğümlerde olacak.

Özellikler ve Kurallar

Programınız teorik olarak her boyutta girdi için çalışmalıdır. Giriş bir grafik, elflerin pozisyonları ve Noel Baba'nın pozisyonu olarak verilecektir. Grafiği makul bir biçimde (düğüm listesi + kenar listesi, kenar listesi, bitişiklik matrisi, çevrim gösterimi vb.) Alabilir ve konumları grafik giriş biçiminizle (dizinle) çalışan herhangi bir makul biçimde alabilirsiniz. düğümler vb. listesinde). Çıktı, Noel Baba'nın yakalayabileceği maksimum elf sayısını gösteren tek bir pozitif tam sayı olmalıdır.

Test Durumları

Bunlar konumlar için kenar listesi ve düğüm numaraları olarak verilmiştir.

Input -> Output
[(0, 1), (1, 2)], [0, 2], 1 -> 2 # Easy win for Santa, the elves get themselves caught :P
[(0, 1), (1, 2), (2, 3), (3, 0)], [0, 1], 2 -> 2 # The elf opposite of Santa cannot escape but the other one can always just run away each turn, until Santa catches the first elf. Then he can easily just catch the rest.
[(0, 1), (1, 2), (2, 3), (3, 0)], [1], 0 -> 0 # Santa will never catch up
[(0, 1), (1, 2), (2, 3), (3, 0), (1, 4), (4, 5), ..., (10, 11), (11, 3)], [2, 6], 0 -> 2 # The first elf moves to either 1 or 3 and then gets caught. Then, Santa can use his 2-step move to catch up to the second elf no matter what.

Sanırım Santa ya elfleri ya da tüm elfleri yakalayamaz, bu yüzden bu meydan okuma sadece "bir elf yakalayabilir mi" ipucu olabilir

kurallar

  • Standart Loopholes Uygula
  • Bu bir yani bayt cinsinden en kısa cevap kazanır
  • Hiçbir cevap kabul edilmeyecek

Mutlu Golf!

Not: Advent Of Code'dan bu meydan okuma serisi için ilham aldım . Bu siteyle hiçbir bağlantım yok

Buradaki ilk zorluğun 'Bağlantılı' bölümüne bakarak dizideki tüm zorlukların bir listesini görebilirsiniz .


1
Keşke Noel Baba'nın elflerinin daha önce kötü olduğunu bilmem ...
Bay Xcoder

Bunu çözme yaklaşımı muhtemelen şöyle olacaktır: 1Bazı matematiksel ifadeleri kanıtlayın. 210 byte'tan daha kısa sürede bir Jelly (/ ...) cevabı gönderin.
user202729

Peki, Santa'nın tüm elfleri değil ama bazılarını yakalayabilmesi mümkündür (bazı elflerin Noel Baba'nın pozisyonunda başlaması mümkündür ve elflerin Noel Baba'nın gönüllü olarak yakalamasına izin vermek mümkün mü?)
user202729

Düzenleme: İlk soru için hayır, ancak muhtemelen ikinci soru için.
user202729

3
@ user202729 Noel Baba'nın 3 boşluk taşımak zorunda olmadığını unutmayın; 1-3 boşluk arasında herhangi bir yere taşınabilir. Bu karışıklığın kaynağı olabilir.
HyperNeutrino

Yanıtlar:


1

Wolfram Dili (Mathematica) , 129 bayt

Block[{a=#},Clear@f;s_~f~e_:=If[s==e,1,s~f~e=0;s~f~e=Min[(hMax[#~f~h&/@a@s,Boole[h==s]])/@a@e]];Tr[Max[(e#3~f~e)/@#2]^#2]]&

Çevrimiçi deneyin!

Bu soruya verdiğim cevaba benzer yaklaşım .

İşlev giriş olarak 3 bağımsız değişken alır: ilişkilendirme olarak temsil edilen bitişiklik listesi (kenar listesinden bitişiklik listesi oluşturma aracı ), elfler konumu ve santa konumu.

Clear[f]Gerekli olduğunu unutmayın , çünkü işlev gönderimleri yeniden kullanılabilir olmalıdır.

Aşağıdaki kod, kısmi açıklama ile çözülmemiş koddur. Daha sonra daha fazla açıklama.

reverseBoole = # != 0 &

(* Or@@{a, b} === reverseBoole[booleOr[Boole[{a, b}]]] *)
booleOr = Max

booleAnd = Min

(* Boole@f[s, e] = Santa can catch Elf ? *)

mainfunc = Block[{adjlist = #},
  Clear[f];
  f[s_, e_] := If[ s == e, f[s, e] = 1,
    f[s, e] = Boole[False];
    f[s, e] = booleAnd[
      (e1  booleOr[
        ( s1  f[s1, e1] ) /@ adjlist[s],
        Boole[e1 == s]
      ]) /@ adjlist[e]
    ]
  ];
  If [ 0 == booleOr[ ( e  f[#3, e] ) /@ #2 ] , 0, Length[#2] ]
]&

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.