시퀀스 단계 가져 오기


17

도전

일련의 숫자가 주어지면 순서 단계를 반환하는 함수를 만듭니다.

  • 시퀀스가 N >= 3
  • 시퀀스는 적어도 한 번은 단계를 반복합니다
  • 시퀀스는 자연수 만 포함합니다
  • 함수 또는 프로그램은 가능한 가장 짧은 단계 시퀀스를 리턴해야합니다.

예:

입력: [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]

산출: [1, 1, 2]

설명 : 초기 순서는에서 시작 1 => 2 (1 step), 2 => 3 (1 step), 3 => 5 (2 steps)됩니다. 그런 다음 반복됩니다. 그러면 출력은[1 step, 1 step, 2 steps] => [1, 1, 2]

또 다른 예:

입력: [2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]

산출: [3, 1, 1, 1]

[2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
 \  /\ /\ /\ / 
  3   1  1  1  Then it repeats...

테스트 사례

Input: [1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28] => Output: [3,4,1,1]

Input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] => Output: [5,2]

Input: [2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47] => Output: [4,4,3,4]

Input: [5, 6, 7] => Output: [1]


설명

  • 입력 길이-1은 출력 길이로 나눌 수 있습니다
  • 순서가 항상 증가한다고 가정

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.



6
최근에 귀하가 게시 한 몇 가지 문제에 대해 명확하게 설명하고 몇 가지가 "분명하지 않음"으로 닫히고 적절한 수정을 마친 후에 다시 열었습니다. 샌드 박스 에 며칠 / 일주일 동안 게시하는 것을 고려 했습니까 ? 나는 당신의 도전이 접근하기 쉽기 때문에 즐거웠지만 , 얼마나 간단하거나 누구에 의해 게시 되었든 모든 도전은 개선을 사용할 수 있습니다.
주세페

2
@Giuseppe 제안 해 주셔서 감사합니다. 나는 모래 상자에 다른 도전 과제를 게시했습니다 (일반적으로 도전 과제를 만드는 올바른 방법을 얻지 못하면 삭제합니다). 이러한 도전에 대해 나는 그것들이 충분히 명확하다고 생각했기 때문에 즉시 게시했지만 샌드 박스에 먼저 게시 할 것입니다. 감사합니다
Luis felipe De jesus Munoz

2
@LuisMendo Heretic! 0은 자연수입니다! 빌리 조엘 (Billy Joel)은 Peano Man 전용 앨범을 가지고있었습니다!
ngm

1
@AdmBorkBork, 이것은 임의 길이의 작업 목록을 처리하기 때문에 더 관련이 있습니다.
피터 테일러

답변:


10

젤리 , 9 7 바이트

IsJEƇḢḢ

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

작동 원리

IsJEƇḢḢ  Main link. Argument: A (array)

I        Increment; compute D, the array of A's forward differences.
  J      Indices; yield [1, ..., len(A)].
 s       Split D into chunks of length k, for each k in [1, ..., len(A)].
   EƇ    Comb equal; keep only partitions of identical chunks.
     Ḣ   Head; extract the first matching parititon.
      Ḣ  Head; extract the first chunk.

9

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

쉼표로 구분 된 문자열을 앞에 쉼표로 출력합니다.

a=>(a.map(p=x=>-(p-(p=x)))+'').match(/N((,\d+)*?)\1*$/)[1]

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

또는 구분자로 사용 하고 시퀀스가 ​​항상 엄격 하다고 가정 하면 56 바이트,- 증가 입니다.

어떻게?

먼저 입력 배열 a [] 를 다음과 같은 연속 된 차이 목록으로 변환합니다 .

a.map(p = x => -(p - (p = x)))

때문에 , P가 처음 숫자가 아닌 값으로 설정된다 (의 콜백 함수 맵 () )의 첫 번째 반복 산출은 NaN이이 .

예:

[6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41]
[ NaN, 5, 2, 5, 2, 5, 2, 5, 2, 5, 2 ]

그런 다음 결과를 문자열로 강제 변환합니다.

"NaN,5,2,5,2,5,2,5,2,5,2"

마지막으로, "NaN"바로 다음부터 시작하여 문자열 끝까지 반복되는 쉼표로 구분 된 정수 ( ) 의 최단 1 패턴을 ,\d+찾습니다.

