숫자를 기억하기 쉬운


41

기억하기 쉽지만 이론적으로 쉽게 만들 수없는 숫자

다음 기준에 맞는 균일 한 난수를 생성하는 모든 언어로 프로그램 / 기능을 작성해야합니다.

  1. 길이5 자리입니다

  2. 두 개의 분리 된 반복 숫자 쌍이 있습니다

  3. 반복되는 한 자릿수는 시작 또는 끝에 있고 숫자는 서로 옆에 있습니다.

  4. 홀수는 다른 숫자 쌍으로 둘러싸여 있습니다.

  5. 두 자리 숫자와 다른 숫자는 모두 고유해야합니다

  6. 귀하의 재량에 따라 프로그램은 앞에 0이있는 숫자를 지원할 수도 있습니다. 선행 0이 지원되는 경우 6088이 아닌 06088이 출력에 포함되어야합니다. 선행 0이 지원되지 않으면 06088과 같은 숫자가 전혀 생성되지 않아야합니다.

테스트 사례

허용되는 출력 :

55373
55494
67611
61633
09033
99757
95944
22808
65622
22161

허용되지 않는 출력 :

55555
77787
85855
12345
99233
12131
에이 비 씨 디이
5033

더 많은 테스트 사례는 이 pastebin 링크 에서 찾을 수 있습니다 .

이것들은이 파이썬 프로그램으로 만들어졌습니다.

무작위 가져 오기
범위 (100)의 i의 경우 :

    random.randint (0,100)> = 50 인 경우 : # 참이면 처음에 닿는 풋 풋
        temp = [] # 워킹 배열
        temp.append (random.randint (0,9)) # 무작위 숫자 추가
        temp.append (temp [0]) # 같은 숫자를 다시 추가하십시오

        x = random.randint (0,9)
        x == temp [0] 동안 :
            x = random.randint (0,9)
        temp.append (x) # 다른 고유 숫자 추가

        y = random.randint (0,9)
        y == temp [0] 또는 y == temp [2] 동안 :
            y = random.randint (0,9)
        temp.append (y) # 다른 고유 숫자와 이전 고유 숫자를 추가합니다
        온도 추가 (x)

    else : # 끝에 페어 터치
        temp = [] # 워킹 배열  
        temp.append (random.randint (0,9)) # 무작위 숫자 추가

        # 독특하지는 않지만 다시 시도하십시오.
        x = random.randint (0,9)
        x == temp [0] 동안 :
            x = random.randint (0,9)
        temp.append (x) # 다른 고유 숫자 추가


        temp.append (temp [0]) # 같은 0 번째 숫자를 다시 추가하십시오


        y = random.randint (0,9)
        y == temp [0] 또는 y == temp [1] 동안 :
            y = random.randint (0,9)
        temp.append (y) # 다른 고유 숫자를 두 번 추가
        온도 추가 (y)

    tempstr = ""
    내가 온도에 :
        tempstr + = str (i)
    인쇄 유혹

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


5
"Truthy"와 "Falsy"대신 "가능한 출력 (확률> 0)"및 "가능한 출력 (확률 = 0)"을 제안합니다. ).
Khuldraeseth na'Barya

9
0으로 시작하는 09033과 같은 출력을 인쇄해야합니까?
xnor

3
확률이 균일하면 질문에 지정할 수 있습니다. 기본적으로 random균일하지 않습니다
Jo King

3
이해를 돕기 위해 99233을 추가하십시오
l4m2

3
PPCG에 오신 것을 환영합니다! 좋은 첫 번째 도전.
Jonathan Allan

답변:


21

05AB1E , 11 바이트

žh.r3£ûÁÂ)Ω

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

설명

žh            # push "0123456789"
  .r          # random shuffle
    3£        # take the first 3
              # EX: 152
      û       # palendromize
              # EX: 15251
       Á      # rotate right
              # EX: 11525
        Â)    # pair with its reverse
              # EX: [11525, 52511]
          Ω   # pick one at random

Emigna ha ... 가 최고의 답변 +1을 보고 있는지 궁금합니다 .
Magic Octopus Urn

9

CJam (16 바이트)

YmrG*98+ZbA,mrf=

온라인 데모

참고 : "고유 한"OP는 실제로 "고유 한"을 의미한다고 가정했습니다.

16 바이트도 :

