닌자의 9 죽음


12

대화에서 영감을 얻었습니다 .

이 도전에서 당신의 목표는 닌자를 모방하고 그가 얼마나 많은 죽음을 남겼는지 계산하는 것입니다.

명세서

닌자는 9 명의 죽음으로 시작합니다. 그는 또한 입력으로 필수 시작 건강을 얻습니다.

그런 다음 그는 인생에서 건강을 바꾸는 사건 목록을 입력으로 사용합니다. 이들은 음수, 양수 또는 0 정수일 수 있습니다.

어느 시점에서든 건강이 0 이하에 도달하면 생명을 잃고 건강은 시작 건강으로 돌아갑니다.

당신의 프로그램은 그가 떠난 사망자 수를보고해야합니다. 그가 0 개 이하로 남았다면 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.

¯_ (ツ) _ / ¯ Dennis 승
downrep_nation

7

apt, 40 39 32 바이트

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

온라인으로 사용해보십시오!

작동 원리

골프이 지난 밤 동안 (멀리 컴퓨터를, 아니 이하), 나에 대한 흥미로운 대체 가로 질러 없습니다 >0: ¬. 숫자에서는 제곱근을 취하여 NaN음수 를 반환 합니다. NaN거짓이므로, 이것은 정확히 진실 / 거짓을 반환합니다 >0.

이 트릭을 조금 더 확장하면 T가 U로 재설정되면 >=05 바이트 만 가능합니다 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¬²반환 ; 그렇지 않으면를 반환합니다 . 때문에 하고 모두 falsy 있으며,이과 닌자의 건강을 재설정 할 수있는 쉬운 방법을 제공합니다 . 이 트릭은 또한 그 숫자가 양수이거나 음수 이면 닌자의 생명을 돌려주는 데 사용됩니다 .NaNTTNaN0ª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

자바 스크립트 ES6, 62 60 58 바이트

@ETHproductions 덕분에 4 바이트 절약

(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

mapreduce대부분의 시나리오에서 비트 : (a,b,d=9,l=a)=>b.map(i=>l=l+i<1?d--&&a:l+i)&&d<1?"dead":d57입니다.
ETHproductions

@ETHproductions 감사 합니다. 반품 .reduce(...)&&때문에 작동 하지 않을 것이라고 생각 합니다. 작동하지 않습니다. .reduce0
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

하스켈, 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

피 이스, 32

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

선행 공간이 있습니다. 이것은 아마도 최선의 접근 방법은 아니지만 가장 먼저 떠 올랐습니다. 닌자의 건강에 값을 추가하고 카운터를 늘리고 0 아래로 떨어질 때 건강을 재설정하여 입력을 줄입니다. 우리는 마지막 변경으로 닌자가 죽었는지 계산하기 위해 목록의 끝에 0을 추가 한 다음 닌자가 죽었는지 확인합니다. 제로 스타트 건강 사례는 하드 코딩되어 있습니다.

테스트 스위트


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

스택은 이제 다음과 같습니다 (input 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

체력이 0이면 데스 카운터를 0으로 설정하십시오. 에 대한 특수 사례 처리 initial health = 0.

g        # health to bool
*        # multiply with death counter

스택에서 다시로드 값 삭제

wx

사망 카운터가 0 이하인 경우이를 삭제하고 대신 'dead'를 인쇄하십시오.

t0>~?x'dead'

1

티 스크립트 , 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

파이썬 2.7 82 66 55 106 바이트

-16 바이트의 @RikerW 덕분입니다. :(

-11 바이트에 대한 @Maltysen에게 감사드립니다. :(

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]

먼저 health를 입력 한 다음 입력 한 후 이벤트를 목록 양식으로 입력하십시오.


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.