일치하는 연속 쌍이없는 ID 생성기


16

2 개의 입력 (m = 최소 시작 id , n = id 수)이 주어지면 > = m에서 시작하여 순차적 인 ID 목록을 생성합니다.> = m은 2 개의 연속 된 숫자가 같지 않은 숫자 0-9 (예 : 1232)입니다. 좋아, 1233은 아닙니다 (서로 2 '3이 들어 있습니다).

m = 985, n = 6의 경우 아래에서 생성 / 건너 뛰는 ID를 보여줍니다.

...
985 - ok, 1st
986 - ok, 2nd
987 - ok, 3rd
# skip 0988 (contains '88')
989 - ok, 4th
# Skip 099x (contains '99')
# Skip 100x (contains '00')
1010 - ok, 5th
# Skip 1011 (contains '11')
1012 - ok, 6th
...

산출

위의 순서대로 각 ID는 새 줄에 인쇄되어야합니다.

985
986
987
989
1010
1012

규칙

표준 코드 골프 규칙, 최저 바이트 수로 승리


14
PPCG에 오신 것을 환영합니다! 각 ID는 출력을 특정 형식으로 명시 적으로 제한하지 않는 새로운 줄에 인쇄해야 합니다.
Outgolfer Erik

3
stdout으로 인쇄하는 대신 ID 목록 (예 : 1 차원 정수 배열)을 반환해도됩니까?
JungHwan Min

4
@ user202729이 경우에는 답변이 무효화되지 않습니다.
Outgolfer Erik

2
@ user202729 답변을 무효화하지 않습니다 ... 답변이 있으면 답변이 수정되거나 기존 규칙을 따릅니다.
완전히 인간적인

3
골프 언어로 작성된 사람들에게는 더 많은 출력 형식을 허용하도록 규칙을 변경해도 영향을 미치지 않습니다. 나머지는 출력 형식이 더 이상 제한되지 않는다는 의견을 남길 수 있습니다.
브래드 길버트 b2gills

답변:


3

젤리 , 6 바이트

DIẠµ#Y

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

어떻게 작동합니까?

DIẠµ # Y – 전체 프로그램. 인수 : X와 Y의 두 정수

   µ # – 다음을 만족하는 X 이상의 첫 번째 Y 정수를 반환합니다.
 I – 증분 ...
D – ... 10 자리 중 ...
  Ạ – ... 모두 0이 아닙니다. 
     Y – 줄 바꿈으로 결과에 참여합니다.

8

Brachylog , 11 10 바이트

{≤ṫẹ~ḅẉ}ᶠ⁾

입력은 두 숫자의 목록입니다. 온라인으로 사용해보십시오!

설명

내장 은과 같은 목록이나 문자열 을 가져 와서 "1000220"같은 인접 요소의 블록으로 나눕니다 ["1","000","22","0"]. 이 프로그램에서 ~연산자를 적용하면 역순으로 작동합니다. 문자열 목록을 가져와 각 문자열이 단일 문자의 반복으로 구성되어 있는지 확인하고 인접한 문자열은 다른 문자를 가지며 목록을 연결합니다. 술어 는 첫 번째 입력부터 시작하여 숫자를 증가하는 순서로 열거하고 조건을 확인하여 조건을 만족하는 항목을 인쇄하고 충분히 찾았을 때 중지합니다.

{≤ṫẹ~ḅẉ}ᶠ⁾  Input is a pair, say [M=988,N=3].
{      }ᶠ⁾  Apply this predicate to M and compute the first N results.
 ≤          Take a number that is greater than or equal to M (first up is 988).
  ṫ         Convert it to string: "988"
   ẹ        Split it into substrings of length 1: ["9","8","8"]
     ~ḅ     Apply ḅ in reverse: fails, try next number.
       ẉ    If ḅ succeeds, print the resulting string and a newline.
            This counts as a result of the predicate.

6

05AB1E , 9 바이트

µÐÔQi=¼}>

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

확장

µ           # loop until counter equals n
 Ð          # triplicate current value (initially m)
  Ô         # connected uniqueified on the copy at the top of the stack
   Q        # compare to unmodified for equality
    i  }    # if true
     =      # print current value while leaving it on the stack
      ¼     # increment the counter
        >   # increment current value

