회수 계산 알고리즘


14

계산하는 법을 배우는 아이들은 종종 숫자를 알고 있지만, 그 숫자를 제대로 맞추지 못하는 것 같습니다.

예를 들어 다음과 같이 말할 수 있습니다.

1,2,3,4,7,8,9,10

때때로 아이들은 몇 가지 숫자를 건너 뛴 후 다시 돌아갑니다.

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

이것은 분명히 우수한 패턴입니다. 우리는 그것들을 식별해야합니다.

이 목록을 식별하려면 다음을 수행하십시오.

  1. 우리 는 목록 의 최소 M및 최대 N를 식별합니다

  2. 우리는 목록을 단계별로 살펴 봅니다. 현재 번호가 오른쪽에있는 목록의 멤버보다 크거나 같은 경우 현재 번호를 제거합니다.

  3. 나머지 목록에에서 M까지의 모든 숫자가 포함 된 경우 N, 진솔한 값을 반환합니다.

입력 목록에 하나 이상의 요소가 포함되어 있다고 가정 할 수 있습니다. 모든 정수가 음이 아닌 것으로 가정 할 수 있습니다.

테스트 사례 :

진실한 :

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

거짓 :

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

이것은 이므로 가능한 한 빨리 답변하십시오!


명확하지 않음 : [0,1,2,3,4,5,4,3,2,1]을 참 또는 거짓으로 간주해야합니까?
GB

1
@GB 거짓. 두 번째 요소에 있으면 2 단계에서 요소를 제거합니다 ( 1나중에 다른 요소가 있으므로). 또한 다른 모든 요소를 ​​제거하므로 (마지막 1 제외)으로 끝나지 0 1않습니다.0 1 2 3 4 5
Nathan Merrill

답변:


6

05AB1E , 5 바이트

나는 이것이 100 % 확실하지는 않지만 모든 테스트 사례를 통과했으며 실패한 상황을 찾을 수 없었습니다.

Ú¥1QP

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

Ú¥1QP   Main link. Argument a
Ú       Reverse uniquify a, keeps only last occurence of each element
 ¥      Get all deltas - all 1 if ascending list
  1Q    Compare all deltas to 1
    P   Product of all results

실제로 7 바이트
Val은 Reinstate Monica가

2
@val No, 05AB1E는 사용자 지정 인코딩 05AB1E를 사용합니다.
Outgolfer Erik

2

젤리 , 10 9 바이트

ṀrṂɓṚ«\Q⁼

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

작동 원리

ṀrṂɓṚ«\Q⁼  Main link. Argument: A (array)

Ṁ          Yield the maximum of A.
  Ṃ        Yield the minimum of A.
 r         Yield R := [max(A), ... min(A).
   ɓ       Begin a new chain. Left argument: A. Right argument: R
    Ṛ      Reverse A.
     «\    Take the cumulative minimum.
       Q   Unique; deduplicate the results.
        ⁼  Compare the result with R.

흥미 롭습니다 ɓ. 비교적 새로운 기능입니까?
ETHproductions

예, Jonathan Allan의 요청에 의한 것입니다.
Dennis

아하, 13 일 전 그래도 사용 된 것을 보지 못했습니다 (아마도 당신이나 조나단이 있고 방금 놓쳤습니다).
ETHproductions

정말 흥미로운 부분은 «\제 생각에 있습니다.
Outgolfer Erik



1

PHP , 148130 바이트

-18 바이트, @Christoph 덕분에

$a=explode(' ',$argn);$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);

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


여기에 언급 할 것이 많습니다. $argn항상 문자열 foreach이 작동하지 않습니다. $argv배열을 입력으로 얻는 데 사용할 수 있지만 항상 첫 번째 요소로 파일 이름을 포함한다는 점에 유의하십시오. 당신이 사용 $m하고 $n단지 그렇게되면 당신이 만드는 바이트를 많이 절약 할 수 있습니다 $b이전을 : $b=range(min($a),max($a));. 캐스트 (bool)는 완전히 필요하지 않습니다. if($k>=$a[$s])$a[$i]=null;$k<$a[$s]?:$a[$i]=-1;. 참조를 사용하여 foreach($a as$i=>&$k)(+1 바이트) 및 (-4 바이트) $a[$i]를 수행 할 수 있습니다 $k. 게다가 지금 바로 $s=$i반복 할 수 있기 때문에 우리는 떨어질 수 있습니다 $i.
Christoph

결과는 다음과 같습니다 $a=$argn;$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);(117 바이트). 그러나 여전히 $argn잘못된 방식으로 사용 됩니다. $a=explode(' ',$argn);13 바이트를 추가로 수정합니다.
Christoph

1
문제 없어요 ! 항상 새로운 PHP 골퍼를 만나서 반가워요. 여러분 중 더 많은 것을보고 싶습니다 :) Titus, Jörg 또는 나와 함께 항상 도와 드리겠습니다!
Christoph

1
@Christoph 왜 $_GET입력 배열로 사용하지 않습니까? 이 경우 변수 explode를 사용하지 않기 위해 additonal -6 Bytes 를 사용할 필요가 없습니다.$b
Jörg Hülsermann

