9 Ninja'nın Ölümü


12

Sohbetteki bu sohbetten ilham alındı .

Bu meydan okumadaki amacınız bir ninjayı taklit etmek ve kaç ölüm kaldığını saymaktır.

gözlük

Ninja, 9 ölümle başlar. Ayrıca girdi olarak ayrılmaz bir başlangıç ​​sağlığı elde eder.

Daha sonra, hayatında sağlığını değiştiren olayların bir listesini girdi olarak alır. Bunlar negatif, pozitif veya sıfır tamsayı olabilir.

Herhangi bir noktada, sağlığı sıfıra veya altına ulaşırsa, bir hayatı kaybeder ve sağlığı başlangıç ​​sağlığına geri döner.

Programınız bıraktığı ölüm sayısını bildirmelidir. Sıfır veya daha az kaldıysa, çıktı almalısınız dead.

Bu , bayt en kısa kod kazanır!

Test Durumları

3, [] -> 9
100, [-20, 5, -50, 15, -30, -30, 10] -> 8
10, [-10, -10, -10, -10] -> 5
10, [-10, -10, -10, -10, -10, -10, -10, -10, -10] -> dead
0, [] -> dead
0, [1] -> dead
100, [10, -100] -> 9

1
YAŞASIN!!! Sohbet yazım bağlı !!! : P
Rɪᴋᴇʀ

8
Görünüşe göre
beladayım

Yani olayların sırası "<= 0 ise öl, bir sayıyı oku, toplama ekle, tekrarla" mı?
lirtosiast

@ThomasKwa evet, ama ölmek birden çok kez olabilir
Maltysen

1
Ninjalar zaman efendileri gibi yenilenebilir mi? Lütfen?
Ashwin Gupta

Yanıtlar:


8

Jöle , 30 28 26 bayt

»0o⁴+
;@ñ\<1S_9«0N“dead”×?

Çevrimiçi deneyin!

Nasıl çalışır

;@ñ\<1S_9«0N“dead”×?  Main link. Input: e (events), h (initial health)

;@                    Prepend h to e.
  ñ\                  Reduce the resulting array by the next, dyadic link.
                      This returns the array of intermediate results.
    <1                Check each intermediate value for non-positivity.
      S               Sum. This calculates the number of event deaths.
       _9             Subtract 9 from the result.
         «0           Take the minimum of the result and 0. This yields 0 if no
                      lives are left, the negated amount of lives otherwise.
                   ?  Conditional:
                  ×     If the product of the minimum and h is non-zero:
           N              Return the negated minimum.
            “dead”      Else, return "dead".


»0o⁴+                 Dyadic helper link. Arguments: x, y

»0                    Take the maximum of x and 0.
                      This yields x if x > 0 and 0 otherwise.
  o⁴                  Take the logical OR of the result and the second input (h).
    +                 Take the sum of the result and y.

¯_ (ツ) _ / ¯ Dennis kazandı
downrep_nation

7

Japt, 40 39 32 bayt

U¬©(9-Vf@T=X+(T¬²ªU)<1} l)¬²ª`Ü%

Çevrimiçi deneyin!

Nasıl çalışır

Golf için bu son gece çalışırken (uzak bir bilgisayardan, az), ben için ilginç bir değiştirme karşılaştım >0: ¬. Sayılarda, bu, NaNnegatif sayılar için dönen kare kökü alır . NaNbu yanlıştır, yani bu tam olarak aynı / yanlış olarak döner >0.

Öyle iff biraz daha bu hile genişletme, biz U T sıfırlayabilirsiniz >=0sadece beş bayt: T¬²ªU. Bu nasıl çalışıyor? Hadi bir bakalım:

T    ¬      ²       ªU
     sqrt   square  if falsy, set to U (JS's || operator)
4    2      4       4
7   ~2.646  7       7
0    0      0       U
-4   NaN    NaN     U
-7   NaN    NaN     U

Gördüğünüz gibi , negatif ise T¬²döndürür ; aksi halde geri döner . Yana ve her ikisi de falsy vardır, bununla ninja sağlığını sıfırlamak için kolay bir yol sağlar . Bu hile, eğer bu sayı pozitifse veya negatifse ninjanın hayatını geri döndürmek için de kullanılır .NaNTTNaN0ªU"dead"

Hepsini bir araya getirmek:

           // Implicit: U = starting health, V = events, T = 0
U©        // If U is positive,
Vf@     }  // Filter out the items X in V that return truthily from this function:
 T=X+      //  Set T to X plus
 (T¬²ªU)   //   If T is positive, T; otherwise, U.
           //  This keeps a running total of the ninja's health, resetting upon death.
 <1        //  Return (T < 1).
9-    l)   // Take the length of the resulting array and subtract from 9.
           // This returns the number of lives the ninja has left.
¬²         // If the result is negative, set it to NaN.
ª`Ü%       // If the result of EITHER of the two parts above is falsy, return "dead".
           //  (`Ü%` is "dead" compressed.)
           // Otherwise, return the result of the middle part (lives left).
           // Implicit: output last expression

Girişin negatif veya hatta pozitif olduğu garanti edilirse, 1 veya 4 baytlık golf yapabiliriz:

U©(9-Vf@T=X+(T¬²ªU)<1} l)¬²ª`Ü%  // U is non-negative
9-Vf@T=X+(T¬²ªU)<1} l)¬²ª`Ü%     // U is positive

6

JavaScript ES6, 62 60 58 bayt

@ETHproductions sayesinde 4 bayt tasarruf edildi

(a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i,a)|d<1?"dead":d

Çevrimiçi deneyin (Tüm tarayıcılar çalışır)

açıklama