4

자바 8, 83 바이트

(m,n)->{for(;n>0;m++)if(!(m+"").matches(".*(.)\\1.*")){System.out.println(m);n--;}}

설명:

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

(m,n)->{                      // Method with two integer parameters and no return-type
  for(;n>0;                   //  Loop as long as `n` is larger than 0
      m++)                    //    After every iteration: increase `m` by 1
    if(!(m+"").matches(".*(.)\\1.*")){
                              //   If there are no repeated adjacent digits:
      System.out.println(m);  //    Print `m`
      n--;}}                  //    And decrease `n` by 1

아주 좋아요 호기심에서이 문제가 "바이트"가 아니라 "효율"인이 질문에 대한 적절한 포럼은 어디에 있습니까?
beirtipol

1
@beirtipol 가장 효율적인 방법은 가장 빠른 실행 시간을 의미합니까? 이 경우 PPCG에서도 code-challenge 및 fast -code 태그 가 사용 됩니다. 지금 똑같은 도전을 게시 빠른 코드에 코드 골프를 변경하더라도 아마 아직도 속는 사람으로 종료됩니다 ..
케빈 Cruijssen에게

3

PowerShell , 59 바이트

param($m,$n)for(;$n){if("$m"-notmatch"(.)\1"){$m;$n--}$m++}

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

기본적으로 다른 답변과 비슷합니다. 인쇄 할 숫자가 남아있는 한 루프 ( for(;$n))는 두 자리 숫자와 정규 표현식이 일치하는지 테스트하고 그렇지 않은 경우 파이프 라인에 배치하고 감소시킵니다 $n. 그런 다음 증가 $m하고 다시 반복합니다. 파이프 라인에서 요소를 가져오고 암시 적 Write-Output으로 줄 바꿈으로 구분 된 출력을 무료로 제공합니다.


3

R , 111 92 71 바이트