match(/N((,\d+)*?)\1*$/)

1 : 욕심없는 사용 *?


동일한 정규식 아이디어를 기반으로하지만 솔루션이 매우 다른 솔루션을 게시하고 있습니다. 물론 나는 내 개발 전에 다른 솔루션을 보지 않았으며 충분히 다른 것처럼 보였으며 아마도 내가 여기보다 더 나은 점수를 얻은 것은 처음 일 것입니다.
edc65

1
53 바이트 : /(,.+?)\1*$/.
Neil

6

Brachylog , 11 바이트

s₂ᶠ-ᵐṅᵐ~j₍t

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

연속적인 차이에 대한 기본 제공이있는 경우 5 바이트입니다.

설명

Example input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] 

s₂ᶠ             Find all substrings of length 2: [[6,11],[11,13],…,[34,39],[39,41]]
   -ᵐ           Map subtraction: [-5,-2,-5,-2,-5,-2,-5,-2,-5,-2]
     ṅᵐ         Map negate: [5,2,5,2,5,2,5,2,5,2]
       ~j₍      Anti-juxtapose the list of differences; the shortest repeated list is found
                  first, with the biggest number of repetitions: [5,[5,2]]
            t   Tail: [5,2]

당신은 바이트를 저장하기 위해 꼬리 뒤를 부정 할 수 있습니까?
Rod

@로드 여전히 매핑해야하므로 길이는 같습니다. Negate는 두 숫자 사이의 술어이며 다른 언어와 같은 목록으로 자동으로 벡터화되지 않습니다 (그렇지 않으면 선언적 프로그램에서 공통적 인 알 수없는 입력 / 출력에서는 제대로 작동하지 않음)
Fatalize

5

Pyth, 11 바이트

<J.+Qf.<IJT

여기 사용해보십시오

설명

<J.+Qf.<IJT
 J.+Q          Call the sequence of differences in the input J.
     f         Find the first positive integer T...
      .<IJT    ... where rotating J by T doesn't change it.
<J             Take that many elements of J.

5

apt , 14 12 바이트

äa
¯@eUéX}aÄ

시도 해봐


설명

              :Implicit input of array U
äa            :Consecutive absolute differences
\n            :Reassign to U
 @    }aÄ     :Return the first positive integer X that returns true
   UéX        :  Rotate U right X times
  e           :  Check equality with U
¯             :Slice U to that element

기발한

äa
@eUîX}a@¯XÄ

시도 해봐


5

R , 49 46 바이트

전체 프로그램 :

d=diff(scan());while(any((s=d[1:T])-d))T=T+1;s

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

R , 72 58 54 바이트

한 곳에서 모든 테스트 사례와 함께 원래 기능 제출 :

function(a,d=diff(a)){while(any((s=d[1:T])-d))T=T+1;s}

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

전체 프로그램 라우트와 함수에 -4 바이트를 제안 해준 JayCe에게 감사 드리며, 추가 -3에 대해서는 Giuseppe에게 감사드립니다.



@JayCe도 a<-여기에 필요하지 않습니다
Giuseppe

4

J , 22 19 바이트

FrownyFrog 덕분에 3 바이트가 절약되었습니다!

0{"1[:~./:|."{}.-}:

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

[온라인으로 사용해보십시오!] [TIO-ji2uiwla]

어떻게?

                 -      find the successive differences by subtracting 
                  }:    the list with last element dropped
               }.       from the list with the first element dropped 
           |."{         rotate the list of differences
         /:             0..length-1 times (the input graded up)
     [:~.               remove duplicating rows
 0{"1                   take the first element of each row

당신이 만약 /:대신 #\, 당신은 수 0{"1[:~.1 바이트를 저장합니다.
FrownyFrog

그리고 "0 1이다"{
FrownyFrog

@FrownyFrog 다시 한번 감사합니다!
Galen Ivanov

1
이것은 화려하다.
요나

@Jonah 네, FrownyFrog 덕분에!
Galen Ivanov

4

05AB1E , 8 바이트

Kevin Cruijssen 덕분에 3 바이트를 절약했습니다 .

¥.œʒË}нн

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


05AB1E , 11 바이트

āεI¥ô}ʒË}нн

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