98ZbA,mrf=W2mr#%
98ZbA,mrf=_W%]mR

해부

Ymr    e# Select a random number from [0 1]
G*98+  e# Multiply by 16 and add 98 to get 98 or 114
Zb     e# Base conversion in base 3 to get [1 0 1 2 2] or [1 1 0 2 0]
A,mr   e# Shuffle the numbers from 0 to 9
f=     e# Map "select the item at this index"

다른 변형은를 사용하여 생성 [1 0 1 2 2]한 다음 결과 또는 그 반대를 선택합니다.


9

펄 5 , 81 63 56 바이트

@DomHastings에서 영감을 얻은 7 바이트 컷

적절한 패턴에서 숫자를 구성합니다.

@q{0..9}++;say+(keys%q)[.5>rand?(2,2,0,1,0):(0,1,0,2,2)]

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


펄 5 , 89 바이트

기준에 맞는 숫자를 찾을 때까지 임의의 5 자리 숫자를 선택합니다.

$_=sprintf'%05d',0|rand 1E5until(/(.)\1(.)(.)\2/||/(.)(.)\1(.)\3/)&&$1-$2&$2-$3&$1-$3;say

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


임의성을 위해 해시 키를 사용하는 멋진 트릭! 엣지 케이스를 놓쳤을 수도 있지만 이것이 -8과 동일하다고 생각합니다 ... 온라인으로 사용해보십시오!
Dom Hastings

1
해시 무작위 화. 훌륭한! 더 짧음
Ton Hospel

문제는 time%2사용자의 통제하에 있기 때문에 충분히 임의적 인지 여부 입니다.
Xcali

@Xcali 당신이 한 번만 사용하는 한 괜찮다 는 것이 합의 된 것 같습니다 .
FryAmTheEggman

8

파이썬 2 , 80 바이트

from random import*
a,b,c=sample(range(10),3)
print[a,a,b,c,b][::choice((-1,1))]

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

자릿수 목록을 출력합니다.

파이썬 2 , 83 바이트

from random import*
a,b,c=sample('0123456789',3)
print(a*2+b+c+b)[::choice((-1,1))]

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

출력은 숫자입니다.


불균일 한 임의성이 기본적으로 허용되는 경우 (질문이 지정되지 않은 경우) 역도를 샘플링하여 바이트를 절약 할 수 있습니다. 온라인으로 시도하십시오! 편집 : 신경 쓰지 말고 사양에 균일 성이 편집 된 것을 봅니다. 이 접근법이 여전히 구제 될 수 있는지 궁금합니다.
xnor

7

APL (Dyalog Unicode) , 22 21 20 18 17 바이트

(3∨?2)⌽1↓,∘⌽⍨3?10

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

항상 같은 형식으로 숫자를 출력 할 수있는 경우 1⌽1↓,∘⌽⍨3?10또는 12 바이트로 단축 할 수 있습니다 3⌽1↓,∘⌽⍨3?10.

불필요한를 제거하여 바이트를 저장했습니다 .

H.PWiz 덕분에 바이트를 절약 한 다음 팁으로 인해 2 바이트를 더 절약했습니다.

ngn 덕분에 바이트를 저장했습니다.

이 기능은 가정 ⎕IO←0( I ndex O rigin).


어떻게?

(3∨?2)⌽1↓,∘⌽⍨3?10  Anonymous function.
              3?10   Deal 3 (distinct) random numbers from 0 to 9. (Assume 1 2 3)
                   Use that as both arguments for:
          ,∘⌽       Rotate (⌽), then concatenate (,).
                    Yields 3 2 1 1 2 3.
        1          Drop the first element. Our vector is now 2 1 1 2 3
                   Rotate the vector to the left using as argument:
(  ?2)              Roll 0 or 1 and...
 3                 Do the GCD between 3 and the result. (30=3; 31=1.)
                    This yields either 1 1 2 3 2 or 2 3 2 1 1.

입력 할 수 없습니다
drham

@drham 함수에 입력이 없습니다. 이 경우 TIO 필드 Input는 함수를 호출하는 데 사용됩니다 g. 또한 g←필요하지 않기 때문에 바이트 수로 계산되지 않으며 함수 호출에만 사용됩니다.
J. Sallé

g입력 섹션에서 호출 된 사실 은 APL이 TIO에서 실행되도록 설정 한 문제
일뿐입니다.