1
@Christoph Okay이 경우에는 7.1 이하의 버전이 필요하며 ~ 온라인
Jörg Hülsermann

1

자바 8, 264262 바이트

import java.util.*;l->{int m=Collections.max(l),n=Collections.min(l),i=0,q;for(;i<(q=l.size());i++)if(l.subList(i+1,q).size()>0&&l.get(i)>=Collections.min(l.subList(i+1,q)))l.remove(i--);for(i=0;n<=m;)if(i<l.size()&&l.get(i++)==n)n++;else return 0>1;return 1>0;}

설명:

여기에서 시도하십시오.

import java.util.*;                 // Import for Collections

l->{                                // Method with integer-ArrayList parameter and boolean return-type
  int m=Collections.max(l),         //  Max of the list
      n=Collections.min(l),         //  Min of the list
      i=0,q;                        //  Two temp integers
  for(;i<(q=l.size());i++)          //  Loop (1) over the list
    if(l.subList(i+1,q).size()>0    //   If the sublist right of the current item is not empty
    &&l.get(i)>=Collections.min(l.subList(i+1,q))) 
                                    //   and if the current item is larger or equal to the lowest value of this sublist
      l.remove(i--);                //    Remove the current item from the main list
                                    //  End of loop (1) (implicit / single-line body)
  for(i=0;n<=m;)                    //  Loop (2) from min to max
    if(i<l.size()                   //   If the current item doesn't exceed the list's size
    &&l.get(i++)==n)                //   and the items are in order so far
      n++;                          //    Go to the next item
    else                            //   Else:
      return 0>1;//false            //    Return false
                                    //  End of loop (2) (implicit / single-line body)
  return 1>0;//true                 //  Return true
}                                   // End of method

1

R, 88 85 바이트

y=NULL;for(i in x<-scan())if(all(i<x[-(1:(F<-F+1))]))y=c(y,i);all(min(x):max(x)%in%y)

이것은 아마도 더 아래로 골프 수 있습니다. 의 요소를 반복하고 x예정된 모든 값이 더 큰지 확인한 다음 해당 요소 만 유지합니다. 루프 후에서 min(x)까지 시퀀스를 만들고 모든 값이 정리 된 버전의에 포함되어 max(x)있는지 확인합니다 .%in%x


Dennis의 답변을 포팅하여 53 바이트까지 줄일 수있었습니다. function(n)all(unique(cummin(rev(n)))==max(n):min(n))
주세페

1

자바 스크립트 (ES6), 60 바이트

s=>(o={},s.reverse().every((n,i)=>!i|o[n+1]|o[n]&&(o[n]=1)))

언 골프 드 :

s=>(
  o={},
  s.reverse().every((n,i)=>
    !i|o[n+1]|o[n]&&(o[n]=1)
  )
)

이것은 더 간단한 알고리즘입니다.

배열을 역순으로 반복하고 각 숫자 (첫 번째 제외)가 이미 본 숫자보다 작거나 같은지 확인하십시오.

단편:



1

C #, 69 바이트

s=>s.Where((e,i)=>s.Skip(i+1).All(r=>e<r)).Count()==s.Max()-s.Min()+1

간단히 말하면
s = 입력 (s) 입력
은이 항목 뒤의 모든 항목 (건너 뛰기 (I) ndex + 1 항목)에서 s 요소에서 가져옵니다. 현재 값은 더 높은
수이며 남은 양이 예상되는 양과 같은지 확인합니다 ((max) imum value minus (min) imum) 숫자의 양

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


@MDXF 그를 환영 하시겠습니까?
Stan Strum

@StanStrum 내가 규칙을 오해 했습니까? 내 영어가 너무 지저분합니까? 처음으로 내가 -am- 게시 ...
Barodus

아니 아니! PPCG에 새로 온 사람을 환영하는 것은 특권이며, 그가 당신에게 인사하고 싶은지 물어 보았습니다
Stan Strum

특권은 둘 다에게있는 것 같습니다. 고마워, 사람들 ^^
Barodus

PPCG의 미래에 재미 있기를 바랍니다.
Stan Strum

0

자바 스크립트 (ES6), 82 73 72 70 바이트

부울을 반환합니다.

a=>a.filter((x,i)=>k-=a.every(y=>~i--<0|y>x,m=x>m?x:m),m=k=0)[0]+~m==k

어떻게?

입력 배열 a 의 각 요소 x 를 반복 하여 최대 발생 값 m 및 오른쪽의 멤버보다 크거나 같은 값 의 수 -k 를 추적합니다 . 정의에 따라 유효한 값은 오름차순으로 나타납니다.

k 대신 음수가 될 때까지 모든 요소가 필터링되도록 하기 filter()보다는을 사용 합니다. 이를 통해 첫 번째 유효한 요소를 분리 할 수 ​​있으며 이는 배열의 최소값이기도합니다.map()

마지막으로 다음을 테스트합니다 minimum - (maximum + 1) == -number_of_valid_elements.

a.filter(...)[0] + ~m == k

테스트 사례

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.