9 ความตายของนินจา


12

แรงบันดาลใจจากบทสนทนานี้ในการแชท

เป้าหมายของคุณในการท้าทายนี้คือเลียนแบบนินจาและนับจำนวนผู้เสียชีวิตที่เหลืออยู่

รายละเอียด

นินจาของคุณเริ่มต้นด้วยการเสียชีวิต 9 ครั้ง นอกจากนี้เขายังได้รับสุขภาพเริ่มต้นที่สำคัญเป็นอินพุต

จากนั้นเขารับข้อมูลรายการเหตุการณ์ในชีวิตที่เปลี่ยนแปลงสุขภาพของเขา สิ่งเหล่านี้อาจเป็นจำนวนเต็มบวกลบหรือศูนย์

ณ จุดใดก็ตามหากสุขภาพของเขาถึงหรือต่ำกว่าศูนย์เขาสูญเสียชีวิตและสุขภาพของเขากลับไปที่สุขภาพเริ่มต้น

โปรแกรมของคุณควรรายงานจำนวนผู้เสียชีวิตที่เหลืออยู่ หากเขาเหลือศูนย์หรือน้อยกว่าคุณควรเอาท์พุทdeadแทน

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

กรณีทดสอบ

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
เย้!!! โพสต์แชทของฉันมีการเชื่อมโยง !!! : P
Rɪᴋᴇʀ

8
ดูเหมือนว่าฉันกำลังมีปัญหา ...
NinjaBearMonkey

ดังนั้นลำดับเหตุการณ์คือ "ตายถ้า <= 0, อ่านตัวเลข, เพิ่มเป็นผลรวม, ทำซ้ำ"?
lirtosiast

@ThomasKwa ใช่ แต่การตายสามารถเกิดขึ้นได้หลายครั้ง
Maltysen

1
นินจาสามารถสร้างใหม่เหมือนขุนนางเวลาได้หรือไม่? โปรด?
Ashwin Gupta

คำตอบ:


8

เจลลี่ , 30 28 26 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

;@ñ\<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.

¯_ (ツ) _ / ¯เดนนิสชนะ
downrep_nation

7

Japtap, 40 39 32 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

ขณะที่พยายามจะมีสนามกอล์ฟนี้คืนที่ผ่านมา (ห่างจากคอมพิวเตอร์ไม่น้อย) ผมวิ่งข้ามทดแทนที่น่าสนใจสำหรับ:>0 ¬ในตัวเลขนี่จะใช้สแควร์รูทซึ่งจะคืนค่าNaNสำหรับจำนวนลบ NaNเป็น falsy ดังนั้นผลตอบแทนนี้ว่า truthily เดียวกัน / falsily >0เป็น

ขยายเคล็ดลับเล็ก ๆ น้อย ๆ นี้ต่อไปเราสามารถตั้งค่า T เพื่อ U IFF มันเป็นเพียงห้าไบต์:>=0 T¬²ªUมันทำงานอย่างไร ลองดู:

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

อย่างที่คุณเห็นT¬²ผลตอบแทนNaNถ้าTเป็นลบ Tมิฉะนั้นก็จะส่งกลับ ตั้งแต่NaNและ0มีทั้ง falsy ªUนี้มีวิธีที่ง่ายในการรีเซ็ตสุขภาพของนินจาที่มี เคล็ดลับนี้ยังใช้เพื่อคืนค่าชีวิตของนินจาที่เหลือหากจำนวนนั้นเป็นค่าบวกหรือ"dead"ลบ

นำสิ่งนี้มารวมกัน:

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

หากข้อมูลเข้ามีการรับประกันว่าจะไม่เป็นลบหรือเป็นบวกเราสามารถเล่นกอล์ฟขนาด 1 หรือ 4 ไบต์:

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 ไบต์

บันทึกแล้ว 4 ไบต์ด้วย @ETHproductions

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

ลองออนไลน์ (เบราว์เซอร์ทั้งหมดใช้งานได้)