(4∨?2)바이트를 절약1 4[?2]
H.PWiz

1
f열차를 할당하지 않고 사용하여 바이트를 절약 할 수도 있습니다 . 나는 당신에게 그것을 떠날 것입니다 :)
H.PWiz

6

자바 (8) 145 136 125 119 바이트

v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}

@ OlivierGrégoire 덕분에 -9 바이트 . @RickHitchcock
덕분에 -11 바이트 . @Nevay 덕분에 -6 바이트 .

설명:

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

v->{            // Method with empty unused parameter and String return-type
  String r;     //  Result-String
  for(;!(r=(int)(Math.random()*1e5)+"")
                //  Generate a random number in the range [0; 100000) and set it to `r`
        .matches("(.).*\\1(.).*\\2")
                //   And continue doing this as long as it doesn't match the regex above,
       |r.chars().distinct().count()<3;);
                //   or doesn't have three distinct digits
  return r;}    //  Return the result


@ OlivierGrégoire 올바른 도전에 이것을 게시하셨습니까? .. : S 그것은 친숙해 보이지만 확실히이 도전은 아닙니다 ..
Kevin Cruijssen

조금은 내 링크를 끊었다 ... 어쨌든, 여기 골프가있다 :v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
올리비에 그레고르

1
정규 표현식이로 단축되어 (.).*\\1(.).*\\211 바이트를 절약 할 수 있다고 생각합니다 .
Rick Hitchcock

1
119 바이트 :v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Nevay


5

젤리 , 12 11 바이트

ØDẊ⁽0yṃ,U$X

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


설명


ØDẊ⁽0yṃ,U$X    Niladic link, generate a random string.
ØD             List of digits, ['0','1','2',...,'9'].
  Ẋ            Random shuffle.
   ⁽0y         Number 13122.
      ṃ        Base decompression. (*)
       ,U$     Pair with its upend (reverse).
          X    Choose one (it or its reversed) randomly.

(*) 의 올바른 주장은 무작위로 섞인 목록 ['0','1','2',...,'9']에 10 개의 요소가 있다는 것입니다. 따라서 숫자 13122는 bijective base 10 ( [1,3,1,2,2]) 으로 변환되고 목록으로 색인됩니다 (따라서 목록이 l이면 원자의 반환 값은 [l[1],l[3],l[1],l[2],l[2]]이며 여기서 Jelly는 1 기반 색인을 사용합니다)


