50,000 미만의 스 네이 킹 번호 목록 만들기


24

스 네이 킹 넘버 챌린지

나는 1에서 50,000 사이의 많은 스 네이 킹 숫자가 궁금합니다.

노키아에 뱀

이 게임에서 Snaking Numbers는 하나의 키를 위, 아래, 왼쪽 또는 오른쪽으로 이동하여 기존 숫자 키패드 (아래 형식)에 입력 할 수있는 숫자입니다.

7 8 9
4 5 6
1 2 3
 0

예를 들어 숫자 5로 시작하는 경우 다음 유효한 이동으로 4, 6, 8 또는 2를 선택할 수 있습니다. 그러나 7, 3, 9 및 1은 현재 키에 대각선으로 위치하므로 제한이 없습니다. . 따라서 5, 2가 있으면 다음으로 실행 가능한 키 선택은 다시 0, 1, 3 또는 5입니다.

이 코드 골프 연습에서는 1에서 50k 사이의 모든 양의 스 네이 킹 숫자 목록과 기준을 충족하는 모든 숫자의 최종 개수를 출력해야합니다.

규칙

  1. 숫자는 0으로 시작할 수 없습니다.
  2. 숫자는 전체 양의 정수 여야합니다.
  3. 왼쪽에서 오른쪽으로 읽는 각 연속 번호는 숫자판 주위에서 "뱀"이어야합니다.
  4. 뱀은 키를 가로 질러 대각선으로 이동할 수 없습니다
  5. 숫자 0은 숫자 1과 2 모두에서 액세스 할 수 있습니다.
  6. 숫자는 페어링 할 수 없습니다 (예 : 22)

유효한 스 네이 킹 숫자의 예 :

12369
45201
1254
10102
1
12
987

유효하지 않은 숫자의 예

1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159  - snake cannot travel diagonally
4556 - duplicate 5

일반적인 코드 골프에 따르면 목표는 가장 적은 바이트입니다!

나의 수학과 규칙에 따르면, 당신은 당신의 목록에 670 개의 유효한 스 네이 킹 숫자를 가지고 있어야하며 670 자체가 마지막 숫자로 인쇄되어 있어야합니다.


2
출력을 정렬해야합니까? 아니면 어떤 순서로든 허용됩니까?
tsh

2
고정적이고 유한 한 정수 세트를 출력하도록 요청하면서 스펙에 전체 목록을 포함시키는 것이 좋습니다.
얽히고 설킨


4
이것은 A215009 의 부분 집합입니다 .
bigyihsuan

670을 먼저 인쇄해도 괜찮 습니까?
dana

답변:


14

K (ngn / k) , 60 57 바이트

