9 Śmierć ninja

12

Zainspirowany rozmową na czacie.

Twoim celem w tym wyzwaniu jest naśladowanie ninja i policzenie liczby jego śmierci.

Okular

Twój ninja zaczyna się od 9 śmierci. Otrzymuje również integralne zdrowie początkowe jako wkład.

Następnie pobiera jako dane wejściowe listę wydarzeń w swoim życiu, które wpływają na jego zdrowie. Mogą to być liczby całkowite ujemne, dodatnie lub zerowe.

W dowolnym momencie, jeśli jego zdrowie osiągnie zero lub mniej, zero życia traci, a jego zdrowie wraca do zdrowia początkowego.

Twój program powinien zgłaszać liczbę śmierci, które pozostawił. Jeśli pozostało mu zero lub mniej, powinieneś wyjść dead.

To jest , więc wygrywa najkrótszy kod w bajtach !

Przypadki testowe

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
źródło
1
TAK !!! Mój post na czacie jest połączony !!! : P
Rɪᴋᴇʀ
8
Wygląda na to, że mam kłopoty ...
NinjaBearMonkey
Tak więc kolejność zdarzeń to „umrzeć, jeśli <= 0, odczytać liczbę, dodać do sumy, powtórzyć”?
lirtosiast
@ThomasKwa tak, ale umieranie może się zdarzyć wiele razy
Maltysen
1
Czy ninja mogą się regenerować jak władcy czasu? Proszę?
Ashwin Gupta

Odpowiedzi:

8

Galaretka , 30 28 26 bajtów

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

Wypróbuj online!

Jak to działa

;@ñ\<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
źródło
¯_ (ツ) _ / ¯ Dennis wygrywa
downrep_nation 12.01.16
7

Japt, 40 39 32 bajty

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

Wypróbuj online!

Jak to działa

Starając się golf tej ostatniej nocy (z dala od komputera, nie mniej), natknąłem się na ciekawą wymianę >0: ¬. W przypadku liczb przyjmuje się pierwiastek kwadratowy, który zwraca NaNliczby ujemne. NaNjest fałszem, więc zwraca dokładnie to samo zgodnie z prawdą / fałszem >0.

Rozszerzenie tej sztuczki trochę dalej, możemy przywrócić do T U wtw to >=0w ciągu zaledwie pięciu bajtów: T¬²ªU. Jak to działa? Spójrzmy:

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

Jak widać, T¬²zwraca, NaNjeśli Tjest ujemne; w przeciwnym razie zwraca T. Ponieważ NaNi 0oba są fałszywe, zapewnia to łatwy sposób na zresetowanie zdrowia ninja ªU. Ta sztuczka służy również do przywrócenia życia ninja, jeśli liczba ta jest dodatnia lub "dead"ujemna.

Składając to wszystko razem:

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

Jeśli wejściowe jest gwarantowane jako nieujemne, a nawet dodatnie, możemy zagrać w golfa o 1 lub 4 bajtach:

U©(9-Vf@T=X+(T¬²ªU)<1} l)¬²ª`Ü%  // U is non-negative
9-Vf@T=X+(T¬²ªU)<1} l)¬²ª`Ü%     // U is positive
ETHprodukcje
źródło
6

JavaScript ES6, 62 60 58 bajtów

Zaoszczędź 4 bajty dzięki @ETHproductions

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

Wypróbuj online (działają wszystkie przeglądarki)

Wyjaśnienie

(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
źródło
Czy d--&&azadziała, czy b.reduce(...)&&d<1?"dead":d?
ETHproductions
mapbije reducew większości scenariuszy: (a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i)&&d<1?"dead":djest 57.
ETHprodukcje
@ETHproductions dzięki, nie sądzę, .reduce(...)&&by działało ze względu na .reducezwroty 0, nie zadziała.
Downgoat,
Czy (a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i,a)|d<1?"dead":dzamiast tego zadziałałoby?
ETHproductions
4

CJam, 35 bajtów

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

Wypróbuj online!

Dennis
źródło
2

Haskell, 81 77 75 bajtów

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

Przykład użycia: p 10 0 100 [-20, 5, -50, 15, -30, -30, 10]->"8"

nimi
źródło
1

Pyth, 32

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

Zauważ, że jest wiodąca przestrzeń. To prawdopodobnie nie jest najlepsze podejście, ale była to pierwsza rzecz, jaka przyszła mi do głowy. Zmniejsza nadwyżkę danych wejściowych, dodając wartości do zdrowia ninja, zwiększając licznik i resetując zdrowie, gdy spadnie poniżej zera. Dodajemy zero na końcu listy, aby policzyć, czy ostatnia zmiana zabije ninja, a następnie po prostu sprawdź, czy ninja nie żyje. Zerowy przypadek zdrowia jest zakodowany na stałe.

Pakiet testowy

FryAmTheEggman
źródło
1

MATL, 32

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

Wyjaśnienie

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

Stos wygląda teraz tak (dla danych wejściowych 100, [-20, 5, -50, 15, -30, -30, 10]):

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

reload   deaths    health
value    left

Pop tablicę i pętlę

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

Jeśli zdrowie wynosi zero, ustaw licznik śmierci na zero. Specjalna obsługa skrzynek dla initial health = 0.

g        # health to bool
*        # multiply with death counter

Usuń wartość przeładowania ze stosu

wx

Jeśli licznik śmierci wynosi zero lub mniej, usuń go i wydrukuj „martwy”.

t0>~?x'dead'
Rainer P.
źródło
1

TeaScript , 36 34 31 bajtów

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

Podobna do mojej odpowiedzi JavaScript. ostatnie 4 znaki to dekompresja ciągu „martwy”.

Internetowy interpreter TeaScript nie obsługuje wprowadzania danych z tablicy, więc musisz otworzyć konsolę i uruchomić ją, wpisując:

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

Wyjaśnienie

      // 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
źródło
1

Python 2.7, 82 66 55 106 bajtów

Dzięki @RikerW za -16 bajtów. :(

Dzięki @Maltysen za -11 bajtów. :(

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]

Najpierw wpisz zdrowie, następnie wpisz, a następnie zdarzenia w formie listy.

Alex
źródło
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());}}

Pobiera dane wejściowe za pośrednictwem strumienia argumentów. Pierwszym argumentem jest ilość zdrowia, a cała reszta to lista zdarzeń.

Wersja do odczytu / bez golfa

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

Przykłady:

  • CSharp.exe 3 => 9

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

(Psst.) CSharp.exe to nazwa użyta jako przykład. W rzeczywistości musisz wywoływać takie argumenty: [nazwa_programu.exe] bez kwadratowych nawiasów.

Yytsi
źródło