คำอธิบาย

(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

จะd--&&aทำงานหรือb.reduce(...)&&d<1?"dead":d?
ETHproductions

mapการเต้นreduceในสถานการณ์ส่วนใหญ่(a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i)&&d<1?"dead":dคือ 57.
ETHproductions

@ ETHproductions ขอบคุณฉันไม่คิดว่า.reduce(...)&&จะทำงานได้เพราะ.reduceผลตอบแทน0มันไม่ทำงาน
Downgoat

จะ(a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i,a)|d<1?"dead":dทำงานแทนไหม
ETHproductions


2

Haskell, 81 77 75 ไบต์

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

ตัวอย่างการใช้: p 10 0 100 [-20, 5, -50, 15, -30, -30, 10]->"8"


1

Pyth, 32

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

โปรดทราบว่ามีพื้นที่ชั้นนำ นี่อาจไม่ใช่วิธีที่ดีที่สุด แต่เป็นสิ่งแรกที่นึกถึง จะช่วยลดการป้อนข้อมูลมากกว่าโดยการเพิ่มค่าให้กับสุขภาพของนินจาและเพิ่มเคาน์เตอร์และรีเซ็ตสุขภาพเมื่อมันลดลงต่ำกว่าศูนย์ เราเพิ่มศูนย์ลงที่ส่วนท้ายของรายการเพื่อนับว่าการเปลี่ยนแปลงครั้งสุดท้ายฆ่านินจาแล้วทำการตรวจสอบเพื่อดูว่านินจาตายหรือไม่ กรณีสุขภาพเริ่มต้นที่ศูนย์มีการเข้ารหัสอย่างหนัก

ชุดทดสอบ


1

MATL, 32

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

คำอธิบาย

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

ตอนนี้สแต็กมีลักษณะดังนี้ (สำหรับอินพุต100, [-20, 5, -50, 15, -30, -30, 10]):

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

reload   deaths    health
value    left

ป๊อปอาเรย์และวง

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

หากสุขภาพเป็นศูนย์ให้ตั้งค่าตัวนับความตายเป็นศูนย์ initial health = 0การจัดการกรณีพิเศษสำหรับ

g        # health to bool
*        # multiply with death counter

ลบค่าการโหลดซ้ำจากสแต็ก

wx

หากตัวนับความตายเป็นศูนย์หรือน้อยกว่าให้ลบออกและพิมพ์ 'ความตาย' แทน

t0>~?x'dead'

1

TeaScript , 36 34 31 ไบต์

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

คล้ายกับคำตอบ JavaScript ของฉัน อักขระ 4 ตัวสุดท้ายคือการคลายการบีบอัดของสตริง "dead"

ล่ามออนไลน์ของ TeaScript ไม่รองรับการป้อนข้อมูลอาเรย์ดังนั้นคุณจะต้องเปิดคอนโซลและเรียกใช้โดยพิมพ์:

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

คำอธิบาย

      // 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 ไบต์

ขอบคุณ @RikerW สำหรับ -16 ไบต์ :(

ขอบคุณ @Maltysen สำหรับ -11 ไบต์ :(

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]

ประเภทแรกสุขภาพแล้วใส่แล้วเหตุการณ์ในรูปแบบรายการ


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

รับอินพุตผ่านสตรีมอาร์กิวเมนต์ อาร์กิวเมนต์แรกคือปริมาณของสุขภาพและส่วนที่เหลือทั้งหมดคือรายการของเหตุการณ์

เวอร์ชันที่อ่านได้ / ไม่ได้รับการดัดแปลง

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

ตัวอย่าง:

  • CSharp.exe 3 => 9

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

(Psst.) CSharp.exe เป็นชื่อที่ใช้เป็นตัวอย่าง คุณต้องเรียกสิ่งนี้ในความเป็นจริง: อาร์กิวเมนต์ [program_name.exe] โดยไม่มีวงเล็บเหลี่ยม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.