āεI ¥ ô} ʒË} нн 전체 프로그램.
 길이 범위. [1 ... len (inp)]을 누릅니다.
 ε} 각각에 대해 ...
  I ¥ ô ... 델타를 해당 크기의 조각으로 자릅니다.
      elementsË} 모든 요소를 ​​동일하게 유지하십시오.
         그리고 먼저 첫 번째 요소의 첫 번째 요소를 검색합니다.

13 바이트

귀여운 대안, IMO :

¥©ηʒDg®ôÙ˜Q}н

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

¥©ηʒDg®ôÙ˜Q}н   Full program.
¥               Push the deltas.
 ©              Copy them to the register.
  ηʒ       }    And filter the prefixes by...
    D     Q     ... Is the prefix itself equal to...
     g®ô        ... The deltas, split into chunks of its length...
        Ù˜      ... Deduplicated and flattened?
            н   Head.

1
8 바이트 를 사용하여.
Kevin Cruijssen

3

자바 스크립트, 49 56 바이트

감사합니다 7 바이트 저장 편집 (누가 추측합니까?) Arnauld

Arnauld와 같은 정규 표현식 아이디어이지만 구현 방식이 흥미 롭습니다 ...

단계 쉼표로 구분 된 문자열 (및 선행 쉼표)

p=>/N(.+?)\1+$/.exec(p.map(p=v=>[v-p,p=v][0]))[1]

테스트

var F=
p=>/N(.+?)\1+$/.exec(p.map(p=v=>[v-p,p=v][0]))[1]

;[[1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]
,[1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28]
,[6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] 
,[2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47]
,[5, 6, 7]]
.forEach(x=>console.log(x + ' -> ' + F(x)))


사용 match은 나의 잘못된 결정이었습니다. 당신은 좀 더 나에게 outgolf 수 있습니다 . :-)
Arnauld

3

MATL , 14 13 12 바이트

dt5YLFTF#Xu)

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

MATL에 순환 기능이 있다는 것을 발견했습니다!

설명

d -연속적인 용어의 차이를 배열로 가져옵니다.

t5YL-복제 한 다음 ( 'circulant') 옵션을 사용 하여 YL( 'gallery') 함수 를 호출하십시오 5. 주어진 벡터를 첫 번째 행으로 사용하여 행렬을 만든 다음 연속 행은 줄 바꿈 될 때까지 같은 벡터를 순환 적으로 이동시킵니다.

FTF#Xu-고유 한 행을 확인하고 행 번호를 가져옵니다 (더 짧은 방법이 있는지 확실하지 않음). 시퀀스 단계가 반복되면 원형으로 이동 된 행은 첫 번째 행과 동일하며 후속 행은 반복됩니다. 따라서 이것은 반복을 시작하기 전에 첫 번째 시퀀스 단계 실행의 인덱스를 가져옵니다.

) -그것을 사용하여 원래의 차등 배열로 색인을 작성하여 답을 얻으십시오.


더 오래된 :

d`tt@YS-a}@:)

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

(주세페 덕분에 1 바이트)

설명:

d   % Get the differences between successive terms, as an array
`   % Start do-while loop
  tt  % duplicate the difference array twice
  @   % push the current loop index value
  YS  % circularly shift the difference array by that amount
  -   % subtract the shifted diffs from the original diffs
  a   % see if the subtraction resulted in any non-zeros
    % if it did, shifted differences were not equal to original differences, so continue loop 
}@ % if it didn't, then get loop index
:) % get the differences upto the loop index, before they started repeating
   % implicit loop end



2

자바 10, 104100 바이트

a->{var t="";for(int i=a.length;i-->1;t+=a[i]-a[i-1]+" ");return t.replaceAll("( ?.+?)\\1*$","$1");}

정규식 ( ?.+?)\1*$짧은을위한에서 하위 문자열 반복 @Neil '에 대한 코멘트 @Arnauld 의 자바 스크립트 (ES6) 대답' .

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

설명:

a->{                        // Method with integer-array parameter and String return-type
  var t="";                 //  Temp-String, starting empty
  for(int i=a.length;i-->1; //  Loop backward over the input-array, skipping the first item
    t+=a[i]-a[i-1]          //   Calculate the difference between two adjacent items
       +" ");               //   And append this with a space to the temp-String
  return t.replaceAll("( ?.+?)\\1*$", 
                            //  Find the shortest repeating substring
                     "$1");}//  And only keep one such substring

1

APL + WIN, 39 바이트

입력 프롬프트.

(↑((⍴v)=+/¨(⊂v)=(⍳⍴v)⌽¨⊂v)/⍳⍴v)↑v←-2-/⎕

온라인으로 사용해보십시오! Dyalog Classic 제공

설명:

v←-2-/⎕ Prompt for input and take successive differences

(⍳⍴v)⌽¨⊂v create a nested vector ans sequentially rotate by one to length of v

+/¨(⊂v)= compare to original v and sum positions where there is match

(⍴v)= identify where all elements match

(↑(....) identify number of rotations giving a first complete match

(↑(...)↑v take first number of elements from above from v as repeated sequence


1

레티 나 0.8.2 , 42 바이트

\d+
$*
(?<=(1+),)\1

1+(.+?)\1*$
$1
1+
$.&

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 출력에는 선행 쉼표가 포함됩니다. 설명:

\d+
$*

단항으로 변환합니다.

(?<=(1+),)\1

남은 첫 번째 숫자를 제외하고 앞으로 차이를 계산합니다.

1+(.+?)\1*$
$1

반복되는 차이를 일치시킵니다.

1+
$.&

십진수로 변환합니다.


1

05AB1E , 14 13 바이트

¥DηvÐNƒÁ}QD—#

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

@ Mr.Xcoder 게시 한 두 개의 더 짧은 05AB1E 답변 이 이미 있다는 것을 알고 있지만 회전 및 동등성 검사를 사용 하여이 대안을 시도하고 싶었습니다.
떨어 뜨리지 않고 몇 바이트 아래로 골프를 칠 수 있습니다 Á.

@Emigna 의 끝에서 -1 바이트를 사용 하여 global_variable 레지스터 ( ©및 2x ®) 를 제거하고 대신 중복 ( D) 및 삼중 ( Ð)을 사용하십시오.

설명:

¥             # Calculate the deltas of the input-array
              #  i.e. [1,2,3,5,6,7,9] → [1,1,2,1,1,2]
 D            # Duplicate it
  η           # Push all its prefixes
              #  [1,1,2,1,1,2] → [[1],[1,1],[1,1,2],[1,1,2,1],[1,1,2,1,1],[1,1,2,1,1,2]]
v             # For-each over these prefixes
 Ð            #  Triplicate the (duplicated) deltas-list
  NƒÁ}        #  Rotate the deltas-list N+1 amount of times,
              #  where N is the prefix index (== prefix_length-1)
              #   i.e. [1,1,2] and [1,1,2,1,1,2] (rotate 3 times) → [1,1,2,1,1,2]
      Q       #  If the rotated deltas and initial deltas are equal
              #   [1,1,2,1,1,2] and [1,1,2,1,1,2] → 1
       D—#    #  Print the current prefix-list, and stop the for-each loop

1
여기 9가 있습니다 (알파가 다르기 때문에 별도의 대답이지만 ¥ η를 공유합니다).
Grimmy

@ 그림은 내 05AB1E 답변을 모두 겪고 각각의 골프, 하하? ; p 좋은 대답이지만 (아직 다시) +1.
케빈 크루이 센

1
그들 모두가 아니라, 나는 이 게시물에 링크 된 것을 통해 가고 있습니다.
Grimmy

@Grimy Ah 알았어. :)
Kevin Cruijssen

1

하스켈, 107 바이트

let i=map(uncurry(-))$zip(tail x)(init x)in head$filter(\s->take(length i)(concat$repeat s)==i)(tail$inits i)

x는 입력 배열입니다.


특히 PPCG와 Haskell 골프에 오신 것을 환영합니다! 입력 값이 특정 변수에 있다고 가정 할 수는 없지만 앞에 추가하면 쉽게 수정할 수 있습니다 f x=. Prelude의 일부가 아니기 때문에 initsrequires 의 사용 import Data.List: 온라인으로 사용해보십시오!
Laikoni