function(m,n)while(F<n){if(!grepl("(.)\\1",m)){cat(m,'
');F=F+1}
m=m+1}

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

grepl반복되는 숫자를 검색하는 데 사용 합니다.


개행으로 결과에 참여하지 않으며, 이것이 허용되는 경우 OP가 응답하지 않습니다 (괜찮아도
좋겠지 만

@ Mr.Xcoder 아, 맞아, 나는 그것을 발견하고 잘못된 버전을 복사하여 붙여 넣었습니다. (
Giuseppe



2

펄 6 , 56 바이트

{.put for grep({none .comb Zeq.comb.skip},$^a..*)[^$^b]}

시도 해봐

넓히는:

{  # bare block lambda with placeholder params $a $b

  .put for

  grep(

    {
      none          # create a none junction (True if all are False)

        .comb       # the input split into digits
        Zeq         # Zip using &infix:«eq» operator
        .comb.skip  # the input split into digits starting at second one
    },

    $^a .. *        # a Range starting at the first argument

  )[ ^ $^b ]        # take the first $b values
}

2

망막 , 34 바이트

.0A`
"$+"{\/(.)\1/{`.+
*
)C`
.+
*

온라인으로 사용해보십시오! nm별도의 라인 입력 등. 설명:

.0A`

자동 출력을 끄고 n작업 버퍼에서 삭제 하십시오.

"$+"{

n시간을 반복하십시오 .

\

m다음 반복 그룹의 끝에 있는 값을 인쇄하십시오 .

/(.)\1/{`

연속 숫자가있는 동안 루프합니다.

.+
*

단항으로 변환합니다.

)C`

빈 문자열의 수를 세십시오. 이는 문자 수보다 하나 이상이므로 1을 더하고 10 진수로 다시 변환합니다. 내부 루프가 종료됩니다.

.+
*

를 인쇄 m한 후 같은 방법으로 1을 다시 추가하십시오. 마지막 행은 마지막 행 C`의 기본 스테이지 유형이므로 필요하지 않습니다 . 외부 루프는 내재적으로 종료됩니다.

단항으로 변환하고 다시 소수로 변환하는 것은 약간 느립니다. 변환하지 않는 버전 인 39 바이트 :

.0A`
"$+"{\/(.)\1/+`.+
$.(*__
.+
$.(*__

온라인으로 사용해보십시오! 설명 : $.(실제로 대체하지 않고 나머지 대체의 길이를 계산합니다. 길이 *_는 내재적으로 일치하는 값이고 길이 _는 물론 1이므로 값을 증가시킵니다.


2

Perl 5.10.0 + -n, 40 39 바이트

for(;$i;$_++){!/(.)\1/&&$i--&&say}$i=$_

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

Xcali 덕분에 -1 바이트

두 줄에 먼저 n을 입력 한 다음 m을 입력합니다. m 다음에 줄 바꿈이 없는지 확인하십시오.

(echo '6'; echo -n '985') | perl -nE 'for(;$i;$_++){!/(.)\1/&&$i--&&say}$i=$_'

1
바이트를 저장하기 위해 'm'을 제거 할 수 있습니다.
Xcali

@Xcali 감사합니다, 내가 무슨 생각을했는지 몰라요
wastl



1

하스켈 , 70 바이트

nimi 덕분에 -19 바이트

s#n=unlines$map show$take n$filter(and.(zipWith(/=)=<<tail).show)[s..]

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

줄 바꿈으로 분리하는 데 사용되는 17 바이트.



개행으로 결과에 참여하지 않으며, 이것이 허용된다면 OP는 응답하지 않았습니다. (괜찮아도
좋겠지 만

@ Mr.Xcoder Agh, 고정 ...
전적으로 인간

1
mapM및 을 사용할 수 있습니다 print. 온라인으로 사용해보십시오!
nimi

1

Stax , 9 8 바이트 CP437

ç@F6╕↔┤ú

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

그의 젤리 답변에서 @ Mr.Xcoder의 알고리즘과 일치합니다.

@recursive에 의한 주석 당 -1 바이트.

설명

압축을 푼 형식을 사용하여 설명합니다.

{$:-|A}gn
{     }gn    Generator, generate given number of values, using block as a filter
                 And implicit output, one element on a line.
             In Stax, only 0 and [] is falsy.

 $           Convert the number to string
  :-         Difference between contiguous digit
    |A       All of them are truthy (may use `:*` as well)

staxlang.xyz/… 는 8 바이트를 제공합니다. 암시 적 평가는 표준 입력의 첫 번째 줄에있는 한 여러 값에서 작동합니다.
재귀

@recursive 감사합니다. 문서화되었지만 눈치 채지 못한 부분입니다.
Zhou

1

하스켈 , 94 93 91 바이트

Laikoni 덕분에 -1 바이트 Zgarb 덕분에
-2 바이트

import Data.List
a!0=[]
a!b|all(null.tail)$group$show a=show a++'\n':(a+1)!(b-1)|c<-a+1=c!b

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

퍼스트 하스켈 골프.


1
하스켈 골프에 오신 것을 환영합니다! group(show a)일 수 있습니다 group$show a.
Laikoni

2
(<2).length가능null.tail
Zgarb





0

AWK , 90 바이트

{for(j=$1;k<$2;j++){for(a=b=d;++b<=(n=split(j,A,""))&&a!=c=A[b];a=c);if(n<b&&++k)print j}}

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

이것은 내가 생각했던 것보다 훨씬 추악합니다. 이 응용 프로그램에 사용하기가 매우 효율적이지 않은 기능에 AWK역 치환 만 있음을 발견했습니다 gensub.

따라서 이것은 ID 카운터를 증가시키고 각 문자에서 카운터를 분할하고 문자를 반복하여 문자가 이전 문자와 동일한 지 확인하는 매우 간단한 접근 방식입니다. 반복되는 문자가 없으면 ID 카운터를 인쇄하고 인쇄 된 ID 수를 늘리십시오.

나는 " AWK보다 강력한 정규 표현식을 수행 할 수있는 능력을 가져야한다 "라는 문구를 따라 진술 하지는 않겠지 만 어려울 것이다.




0

, 22 바이트

--aLb{W`(.)\1`N++a0Pa}

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

설명

--aLb{W`(.)\1`N++a0Pa}
                        a,b are command-line arguments
--a                     Decrement a
   Lb{               }  Loop b times:
       `(.)\1`           Regex matching a character followed by itself
      W       N++a       While that regex matches in incremented a:
                  0       No-op
                   Pa    When the while loop exits, a is a valid ID; print it
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.