(x;#x:{*/1=3!5&+/x*x:+1_-':(+0 1,'2*!3 3)@10\x}#1+!50000)

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

!500000.. 목록49999

1+ 모두에게 1을 더하다

{ }# 기능을 가진 필터 { }

10\x 인수의 10 진수

( )@ 지수로 사용 ...

  • !3 3 한 쌍의 목록 : (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)

  • 2* 모두 2 곱하기

  • 0 1,'0첫 번째 목록과 1두 번째 목록 앞에 추가

  • +전치 (목록 쌍-> 쌍 목록). 이것은 우리에게 대략적인 버튼 좌표를 제공합니다.

-':각 쌍에서 이전 쌍을 뺍니다. 0 0첫 번째 이전의 가상 요소로 사용 하십시오.

1_ 첫 번째 드롭

+ 바꾸어 놓다

x*x:제곱 (에 할당 x하고 곱하기 x). 다음 x은 한 쌍의 목록입니다-∆xs 및 ∆ys

+/ 두 목록을 합산하십시오 (요소별로)

5& 5 분

3! 모드 3

1= 1과 동일한 부울 목록

*/ 제품 (부울 "및")

(x;#x: )결과 쌍과 결과 길이 ( #)를 만듭니다.


9

젤리 ,  24  23 바이트

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL

모든 결과 목록과 결과 수를 인쇄하는 전체 프로그램입니다.

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

방법?

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL - Main Link: no arguments
5ȷ4                     - 5*10^4 = 50000
   µ              µÐḟ   - filter discard those for which this is truthy:
                        -                  e.g.: 8520        ... or           4559 
    D                   -   decimal digits       [8,5,2,0]                    [4,5,5,9]
      1.                -   literal 1.5
     o                  -   logical OR           [8,5,2,1.5]                  [4,5,5,9]
        ’               -   decrement            [7,4,1,0.5]                  [3,4,4,8]
         d3             -   div-mod by 3         [[2,1],[1,1],[0,1],[0,0.5]]  [[1,0],[1,1],[1,1],[2,2]]
           Z            -   transpose            [[2,1,0,0],[1,1,1,0.5]]      [[1,1,1,2],[0,1,1,2]]
            I           -   deltas               [[-1,-1,0],[0,0,-0.5]]       [[0,0,1],[1,0,1]]
             A          -   absolute value       [[1,1,0],[0,0,0.5]]          [[0,0,1],[1,0,1]]
              S         -   sum (vectorises)     [1,1,0.5]                    [1,0,2]
               Ċ        -   ceiling              [1,1,1]                      [1,0,2]
                ’       -   decrement            [0,0,0]                      [0,-1,1]
                 Ẹ      -   any?                 0 (i.e. keep)                1 (i.e. discard)
                     Ṅ  - print and yield
                      L - length
                        - implicit print

나는 이것이 어떻게 작동하는지 알고 싶습니다. 당신은 고장을 줄 수있는 기회가 있습니까?
MightBeAlon

1
@MightBeAlon은 나중에 할 것입니다 ...
Jonathan Allan

궁금합니다. 1.평가 방법은 1.5무엇입니까?
무지의 실시

마침표를 잃어버린 문자를 파싱하는 동안의 무지의 구현은 5로 간주됩니다. 인터프리터 .py에서 parse_literal의 else 절을
Jonathan Allan

7

파이썬 3 , 140 바이트

f=lambda s:''==s[1:]or s[1]in'10021234562216565878 43 749 9   5  8'[int(s[0])::10]and f(s[1:])
print(*filter(f,map(str,range(1,50000))),670)

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

누군가가 조회 문자열 대신 표현식 으로이 작업을 수행 할 수 있다고 생각합니다.



5

자바 스크립트 (V8) ,  112106104  바이트

@NahuelFouilleul 덕분에 2 바이트 절약

전체 프로그램.

for(n=0;++n<5e4;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n)
print(670)

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

또는 역순으로 숫자를 출력 할 수있는 경우 96 바이트 :

for(n=5e4;n--;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n||670)

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


이미 문자열에 3있기 때문에 마지막을 제거하는 작품36
Nahuel Fouilleul

@NahuelFouilleul 잘 잡아라. 감사!
Arnauld

1
또한 6589632145201478한 바이트 짧은
나우 Fouilleul

4

Stax , 37 35 바이트

ü╞╡~▄ⁿ♪eµïê◙ü╔ï▼ΔJr¥æ≤PH╟♀I♣Δz8─¶Γ╞Ç▓

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

그렇지 않을 때까지 너무 좋고 짧았습니다.

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

49999{E2B{{om"#qYY>!(AFI"%A|E2B{{om-C_Qf%p
49999{                                 f      Filter range [1..49999]:
      E2B                                       All adjacent pairs of digits
         {{om                                   Each sorted
             "#qYY>!(AFI"%A|                    Literal 2012365478963258741
                            E2B{{om             Pairs of digits, each sorted
                                   -            Set difference
                                    C           Cancel block execution if any remain
                                     _Q         Print current value
                                        %p    Print length

2012365478963258741이 키패드를 인코딩합니다. 인접한 숫자 쌍을보십시오. 아마도 각 쌍에 대해 양방향으로 진행되는 상당히 짧은 대안을 얻을 수 있다면 8 바이트를 줄일 수 {{om있습니다.

그 뒤 670없이, 간단한 필터는 충분 : f..!대신 {..C_Qf%p. 이 불규칙성을 처리하는 더 좋은 방법이있을 수 있습니다. 두 경우 모두이 필터 범위 동작은 문서화되어 있지 않습니다.


문서 간격에 대해 죄송합니다. FWIW는 다음 릴리스 1.1.7에 포함될 것입니다. stax.tomtheisen.com 에서 미리보기를 볼 수 있지만 비밀이므로 아무에게도 말하지 마십시오. ;)
재귀

3

PHP , 145 바이트

for(;$i++<5e4;$f&&print$i._)for($f=1,$l=b;''<$d=("$i")[$$i++];$l=$d)$f&=$l>a||strstr([12,240,1053,26,157,2468,359,48,579,68][$l],$d)>'';echo 670;

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

1에서 50,000까지의 모든 숫자에 대해 왼쪽에서 오른쪽으로 해당 숫자의 모든 숫자를 확인합니다. 모든 자릿수가 이전 자릿수의 유효한 자릿수 목록에 있으면 해당 숫자가 인쇄됩니다. 결국 실제로 계산하는 것보다 적은 바이트를 사용하므로 하드 코딩 된 670을 인쇄합니다.


3

05AB1E , 23 바이트

ŽÅKLʒSÌYX;:3‰üαï€OP}=g=

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

조나단 앨런 항의 젤리 답변 .


1
아, 50000을 3 바이트로 압축하는 것이 현명합니다. 사용 중이 ₄50*거나 4°5*더 일찍 시도하고있었습니다. 그리고 처음에 나는 왜 당신이 €OP그냥 대신에 왜 혼란 OP스러웠지만, 한 자리 숫자 (다음에 빈 목록이 됨 üα)가 [] → 0 → 0대신에 있음을 깨달았습니다 [] → [] → 1. :)
Kevin Cruijssen

1
@KevinCruijssen 왜 4°5*언제 할 수 5°;있습니까? 그래도 ZAK가 더 좋습니다. 그리고 네 자리 숫자의 경우는 고통입니다.
그리미

3

펄 5 ( -M5.01), 96 , 92 바이트

@Xcali 덕분에 -4 바이트

$r=join"|",map$t++."[^$_]",12,240,1350,26,157,2648,359,48,579,68;map/$r/||say,1..5e4;say 670

TIO



감사합니다, 첫 번째 답변이 긍정적으로 일치했기 때문에 지나치게 복잡했습니다
Nahuel Fouilleul

3

자바 스크립트 (의 SpiderMonkey) , 179 (173) 151 (129) 바이트

[12,240,1350,26,157,2468,359,48,579,68].map((_,i,l)=>i&&(f=(v,t)=>print(v)|v<5e3&&[...l[t]+''].map(k=>f(v+k,k)))(i,i)),print(670)

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

-22 바이트는 Arnauld에게 감사합니다 -22 바이트는 dana에게 감사합니다

설명:

[12,240,1350,26,157,2468,359,48,579,68] 
// an array where keys are current position and values, the possible destinations
.map((_,i,l)=>                    // loop over it
    i&&(                          // if key is not 0
        f=(v,t)=>                 // create a function
                 print(v)|        // which print the value
                          v<5e3&& // and if the limit is not attained
                                 [...l[t]+''].map(k=>f(v+k,k)) 
                    // recurcively call itself with for each destinations
                                                              )(i,i)),
                    // make the first call with each digit
print(670) // finally print 670

@dana는 670을 먼저 인쇄 할 수 있다면 123 바이트 솔루션을 제공했습니다.

[21,420,5310,62,751,8642,953,84,975,86].map((_,i,a)=>(f=(v,t)=>print(i?v:640)|i&v<5e3&&[...a[t]+''].map(k=>f(v+k,k)))(i,i))

@Arnauld 감사합니다이 규칙을 잊어 버렸습니다
jonatjano



640을 먼저 인쇄 할 수있는 경우 123 입니다.
dana


2

Stax , 28 26 바이트

Δh┤♣É╦&·é╝n$K»à¶▲v═NÆ;↨m≥8

실행 및 디버깅

포장을 풀고 포장을 풀고 주석을 달았습니다.

G               Call to unbalanced trailing '}', then resume here
670P            Print 670
}               Call target
219J            219 squared (47961)
f               Filter 1-based range by the rest of the program; implicitly output
  $2B           Convert to string and get adjacent pairs; e.g. 213 -> ["21", "13"]
  O             Push 1 under list of pairs
  F             Iterate over pairs, using the rest of the program
    o           Order each pair; e.g. "21" -> "12"
    "{<f:[/T8Z" string literal with code points [123 60 102 58 91 47 84 56 90]
    $           concate as string i.e. "12360102589147845690"
    s#          How many times does the current pair appear in the constant string?
    *           Multiply this by running total.  Any zero will cause the result to be zero.

이것을 실행

비밀 소스는 문자열 리터럴에 "{<f:[/T8Z"있습니다. 모든 코드 포인트를 함께 방해하면 얻을 수 12360102589147845690있습니다. 이 문자열의 오름차순 쌍은 유효한 뱀 ​​이동입니다.


1
15JJ대신 219J잘 작동하지만에 대한 1 바이트 상수가 없으면 거기에서 어떤 바이트도 골프를 칠 수 있다고 생각하지 않습니다 15.
Arnauld


1

, 42 바이트

≔ΦI…·¹×⁵⁰φ⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θθILθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔ΦI…·¹×⁵⁰φ

캐스트에서 문자열 1로 의 포함 범위를 처리하십시오 50,000.

⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θ

압축 문자열에 포함되지 않은 숫자 쌍이있는 것을 필터링하십시오 01478963202125458565236987410.

θILθ

나머지 배열과 길이를 출력합니다.



1

펄 6 , 64 바이트

{670,grep {[+&](:36<12HGX91H8VCL3MG0FDVQ>X+>m:ov/../)%2},1..5e4}

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

설명

{670,grep {...},1..5e4}  # Meet questionable output requirements

# Actual decision problem

     :36<12HGX91H8VCL3MG0FDVQ>  # Bit field of allowed transitions
                                # encoded in base 36
                                 m:ov/../  # All 2-digit substrings
                              X+>  # Right shift by each substring
                                   # (implicitly converted to an integer)
[+&](                                    )  # Binary and
                                          %2  # Modulo 2

그것은 유감 ~>그렇지 않으면 당신은 비트 필드가 문자열 인 상태, 단지 문자열 연산자를 사용하여이 작업을 수행 할 수있을 것, 아직 구현되지 않은
조 왕

1

Pyth , 68 65 45 바이트

l
f.Am}dCtB+J`65874589632012541_PJCtB`TS50000

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

수정 된 조회 프로세스에 대한 영감은 Khuldraeseth na'Barya의 Stax 답변 에서 나왔습니다 .


편집 2 : 이전 버전의 바이트를 저장하기 위해 다시 작성 :

l
f.Am}ed@c"12 024 0135 26 157 2468 359 48 579 68";shdCtB`TS50000

편집 : 문자열 조회를 사용하여 3 바이트 골프, 이전 버전 :

l
f.Am}ed@sMMc"12 024 0135 26 157 2468 359 48 579 68";hdCtBjT;S50000
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.