9 Todesfälle der Ninja

12

Inspiriert von diesem Gespräch im Chat.

Ihr Ziel bei dieser Herausforderung ist es, einen Ninja zu emulieren und zu zählen, wie viele Todesfälle er noch hat.

Technische Daten

Ihr Ninja beginnt mit 9 Toten. Er erhält auch eine integrale Startgesundheit als Input.

Dann nimmt er eine Liste von Ereignissen in seinem Leben als Eingabe, die seine Gesundheit verändern. Dies können negative, positive oder ganze Zahlen von Null sein.

Zu jedem Zeitpunkt, wenn sein Gesundheitszustand auf oder unter Null sinkt, verliert er ein Leben und sein Gesundheitszustand kehrt zum Ausgangszustand zurück.

Ihr Programm sollte die Anzahl der Todesfälle anzeigen, die er hinterlassen hat. Wenn er null oder weniger übrig hat, sollten Sie deadstattdessen ausgeben .

Das ist , also gewinnt der kürzeste Code in Bytes !

Testfälle

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
quelle
1
YAY!!! Mein Chatpost ist verlinkt !!! : P
Rɪᴋᴇʀ
8
Sieht aus wie ich in Schwierigkeiten bin ...
NinjaBearMonkey
Die Reihenfolge der Ereignisse lautet also "sterben, wenn <= 0, eine Zahl lesen, addieren, wiederholen"?
Lirtosiast
@ ThomasKwa ja, aber das Sterben kann mehrfach passieren
Maltysen
1
Können sich Ninjas wie Zeitlords regenerieren? Bitte?
Ashwin Gupta

Antworten:

8

Jelly , 30 28 26 Bytes

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

Probieren Sie es online!

Wie es funktioniert

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

Japt, 40 39 32 Bytes

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

Probieren Sie es online!

Wie es funktioniert

Während diese letzte Nacht zum Golf versuchen (weg von einem Computer, nicht weniger), lief ich auf einen interessanten Ersatz für >0: ¬. Für Zahlen wird die Quadratwurzel verwendet, die NaNfür negative Zahlen zurückgegeben wird. NaNist falsch, so dass dies genau das Gleiche wie wahrheitsgemäß / falsch zurückgibt >0.

Die Ausweitung dieser Trick etwas weiter, können wir T U zurückgesetzt iff es ist >=0in nur fünf Bytes: T¬²ªU. Wie funktioniert das? Lass uns einen Blick darauf werfen:

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

Wie Sie sehen, wird T¬²zurückgegeben, NaNwenn Tnegativ ist. Andernfalls wird es zurückgegeben T. Da NaNund 0sind beide falsch, bietet dies eine einfache Möglichkeit, die Gesundheit des Ninja mit zurückzusetzen ªU. Dieser Trick wird auch verwendet, um die verbleibenden Leben der Ninja zurückzugeben, wenn diese Zahl positiv oder "dead"negativ ist.

Alles zusammen:

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

Wenn die Eingabe garantiert nicht negativ oder sogar positiv ist, können wir 1 oder 4 Bytes Golf spielen:

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

JavaScript ES6, 62 60 58 Bytes

4 Bytes gespart dank @ETHproductions

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

Online ausprobieren (Alle Browser funktionieren)

Erläuterung

(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
quelle
Würde d--&&afunktionieren, oder b.reduce(...)&&d<1?"dead":d?
ETHproductions
mapSchläge reducein den meisten Szenarien: (a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i)&&d<1?"dead":dist 57.
ETHproductions
@ETHproductions danke, ich glaube nicht, dass .reduce(...)&&es aufgrund von .reduceRücksendungen funktionieren würde 0, es wird nicht funktionieren.
Downgoat
Würde es (a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i,a)|d<1?"dead":dstattdessen funktionieren?
ETHproductions
2

Haskell, 81 77 75 Bytes

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

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

nimi
quelle
1

Pyth, 32

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

Beachten Sie, dass ein führendes Leerzeichen vorhanden ist. Dies ist wahrscheinlich nicht der beste Ansatz, aber es war das erste, was mir in den Sinn kam. Die Eingabe wird reduziert, indem die Werte zum Gesundheitszustand des Ninjas addiert werden und ein Zähler erhöht und der Gesundheitszustand zurückgesetzt wird, wenn er unter Null fällt. Wir fügen am Ende der Liste eine Null hinzu, um zu zählen, ob die letzte Änderung den Ninja tötet, und prüfen dann, ob der Ninja tot ist. Der Null-Start-Gesundheitsfall ist fest codiert.

Test Suite

FryAmTheEggman
quelle
1

MATL, 32

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

Erläuterung

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

Der Stack sieht jetzt so aus (für die Eingabe 100, [-20, 5, -50, 15, -30, -30, 10]):

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

reload   deaths    health
value    left

Pop das Array und die Schleife

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

Wenn der Gesundheitszustand Null ist, setzen Sie den Todeszähler auf Null. Sonderfallbearbeitung für initial health = 0.

g        # health to bool
*        # multiply with death counter

Löschen Sie den Reload-Wert vom Stack

wx

Wenn der Todeszähler Null oder weniger ist, löschen Sie ihn und drucken Sie stattdessen "tot".

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

TeaScript , 36 34 31 Bytes

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

Ähnlich wie bei meiner JavaScript-Antwort. Die letzten 4 Zeichen sind die Dekomprimierung der Zeichenfolge "dead".

Der Online-Interpreter von TeaScript unterstützt keine Array-Eingaben, daher müssen Sie die Konsole öffnen und Folgendes eingeben:

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

Erläuterung

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

Python 2.7, 82 66 55 106 Bytes

Danke an @RikerW für -16 Bytes. :(

Vielen Dank an @Maltysen für -11 Bytes. :(

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]

Geben Sie zuerst health, dann enter und dann events in Listenform ein.

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

Übernimmt die Eingabe durch den Argumentstrom. Das erste Argument ist die Menge an Gesundheit und der Rest ist die Liste der Ereignisse.

Lesbare / unbenutzte Version

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

Beispiele:

  • CSharp.exe 3 => 9

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

(Psst.) CSharp.exe ist der Name, der als Beispiel verwendet wird. In der Realität müssen Sie folgendermaßen vorgehen: [program_name.exe] Argumente ohne die eckigen Klammern.

Yytsi
quelle