히드라 공격


15

히드라 를 죽일 수있는 숙련 된 전사가 아니라 ( 여기여기 참조 ), 이번에는 당신이 생물을 상대로 사용할 무기 나 무기를 죽이는 방법에 대한 사전 지식이없는 전사입니다.

이 문제에서 단일 헤드를자를 때마다 같은 장소에서 두 개가 자랍니다. 많은 헤드를 동시에 차단할 수있는 메커니즘이 없기 때문에 헤드 수가 늘어납니다. 이 경우 Hydra는 N(N ⩾ 1) 헤드로 시작할 수 있습니다 . 첫 번째 조우를 세대라고 부르고 첫 번째 세대 의 헤드 를 0으로 , 첫 번째 타격 후 생성 된 헤드를 1로 표현 합니다.

입력

NHydra가 처음 가지고있는 헤드 수와 N인덱스를 포함하는 크기 목록 (0 인덱싱 형식을 사용하는 예제)을 나타내는 정수가 제공 됩니다. 주어진 색인이 항상 유효하다고 가정 할 수 있습니다. 머리를자를 때 목록 (예 : 머리)이 커짐을 기억하십시오.

입력 : N = 4[0,4,2,5]

0 세대-공격 지수 0

0 0 0 0     =>     1 1 0 0 0
^                  ^ ^

1 세대-공격 지수 4

1 1 0 0 0     =>     1 1 0 0 2 2
        ^                    ^ ^

2 세대-공격 지수 2

1 1 0 0 2 2     =>     1 1 3 3 0 2 2
    ^                      ^ ^

3 세대-공격 지수 5

1 1 3 3 0 2 2     =>     1 1 3 3 0 4 4 2
          ^                        ^ ^

마지막 세대

1 1 3 3 0 4 4 2

보시다시피, 주어진 색인은 이전 세대의 목록과 관련이 있습니다.

산출

마지막 세대를 출력해야합니다.

테스트 사례

N = 1 and [0] => [1,1]
N = 2 and [0,0] => [2,2,1,0]
N = 2 and [0,1] => [1,2,2,0]
N = 2 and [1,0] => [2,2,1,1]
N = 2 and [1,1] => [0,2,2,1]
N = 4 and [0,4,2,5] => [1,1,3,3,0,4,4,2]
N = 6 and [0,0,0,0,0,0] => [6, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0]
N = 6 and [5,6,7,8,9,10] => [0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 6]
N = 10 and [1,7,3,12,9,0,15,2,2,10] => [6, 6, 9, 9, 8, 1, 3, 3, 0, 0, 10, 10, 2, 5, 5, 0, 0, 4, 7, 7]

이것은 이므로 바이트 단위의 최단 답변이 승리합니다!


샌드 박스 링크
ihavenoidea

초기 헤드 수가 절단 된 헤드 수보다 많은 테스트 케이스가 필요합니다. 나는 그 경우에 실패 할 적어도 하나의 현재 답변을 본다고 생각합니다.
Xcali

@Xcali 차단할 헤드 수는 실제로 초기 헤드 수와 동일하게 보장됩니다 . 정수 N(...)와 크기 목록이 제공됩니다N (그러나 처음 읽을 때 해당 부분을 놓쳤습니다) 그러므로 도전 N은 쓸모가 없습니다.
Arnauld

3
N배열의 크기로 "암시 적으로"주어지기 때문에 실제로 입력에서 제거하는 것에 대해 생각 했습니다. 그러나 솔루션이 N의존 array.size()하거나 이와 유사한 방식으로 바이트를 절약 할 수 있다고 생각했습니다 .
ihavenoidea

1
스틱 만화 관련 순서 (+ 다음 것).
Paŭlo Ebermann

답변:




5

Stax , 12 11 바이트

î╓≡╧▄#¥oWä)A

staxlang.xyz에서 실행하고 디버그하십시오!

1 바이트 절약을위한 재귀 덕분 입니다!

압축 해제 (13 바이트) 및 설명 :

z),{i^c\&:fFm
z)               Push initial array of zeroes to stack
  ,              Push array of attacks to stack
   {       F     For each attack, push it and then:
    i^c\           Push [x,x], where x is the generation number
        &          Set the head at the attack index to this new array
         :f        Flatten
            m    Print the last generation

이 과제는 "마지막 세대를 출력해야한다"고 명시 적으로 밝히므로이 컨센서스 는 여기에 있지 않습니다. 그렇다면 그렇지 않은 경우 빈 스택에 결과를 남겨두면 10 바이트 를 관리 할 수 ​​있습니다.

z),Fi^c\&:f