그러나 꽤 많은 바이트를 절약 할 수 있습니다 . 목록 중 하나가 다른 목록보다 길면 자동으로 잘 리기 때문일 (init x)수 있습니다 . 그리고 내장은 존재한다 : . 대신 패턴 가드를 사용할 수 있습니다 . xzipmap(uncurry(-))$zipzipWith(-)f x=let i=...inf x|i<-...=
Laikoni

또한 당신은 대신에 지능형리스트를 사용할 수 있습니다 filter, !!0대신 headcycle대신 concat$repeat: 온라인으로보십시오!
Laikoni

@Laikoni 개선해 주셔서 감사합니다! 맞습니다. 제 코드에는 함수 선언과 Data.List.inits에 대한 가져 오기가 필요합니다. 그러나 코드 길이에 추가해야하는지 궁금합니다. 다른 코드 샘플 중 일부는 추가 코드에 의존하기 때문에 묻습니다.
misja111 2016 년

예, 해당 바이트가 점수에 포함되는 것이 일반적으로 합의입니다. 하스켈 에는 이러한 대부분의 경우를 다루는 골프 규칙에 대한 안내서가 있습니다.
Laikoni 2016 년

1

Stax , 8 6 바이트

░»F\☺»

실행 및 디버깅

작동 방식을 보여주기 위해 압축이 풀린 주석이 달린 버전이 있습니다.

:-  pairwise differences
:(  all leftward rotations of array
u   keep only unique rotations
mh  output the first element from each unique rotation

이것을 실행


1

펄 6 , 57 바이트

{~(.rotor(2=>-1).map:{.[1]-.[0]})~~/^(.+?){}" $0"+$/;~$0}

그것을 테스트

출력은 공백으로 구분됩니다 ("1 1 2" )

넓히는:

{      # bare block lambda with implicit parameter $_

  ~(   # stringify (space separated)

    .rotor( 2 => -1 )     # from the input take 2 backup 1, repeat
    .map: { .[1] - .[0] } # subtract each pair to find the differences
  )

  ~~   # smartmatch

  /    # regex

    ^  # beginning of string

    ( .+? ) # match at least one character, but as few as possible
    {}      # make sure $0 is set (probably a compiler bug)
    " $0"+  # match $0 one or more times (with a leading space)

    $  # end of string
  /;

  ~$0  # return the stringified $0
}

첫 번째 부분 전체가 될 수 있습니다~(.skip Z-$_)
Jo King

1

05AB1E , 9 바이트

¥©η.ΔÞ®Å?

설명:

          # take input implicitly
¥         # deltas, eg [4, 5, 7, 8, 10] -> [1, 2, 1, 2]
 ©        # save this to the global register
  η       # prefixes, eg [1, 2, 1, 2] -> [[1], [1, 2], ...]
   .Δ     # find the first one such that
     Þ    # cycled infinitely, eg [1, 2] -> [1, 2, 1, 2, ...]
       Å? # starts with
      ®   # the global register
          # and implicitly print the found element

대체 9 바이트 :

¥η.ΔÞ.¥-Ë

동일한 알고리즘이지만 델타 목록과 비교 (저장 / 복원해야 함)하는 대신 해야하는) )를 사용한 다음 (암시 적) 입력과 비교합니다.

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


0

K4 , 30 바이트

해결책:

(*&d~/:c#'(!c:#d)#\:d)#d:1_-':

예 :

q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20
3 1 1 1
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17
1 1 2
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28
3 4 1 1
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41
5 2
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47
4 4 3 4
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':5 6 7
,1

설명:

우리가 해결하려는 것에 무겁게 보입니다. 입력의 델타를 얻은 다음 시퀀스를 작성하고 일치하는 가장 짧은 것을 결정하십시오.

(*&d~/:c#'(!c:#d)#\:d)#d:1_-': / the solution
                           -': / deltas 
                         1_    / drop first
                       d:      / save as d
                      #        / take (#) from
(                    )         / do this together
                 #\:d          / take (#) each-left (\:) from d
          (     )              / do this together
              #d               / count length of d
            c:                 / save as c
           !                   / range 0..c-1
       c#'                     / take c copies of each
   d~/:                        / d equal (~) to each right (/:)
  &                            / where true
 *                             / first one


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