(a,b,    // a = 1st input, b = 2nd input
 d=9)=>  // Lives counter

  (b.reduce((l,i)=>     // Loop through all the health changes
    l+i<1                 // If (health + health change) < 1
    ?(d--,a)              // Decrease life, reset health
    :l+i                  // Return new health
  ,a)                   // Sets starting health to `a`
  ,d<1?        // Lives is less than 1
   "dead":d);  // Output "dead" otherwise lives left

Çalışır mıydı d--&&a, yoksa b.reduce(...)&&d<1?"dead":d?
ETHproductions

mapyener reduceçoğu senaryolarda: (a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i)&&d<1?"dead":d57'dir
ETHproductions

@ETHproductions teşekkürler, iadeler .reduce(...)&&nedeniyle işe yarayacağını sanmıyorum , işe yaramayacak. .reduce0
16:15 de Downgoat

(a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i,a)|d<1?"dead":dBunun yerine çalışır mıydı ?
ETHproductions


2

Haskell, 81 77 75 bayt

p l i h a|l<1="dead"|i<1=p(l-1)h h a|[]<-a=show l|x:y<-a=p l(i+x)h y
p 10 0

Kullanım örneği: p 10 0 100 [-20, 5, -50, 15, -30, -30, 10]->"8"


1

Pyth, 32

 u+?>GZG&=hZQH+E0Q?&Q<Z9-9Z"dead

Önemli bir alan olduğunu unutmayın. Bu muhtemelen en iyi yaklaşım değil, ama akla ilk gelen şeydi. Ninja sağlığına değerler ekleyerek ve bir sayacı artırarak ve sıfıra düştüğünde sağlığı sıfırlayarak girdiyi azaltır. Son değişikliğin ninjayı öldürüp öldürmediğini saymak için listenin sonuna sıfır ekliyoruz ve sonra ninjanın öldüğünü kontrol etmek için biraz kontrol yapıyoruz. Sıfır başlangıç ​​sağlık durumu sabit kodlanmıştır.

Test odası


1

MATL, 32

9yi"@+t0>~?x1-y]]g*wxt0>~?x'dead'

açıklama

9        # push 9
y        # duplicate 2nd value to top (there is none -> get it from input first)
i        # get input and push it

Yığın şimdi şöyle görünür (giriş için 100, [-20, 5, -50, 15, -30, -30, 10]):

100        9        100        [-20, 5, -50, 15, -30, -30, 10]

reload   deaths    health
value    left

Diziyi ve döngüyü aç

"            ]    # loop
 @+               # add to health
   t0>~?    ]     # if health is zero or less
        x1-y      # delete health counter, decrement life counter, reload health

Sağlık sıfırsa, ölüm sayacını sıfıra ayarlayın. İçin özel durum yönetimi initial health = 0.

g        # health to bool
*        # multiply with death counter

Yeniden yükleme değerini yığından silin

wx

Ölüm sayacı sıfır veya daha azsa, silin ve yerine 'ölü' yazdırın.

t0>~?x'dead'

1

TeaScript , 36 34 31 bayt

yR#l+i<1?e─·x:l+i,x);e≥0?e:D`Ü%

JavaScript yanıtıma benzer. son 4 karakter "dead" dizesinin dekompresyonudur.

TeaScript'in çevrimiçi yorumlayıcısı dizi girişini desteklemediğinden, konsolu açmanız ve şunu yazmanız gerekir:

TeaScript( `yR#l+i<1?(e─,x):l+i,x);─e>0?e:D\`Ü%` ,[
  10, [-10, -10, -10, -10]
],{},TEASCRIPT_PROPS);

açıklama

      // Implicit: x = 1st input, y = 2nd input
yR#   // Reduce over 2nd input
  l+i<1?  // If pending health is less then 1
  (e─,x): // then, decrease life counter, reset health
  l+i     // else, modify health
,x);  // Set starting health
─e>0? // Ninja is alive?
e:    // Output lives left
D`Ü%  // Decompress and output "dead"

1

Python 2.7, 82 66 55 106 bayt

-16 bayt için @RikerW sayesinde. :(

-11 baytlık @Maltysen'e teşekkürler. :(

i=input;h=[i()]*9;d=i()
if 0==h[0]:print'dead';exit()
for x in d:
 h[0]+=x
 if h[0]<=0:h=h[1:]
y=len(h)
print['dead',y][y!=0]

Önce health yazın, ardından enter, ardından olayları liste formunda yazın.


0

C # 207

class P{static void Main(string[]a){int h=int.Parse(a[0]),H=h,l=9,i=1;if(a.Length!=1){for(;i<a.Length;i++){H+=int.Parse(a[i]);if(H<=0){l--;H=h;}}}System.Console.Write(h==0?"dead":l<=0?"dead":l.ToString());}}

Girdiyi argüman akışı üzerinden alır. İlk argüman sağlık miktarıdır ve geri kalanı olayların listesidir.

Okunabilir / çözülmemiş versiyon

class Program
{
    static void Main(string[]a)
    {
        int health = int.Parse(a[0]);
        int Health = health;
        int lives = 9;

        if(a.Length!=1)
        {
            for (int i = 1;i < a.Length;i++)
            {
                Health += int.Parse(a[i]);
                if (Health <= 0)
                {
                    lives--;
                    Health = health;
                }
            }
        }

        System.Console.Write(health == 0 ? "dead" : lives <= 0 ? "dead" : lives.ToString());
    }
}

Örnekler:

  • CSharp.exe 3 => 9

  • CSharp.exe 100-20 5-50 15-30 -30 10 => 8

(Psst.) CSharp.exe örnek olarak kullanılan addır. Gerçekte şöyle çağırmalısınız: kare parantez olmadan [program_name.exe] argümanları.

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.