(05AB1E 답변과 동일한 아이디어, 독립적으로
제기

... 05AB1E는 젤리를 묶을 수 있기 때문에 6 개의 공감 률을 얻습니다.
user202729

2
나는 당신의 대답을 upvoted. -> SPEECH 100 <---
L_Church

4

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

f=([,,d,a,b,c]=[...Math.random()+f])=>a-b&&a-c&&b-c?d&1?a+a+b+c+b:b+c+b+a+a:f()

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

어떻게?

Math.random()[0..1) 에서 임의의 부동 소수점을 제공합니다 . 우리는 +f강요를 문자열로 강제하는 데 사용합니다. 우리는 [,,( 처음 두 문자를 할당 하지 않고 할당 함으로써) 선행 0과 소수점을 무시하고 처음 4 자리를 d , a , bc 로 수집합니다 .

경우 , BC는 3 개 다른 정수, 우리는 하나의 최종 출력 구축 AABCB 또는 BCBAA의 형식 (의 패리티를 이용하여 D를 결정하는 참조). 그렇지 않으면, 우리는 그들이 될 때까지 다시 시도합니다.

Math.random()소수점 이하 자릿수가 충분하지 않은 값 을 반환하는 경우에는 c 가 숫자가 아닌 문자로 설정되어 테스트가 실패하고 재귀 호출이 발생합니다. 경우 , BC는 다음 유효한 정수 D가 이 일을 테스트 할 필요가 없습니다 그래서뿐만 아니라 유효한 정수를 보장됩니다.


둘 다 &&될 수 있습니다 &. 또한 어떻게 [,,a,b,c,d]작동합니까? [,,이전 과 같은 입력을 본 적이 없습니다 .
케빈 크루이 센

1
@KevinCruijssen A는 비트 AND에 대한 예를 들어 실패 a=4, b=2, c=1때문에 4-2&4-1&2-1 == 2&3&1 == 0. 변수 할당에 대한 간단한 설명을 추가했습니다.
Arnauld

아 물론 이죠 난 그냥 시도 &&&TIO에 그것은 올바른 출력을했다, 그래서 나는 그것이 가능했다 생각했습니다. &대신에 &&유효한 출력을 걸러내는 것을 깨닫지 못했습니다 . 그리고 파괴 과제에 대한 추가 설명에 감사드립니다.
케빈 크루이 센

이것은 단지 멋진 일이다
루이스 펠리페 드 예수님 무 노즈


2

Dirty , 33 바이트

--numeric-output읽을 수 있도록 플래그를 사용합니다 . 그렇지 않으면 숫자에 해당하는 코드 포인트가 포함 된 제어 문자 문자열이 출력됩니다.

10⭧[1w#%D⅋№3⤱≠1ẅ&]1wẂ⭿⭣1u∅#1∧◌ŪW‼

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

설명 :

10⭧              put 10 on the right stack
[1w#%D⅋№3⤱≠1ẅ&] loop until there are 3 distinct positive numbers below 10 in the top stack
1wẂ              clean-up the right and top stacks
⭿               copy the top and bottom of the top stack to each-other
⭣                swap the first two elements of the top stack
1u               rotate the top stack by 1
∅#1∧◌ŪW          reverse the top stack half of the time
‼                print the top stack

2

, 34 바이트

≔‽χθ≔‽Φχ⁻ιθη↑I⟦θθη‽Φχ×⁻ιθ⁻ιηη⟧¿‽²‖

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

  χ                                 Predefined variable 10
 ‽                                  Random element from implicit range
≔  θ                                Assign to variable `q`
       χ                            Predefined variable 10
      Φ                             Filter on implicit range
         ι                          Current value
          θ                         Variable `q`
        ⁻                           Subtract
     ‽                              Random element
    ≔      η                        Assign to variable `h`
                    χ               Predefined variable 10
                   Φ                Filter on implicit range
                       ι  ι         Current value
                        θ           Variable `q`
                           η        Variable `h`
                      ⁻  ⁻          Subtract
                     ×              Multiply
                  ‽                 Random element
               θθ                   Variable `q`
                 η          η       Variable `h`
              ⟦              ⟧      Wrap 5 values into array
             I                      Cast array elements to string
            ↑                       Make array print horizontally
                                ²   Literal 2
                               ‽    Random element from implicit range
                              ¿     If
                                 ‖  Reflect

2

망막 , 40 바이트


10*
Y`w`d
V?`
Lv$7`.(.)
$1$<'$'
O?`...?

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

선행 0으로 문자열을 인쇄 할 수 있습니다.

설명


10*

문자열을 밑줄 10 개로 초기화하십시오.

Y`w`d

주기적으로 단어 문자를 숫자로 음역합니다. 조금 이상합니다. w와는 d각각 다음과 같은 문자열에 대한 짧은 :

w: _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
d: 0123456789

순환 음역은 먼저 두 줄이 LCM 길이까지 반복됨을 의미합니다.

_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_012345...
0123456789012345678901234567890123456789012345678901234567890123456789...

스트링 길이 (53 및 10)는 동일 프라임이므로, 각 사본은 _다른 숫자와 쌍을 이룬다. 그리고 지금 순환 음역은 대체하게됩니다 내가 의 복사 일 _나는 그 확장 된 목록에서 일 페어링. 따라서 다음 문자열로 끝납니다.

0369258147

그 모든 것이 리터럴 문자열 위에 단일 바이트를 저장하기 위해 0369258147그래요. :디

어쨌든, 우리는 이제 10 자리 숫자의 문자열을 가지고 있습니다.

V?`

숫자를 섞습니다. 따라서 처음 3 자리 숫자는 3 개의 고유 숫자를 균일하게 무작위로 선택합니다.

Lv$7`.(.)
$1$<'$'

우리는 문자열과 일치 ...ABC하고로 돌려 BABCC. 우리가하는 방법은 다소 미친 짓이지만 좀 더 간단한 접근 방식에 비해 1 바이트 만 절약합니다. 먼저 겹치는 모든 v문자 쌍을 일치 시키고 두 번째 문자 ( )를 캡처합니다 .(.). 그럼 우리는 8 경기를 유지 ( 7제로가 기반) 인 AB...ABC. 다음 우리는 (교체 $포함)를 : B( $1) ABC( $<'에 일치하는의 접미사 인 세퍼레이터 경기 중 좌측) C( $'경기 자체의 접미사).

O?`...?

마지막으로, 우리는 3 개 또는 2 개의 문자를 일치시키고 일치를 섞어서 무작위로 BABCC또는 CCBAB무작위로줍니다.


2

R , 78 바이트

z=sample(0:9,3)[c(2,1:3,3)];cat(paste(`if`(runif(1)>.5,z,rev(z)),collapse=''))

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

sample0:9에서 다음과 같은 벡터에 배치되는 임의의 값 3 개를 선택 a b a c c합니다. 이제 우리는이 벡터를 반전시키고 연결하고 인쇄 할 수있는 50/50의 기회를가집니다.


아주 좋아요! 62 바이트 ; 당신이 약간 연습이 아닌 것 같습니다;)
Giuseppe

나는을 사용하는 것을 보았지만 rt어떤 이유로 든 더 길다고 생각했습니다. ...
JAD

그리고 (no-op로서의 좋은 발견 :)
JAD

@Giuseppe 당신의 asnwer는 55 바이트 더 골프 수 있습니다 ... TIO
JayCe

2

PHP, 73 72 66 바이트

<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));

편집 : @David의 제안 덕분에 66 바이트.

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


당신은 이것을 65로 얻을 수 있습니다 :<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
Davіd

@David 불행히도 귀하의 솔루션은 규칙 5를 위반합니다. 그것은 같을 수 rand(0,3).rand(4,6).rand(7,9)있지만 다시는 "균일하게 임의적 인"것은 아닙니다. Btw. 에 익숙하지 않았 rand()%2으므로 귀하의 의견은 어쨌든 솔루션을 약간 향상시키는 데 도움이되었습니다.
retrowaver

1
아, 네 말이 맞아요 나는 그 규칙을 보지 못했다. 66 바이트 에서 현재 작동하는 것을 얻었습니다 <?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));. 당신은 것을 테스트 할 수 있습니다 array_rand'의 두 번째 매개 변수는 독특한 결과를 반환 여기를 (10000 반복을 통해 테스트).
Davіd