1
0]*로 교체 할 수 있습니다 z). 편집 : 분명히 이것은 문서화되지 않은 동작이지만 pad-left는 어느 순서로든 피연산자를 사용합니다. (LOL NPM)
재귀

1
@recursive 문서화되지 않은 행동 : 행동의 가장 좋은 종류
Khuldraeseth na'Barya

5

하스켈 , 63 57 바이트

foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..]

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


take그리고 drop보다 짧은 splitAt. 선반 g람다에 또 다른 바이트를 저장합니다 foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..].
nimi

Ahh gnice- 나는이 두 가지를 모두 시도했지만 어떤 이유로 든 pointfree 를 만들려고 시도했지만 더 악화되었습니다.
B. Mehta

4

Oracle SQL, 325 바이트

select listagg(ascii(substr(l,level,1)),', ')within group(order by level)
from(select * from t
model dimension by(1 i)measures(l,r)
rules iterate(1e5)until(r[1]is null)
(l[1]=regexp_replace(l[1],'.',chr(:n-length(r[1])+1)||chr(:n-length(r[1])+1),1,ascii(substr(r[1],1,1))+1),r[1]=substr(r[1],2)))
connect by level<=length(l);

SQL * Plus에서 테스트하십시오.

SQL> set heading off
SQL>
SQL> create table t(l varchar2(4000), r varchar2(4000));

Table created.

SQL>
SQL> var n number;
SQL> exec :n := 10;

PL/SQL procedure successfully completed.

SQL>
SQL> insert into t
  2  values(rpad(chr(0),:n,chr(0)), chr(1)||chr(7)||chr(3)||chr(12)||chr(9)||chr(0)||chr(15)||chr(2)||chr(2)||chr(10));

1 row created.

SQL>
SQL> select listagg(ascii(substr(l,level,1)),', ')within group(order by level)
  2  from(select * from t
  3  model dimension by(1 i)measures(l,r)
  4  rules iterate(1e5)until(r[1]is null)
  5  (l[1]=regexp_replace(l[1],'.',chr(:n-length(r[1])+1)||chr(:n-length(r[1])+1),1,ascii(substr(r[1],1,1))+1),r[1]=substr(r[1],2)))
  6  connect by level<=length(l);

6, 6, 9, 9, 8, 1, 3, 3, 0, 0, 10, 10, 2, 5, 5, 0, 0, 4, 7, 7

추신. 최대 255 개의 숫자에서 작동합니다.


3

Zsh , 41 바이트

규칙에 명시된대로 N은 무시 합니다 .

for i;a+=(0)
for i;a[i]=($[++j] $j)
<<<$a

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

매우 표준 : 시작하려면 0의 배열을 만들고 완료하려면 인쇄하십시오. a[i]=(a b)모두 변경하고 삽입하는 방법은 나에게 새로운 행복 나는 그것을위한 사용을 발견했다.


또는 41 바이트 :

