9 cái chết của Ninja


12

Lấy cảm hứng từ cuộc trò chuyện này trong trò chuyện.

Mục tiêu của bạn trong thử thách này là giả lập một ninja và đếm xem anh ta đã bỏ bao nhiêu cái chết.

Thông số kỹ thuật

Bạn ninja bắt đầu với 9 cái chết còn lại. Ông cũng có được một sức khỏe bắt đầu không thể thiếu như là một đầu vào.

Sau đó, anh ta đưa vào danh sách các sự kiện trong cuộc sống làm thay đổi sức khỏe của mình. Đây có thể là số nguyên âm, dương hoặc bằng không.

Tại bất kỳ thời điểm nào, nếu sức khỏe của anh ta đạt đến hoặc dưới 0, anh ta sẽ mất mạng và sức khỏe của anh ta trở lại với sức khỏe ban đầu.

Chương trình của bạn nên báo cáo số người chết mà anh ta để lại. Nếu anh ta có 0 hoặc ít hơn, bạn nên xuất ra dead.

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Các trường hợp thử nghiệm

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
YAY !!! Bài đăng trò chuyện của tôi được liên kết !!! : P
Rɪᴋᴇʀ

8
Có vẻ như tôi đang gặp rắc rối ...
NinjaBearMonkey

Vậy thứ tự của các sự kiện là "chết nếu <= 0, đọc một số, thêm vào tổng, lặp lại"?
lirtosiast

@ThomasKwa yeah, nhưng cái chết có thể xảy ra nhiều lần
Maltysen

1
Ninja có thể tái sinh như chúa tể thời gian? Xin vui lòng?
Ashwin Gupta

Câu trả lời:


8

Thạch , 30 28 26 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

;@ñ\<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 thắng
hạ cấp

7

Japt, 40 39 32 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Trong khi cố gắng chơi golf tối qua (cách xa máy tính, không hơn không kém), tôi đã chạy qua một sự thay thế thú vị cho >0: ¬. Trên các số, cái này lấy căn bậc hai, trả về NaNsố âm. NaNlà giả, vì vậy điều này trả về chính xác cùng một sự thật / giả >0.

Mở rộng thủ thuật này thêm một chút nữa, chúng ta có thể đặt lại T thành U >=0chỉ với năm byte : T¬²ªU. Cái này hoạt động ra sao? Hãy xem:

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

Như bạn có thể thấy, T¬²trả về NaNnếu Tlà âm; nếu không, nó trở lại T. Vì NaN0cả hai đều là giả, điều này cung cấp một cách dễ dàng để thiết lập lại sức khỏe của ninja ªU. Thủ thuật này cũng được sử dụng để trả lại mạng sống của ninja nếu số đó là dương hoặc "dead"nếu âm.

Đặt tất cả những thứ này lại với nhau:

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

Nếu đầu vào được đảm bảo là không âm hoặc thậm chí dương, chúng ta có thể đánh gôn 1 hoặc 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

6

JavaScript ES6, 62 60 58 byte

Đã lưu 4 byte nhờ @ETHproductions

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

Dùng thử trực tuyến (Tất cả các trình duyệt hoạt động)

Giải trình

(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

Sẽ d--&&alàm việc, hay b.reduce(...)&&d<1?"dead":d?
Sản phẩm ETH

mapnhịp đập reducetrong hầu hết các kịch bản: (a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i)&&d<1?"dead":dlà 57.
ETHproductions

@ETHproductions cảm ơn, tôi không nghĩ .reduce(...)&&sẽ làm việc vì .reducelợi nhuận 0, nó sẽ không hoạt động.
Hạ cấp

(a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i,a)|d<1?"dead":dThay vào đó sẽ làm việc?
Sản phẩm ETH


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

Ví dụ sử dụng: p 10 0 100 [-20, 5, -50, 15, -30, -30, 10]->"8"


1

Bình thường, 32

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

Lưu ý rằng có một không gian hàng đầu. Đây có lẽ không phải là cách tiếp cận tốt nhất, nhưng đó là điều đầu tiên xuất hiện trong đầu. Nó giảm hơn đầu vào bằng cách thêm các giá trị vào sức khỏe của ninja và tăng bộ đếm và đặt lại sức khỏe khi nó giảm xuống dưới 0. Chúng tôi thêm số 0 vào cuối danh sách để tính xem liệu thay đổi cuối cùng có giết chết ninja hay không, và sau đó chỉ cần kiểm tra xem ninja có chết không. Các trường hợp sức khỏe bắt đầu bằng không được mã hóa cứng.

Phòng thử nghiệm


1

MATL, 32

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

Giải trình

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

Bây giờ ngăn xếp trông như thế này (cho đầu vào 100, [-20, 5, -50, 15, -30, -30, 10]):

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

reload   deaths    health
value    left

Pop mảng và vòng lặp

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

Nếu sức khỏe bằng 0, đặt bộ đếm tử vong bằng không. Xử lý trường hợp đặc biệt cho initial health = 0.

g        # health to bool
*        # multiply with death counter

Xóa giá trị tải lại từ ngăn xếp

wx

Nếu bộ đếm tử vong bằng 0 hoặc ít hơn, thay vào đó hãy xóa nó và in 'chết'.

t0>~?x'dead'

1

TeaScript , 36 34 31 byte

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

Tương tự như câu trả lời JavaScript của tôi. 4 ký tự cuối cùng là giải nén chuỗi "chết".

Trình thông dịch trực tuyến của TeaScript không hỗ trợ nhập mảng, do đó bạn sẽ cần mở bảng điều khiển và chạy nó bằng cách gõ:

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

Giải trình

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

Cảm ơn @RikerW cho -16 byte. :

Cảm ơn @Maltysen cho -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]

Loại sức khỏe đầu tiên, sau đó nhập, sau đó các sự kiện ở dạng danh sách.


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

Đưa đầu vào thông qua luồng đối số. Đối số đầu tiên là số lượng sức khỏe và tất cả phần còn lại là danh sách các sự kiện.

Phiên bản có thể đọc / không đọc

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

Ví dụ:

  • CSharp.exe 3 => 9

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

(Psst.) CSharp.exe là tên được sử dụng làm ví dụ. Bạn phải gọi như thế này trong thực tế: các đối số [program_name.exe], không có dấu ngoặc vuông.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.