9 Kematian Ninja

12

Terinspirasi oleh percakapan ini dalam obrolan.

Tujuan Anda dalam tantangan ini adalah untuk meniru seorang ninja dan menghitung berapa banyak kematian yang tersisa.

Spesifikasi

Ninja Anda dimulai dengan 9 kematian tersisa. Dia juga mendapatkan kesehatan awal yang integral sebagai input.

Kemudian, ia mengambil sebagai masukan daftar peristiwa dalam hidupnya yang mengubah kesehatannya. Ini bisa negatif, positif, atau nol bilangan bulat.

Pada titik mana pun, jika kesehatannya mencapai atau di bawah nol, ia kehilangan nyawa dan kesehatannya kembali ke kesehatan awal.

Program Anda harus melaporkan jumlah kematian yang ditinggalkannya. Jika dia memiliki nol atau kurang tersisa, Anda harus output deadsaja.

Ini adalah , jadi kode terpendek dalam byte menang!

Uji Kasus

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
Maltysen
sumber
1
YAY !!! Kiriman obrolan saya ditautkan !!! : P
R
8
Sepertinya saya dalam kesulitan ...
NinjaBearMonkey
Jadi urutan kejadiannya adalah "mati jika <= 0, baca angka, tambah total, ulangi"?
lirtosiast
@ThomasKwa ya, tapi sekarat bisa terjadi beberapa kali
Maltysen
1
Bisakah ninja beregenerasi seperti penguasa waktu? Silahkan?
Ashwin Gupta

Jawaban:

8

Jelly , 30 28 26 byte

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

Cobalah online!

Bagaimana itu bekerja

;@ñ\<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
sumber
¯_ (ツ) _ / ¯ Dennis menang
downrep_nation
7

Japt, 40 39 32 byte

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

Cobalah online!

Bagaimana itu bekerja

Ketika mencoba untuk golf malam terakhir ini (jauh dari komputer, tidak kurang), aku berlari melintasi pengganti yang menarik untuk >0: ¬. Pada angka, ini mengambil akar kuadrat, yang mengembalikan NaNuntuk angka negatif. NaNadalah falsy, jadi ini mengembalikan persis sama dengan jujur ​​/ salah >0.

Memperluas trik ini sedikit lebih jauh, kita dapat mengatur ulang T untuk U IFF itu >=0hanya lima bytes: T¬²ªU. Bagaimana cara kerjanya? Mari lihat:

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

Seperti yang Anda lihat, T¬²kembali NaNjika Tnegatif; jika tidak, ia kembali T. Karena NaNdan 0keduanya palsu, ini memberikan cara mudah untuk mengatur ulang kesehatan ninja ªU. Trik ini juga digunakan untuk mengembalikan nyawa ninja yang tersisa jika angka itu positif, atau "dead"jika negatif.

Menyatukan semua ini:

           // 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

Jika input dijamin non-negatif, atau bahkan positif, kita dapat bermain golf 1 atau 4 byte:

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

JavaScript ES6, 62 60 58 byte

Disimpan 4 byte berkat produk @ETH

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

Coba online (Semua browser berfungsi)

Penjelasan

(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
Downgoat
sumber
Apakah akan d--&&aberhasil, atau b.reduce(...)&&d<1?"dead":d?
ETHproduk
mapmengalahkan reducedalam sebagian besar skenario: (a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i)&&d<1?"dead":dadalah 57.
ETHproduk
@ ETHproductions terima kasih, saya tidak berpikir .reduce(...)&&akan berhasil karena .reducepengembalian 0, itu tidak akan berhasil.
Downgoat
Apakah akan (a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i,a)|d<1?"dead":dberhasil?
ETHproduk
4

CJam, 35 byte

q~_@{+_1<{W$}&}/](\,_A<@*A@-"dead"?

Cobalah online!

Dennis
sumber
2

Haskell, 81 77 75 byte

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

Contoh penggunaan: p 10 0 100 [-20, 5, -50, 15, -30, -30, 10]->"8"

nimi
sumber
1

Pyth, 32

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

Perhatikan bahwa ada ruang terdepan. Ini mungkin bukan pendekatan terbaik, tetapi itu adalah hal pertama yang terlintas di benak saya. Ini mengurangi input berlebih dengan menambahkan nilai-nilai untuk kesehatan ninja, dan menambah penghitung dan mengatur ulang kesehatan ketika turun di bawah nol. Kami menambahkan nol di akhir daftar untuk menghitung jika perubahan terakhir membunuh ninja, dan kemudian hanya melakukan pengecekan untuk melihat apakah ninja sudah mati. Kasus nol kesehatan awal sulit dikodekan.

Test Suite

FryAmTheEggman
sumber
1

MATL, 32

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

Penjelasan

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

Tumpukan sekarang terlihat seperti ini (untuk input 100, [-20, 5, -50, 15, -30, -30, 10]):

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

reload   deaths    health
value    left

Pop array dan loop

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

Jika kesehatannya nol, atur penghitung kematian ke nol. Penanganan kasus khusus untuk initial health = 0.

g        # health to bool
*        # multiply with death counter

Hapus nilai reload dari stack

wx

Jika penghitung kematian nol atau kurang, hapus dan cetak 'mati' sebagai gantinya.

t0>~?x'dead'
Rainer P.
sumber
1

TeaScript , 36 34 31 byte

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

Mirip dengan jawaban JavaScript saya. 4 karakter terakhir adalah dekompresi string "mati".

Interpreter online TeaScript tidak mendukung input array sehingga Anda harus membuka konsol, dan menjalankannya dengan mengetik:

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

Penjelasan

      // 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"
Downgoat
sumber
1

Python 2.7, 82 66 55 106 byte

Terima kasih kepada @RikerW untuk -16 byte. :(

Berkat @Maltysen untuk -11 byte. :(

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]

Pertama-tama ketik kesehatan, lalu masuk, lalu acara dalam bentuk daftar.

Alex
sumber
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());}}

Mengambil input melalui aliran argumen. Argumen pertama adalah jumlah kesehatan dan sisanya adalah daftar kejadian.

Versi yang dapat dibaca / tidak diklik

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());
    }
}

Contoh:

  • CSharp.exe 3 => 9

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

(Psst.) CSharp.exe adalah nama yang digunakan sebagai contoh. Anda harus memanggil seperti ini dalam kenyataan: [program_name.exe] argumen, tanpa tanda kurung.

Yytsi
sumber