@David 감사합니다. 방금 게시물을 업데이트했습니다!
retrowaver

1

빨강 , 147, 146125 바이트

func[][b: copy[]d:[1 1 2 3 2]if 1 = random 2[d: reverse d]while[4 > length? b][alter b(random 10)- 1]foreach a d[prin b/(a)]]

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

언 골프 드 :

f: func[] [                       function with no arguments
    b: copy []                    an empty list
    d: [1 1 2 3 2]                preset digits at positons
    if 1 = random 2 [             generate 1 or 2 
        d: reverse d]             based on this choose to reverse the positions list
    while [4 > length? b] [       while we haven't chosen 3 different digits
        alter b (random 10) - 1   pick a random digit, if it's not in the list already
                                  append it to the list, otherwise remove it
    ]
    foreach a d [                 for each position
       prin b/(a)]                print the corresponding digit 
]



1

파이썬 3 + numpy, 69 바이트

from pylab import*
r=choice
i=r(2)
print(r(10,3,0)[[1-i,0,1,2,-1-i]])

설명

from pylab import*     
r=choice               # `choice` takes a range, number of samples, and wether repetition is allowed
i=r(2)                 # Single value in [0,1] to specify if repeated digits come on right or left
print(r(10,3,0)[[1-i,0,1,2,-1-i]])    # Construct output using index list and 3 random integers


0

J , 35 바이트

[:u:48+[:|.^:(?&2:)2 2 1 0 1{3?10"_

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

훨씬 더 골프를 칠 수 있다고 확신합니다.

설명:

  3?10             - generates 3 different digits
7 0 3

  2 2 1 0 1{       - constructs a list using digits positions 0, 1 and 2

  2 2 1 0 1{3?10   
3 3 0 7 0

  |.^:(?&2:)       - generates 0 or 1 and if 1, reverses the list 

  |.^:(?&2:)2 2 1 0 1{3?10
0 7 0 3 3

   u:48+              - converts to char by adding 48 to each digit
   u:48+|.^:(?&2:)2 2 1 0 1{3?10
07033
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.