a[#]=
for i;a[i]=($[++j] $j)
<<<${a/#%/0}

이것은 덜 표준입니다. 우리는 몇 가지 깔끔한 트릭을 활용합니다.

  • ${a/#%/0}:이 교체이지만, #%앵커에게 전하고 zsh을 시작과 끝에서 일치합니다. 비어 있기 때문에 모든 빈 요소를 0으로 바꿉니다.
  • a[#]=: $#Zsh에서 빈 크기의 배열을 효과적으로 선언합니다 . char *a[argc]C 와 같습니다 . 이렇게하지 않으면 필요한 후행 0을 얻지 못합니다.

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


3

스칼라 , 104 바이트

def^(l:Seq[Int],r:Seq[Int]):Seq[Int]=if(r.size>0)^(l.patch(r(0),Seq.fill(2)(l.max+1),1),r.drop(1))else l

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

지금까지 가장 긴 답변 인 것 같습니다. :)

List.fill(2)(l.max+1)로 교체 할 수 List(l.max+1,l.max+1)있지만 길이는 동일하게 유지됩니다.


3

자바 스크립트 (ES6),  61 59  51 바이트

@Shaggy 덕분에 n항상 배열의 길이이며 두 버전에서 8 바이트를 절약합니다.

배열을 0 인덱스 형식으로 예상합니다. 무시합니다 n.

a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&b

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


자바 스크립트 (Node.js) ,  64  56 바이트

사용 reduce()하여 flat():

a=>a.reduce((b,i,g)=>b.flat(1,b[i]=[++g,g]),a.map(_=>0))

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


겠습니까 a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&b복용하지 않고, 일을 n?
Shaggy

@Shaggy Oops. 나는 그 부분을 놓쳤다 : and size of sizeN . 예, 그것은 n쓸모없는 것처럼 보입니다 .
Arnauld


2

PHP , 101 바이트

function h($n,$a){$h=array_fill(0,$n,0);foreach($a as$b)array_splice($h,$b,0,$h[$b]=++$x);return $h;}

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


어서 오십시오! TIO 와 같은 온라인 통역사에 대한 설명과 링크를 추가해보십시오 . 코드 전용 답변은 일반적으로 자동으로 품질이 낮은 것으로 표시됩니다. 자세한 내용은 기존 답변을 참조하십시오.
mbomb007

TIO 링크를 추가했습니다
XMark


1

망막 0.8.2 , 69 바이트

\d+
$*_
r`_\G
,0
+`^((,*)_)(_)*(.*,,(?<-3>\d+,)*)\d+
$2$4$.1,$.1
^,+

온라인으로 사용해보십시오!링크에는 테스트 사례가 포함됩니다. 1- 색인. 로 입력을 ...list,N받습니다. 목록의 길이가 필요하지 않습니다 N. 설명:

\d+
$*_

모든 입력을 단항으로 변환하지만 _ 나중에 digit 사용과 혼동되지 않도록하십시오 1. (Retina 1은 2 바이트 절약을 위해 자동으로이를 수행합니다.)

r`_\G
,0

바꾸다 N 의 배열 N제로하지만 목록을 변경하지 않습니다.

+`

목록의 모든 요소를 ​​처리하십시오.

^((,*)_)(_)*(.*,,(?<-3>\d+,)*)\d+

목록의 다음 요소와 배열에서 동등한 위치를 찾으십시오. $1= 현재 세대 (길이), $2= 이전 세대의 쉼표, $3= 현재 색인-1, $4= 첫 번째 $3머리.

$2$4$.1,$.1

현재 색인의 헤드를 현재 세대의 두 사본으로 10 진수로 바꿉니다.


1

Pyth , 16 바이트

u.nXGH,=+Z1ZE*]0

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

흥미롭게도 모든 요소가 처리 될 때까지 목록의 가장 왼쪽에있는 두 가지 요소에서 수행되는 s실제로 속기 때문에 목록을 병합하는 데 사용할 수 없습니다 . 즉, 마지막 교체가 발생한 위치에 따라 처음 몇 개의 요소를 간단히 요약 할 수 있습니다.+F+

u.nXGH,=+Z1ZE*]0Q   Implicit: Q=input 1 (N), E=input 2 (array), Z=0
                    Trailing Q inferred
              ]0    [0]
             *  Q   Repeat Q times
u           E       Reduce E, with current value G and next value H, starting with the above:
       =+Z1           Increment Z in-place
      ,  Z Z          Pair the updated Z with itself
   XGH                In G, replace the element with index H with the above
 .n                   Flatten
                    Implicit print


1

C # (Visual C # 대화 형 컴파일러) , 94 89 85 바이트

a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c.Insert(d,c[d]=++a);return c;})

Andrew Bauhmer 덕분에 2 바이트 절약

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


a를 재사용하여 2 바이트를 절약 할 수 있습니다. a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c[d]=++a;c.Insert(d,a);return c;})<
Andrew Baumher '

지난 5 분 당신은 그것을 테스트 할 수 있습니다 여기에
앤드류 Baumher에게

@AndrewBaumher 감사
무지의

1

05AB1E , 10 바이트

-IvN>D‚yǝ˜

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

   -             # subtract the input from itself (yields a list of 0s)
    Iv           # for each number y in the input
      N          # push the 0-based loop count
       >         # add 1 to get the generation number
        D        # duplicate
         ‚       # wrap the two copies in a list
          yǝ     # replace the element at index y with that list
            ˜    # flatten
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.