DỄ DÀNG để ghi nhớ số


41

Những con số dễ nhớ nhưng về mặt lý thuyết không dễ thực hiện

Thách thức của bạn là tạo ra một chương trình / chức năng bằng bất kỳ ngôn ngữ nào tạo ra các số ngẫu nhiên thống nhất phù hợp với các tiêu chí sau:

  1. Độ dài5 chữ số

  2. Có hai cặp chữ số lặp lại riêng biệt

  3. Một tập hợp các chữ số lặp lại ở đầu hoặc cuối và các chữ số nằm cạnh nhau

  4. Số lẻ được bao quanh bởi các cặp chữ số khác

  5. Các cặp hai chữ số và số khác phải là duy nhất

  6. Chương trình của bạn có thể hỗ trợ các số có số 0 đứng đầu hay không, tùy ý bạn. Nếu các số 0 hàng đầu được hỗ trợ, chúng phải được bao gồm trong đầu ra: 06088, không phải 6088. Nếu các số 0 hàng đầu không được hỗ trợ, thì không nên tạo các số như 06088.

Các trường hợp thử nghiệm

Đầu ra được chấp nhận:

55373
55494
67611
61633
09033
9957
95944
22809
65622
22161

Đầu ra không được chấp nhận:

55555
77787
85855
12345
99233
12131
abcde
5033

Các trường hợp thử nghiệm được chấp nhận hơn có thể được tìm thấy tại liên kết pastebin này .

Chúng được tạo ra với chương trình python này:

nhập ngẫu nhiên
cho tôi trong phạm vi (100):

    if Random.randint (0,100)> = 50: #Put cặp chạm lúc đầu nếu đúng
        temp = [] # làm việc mảng
        temp.append (Random.randint (0,9)) #append chữ số ngẫu nhiên
        temp.append (temp [0]) #append cùng một chữ số một lần nữa

        x = ngẫu nhiên.randint (0,9)
        trong khi x == temp [0]:
            x = ngẫu nhiên.randint (0,9)
        temp.append (x) #append một chữ số duy nhất khác

        y = ngẫu nhiên.randint (0,9)
        trong khi y == temp [0] hoặc y == temp [2]:
            y = ngẫu nhiên.randint (0,9)
        temp.append (y) #append một chữ số duy nhất khác và chữ số duy nhất trước đó
        temp.append (x)

    khác: #Put chạm vào cuối
        temp = [] # làm việc mảng  
        temp.append (Random.randint (0,9)) #append chữ số ngẫu nhiên

        # Trong khi không phải là duy nhất, hãy thử lại
        x = ngẫu nhiên.randint (0,9)
        trong khi x == temp [0]:
            x = ngẫu nhiên.randint (0,9)
        temp.append (x) #append một chữ số duy nhất khác


        temp.append (temp [0]) #append cùng chữ số 0 lần nữa


        y = ngẫu nhiên.randint (0,9)
        trong khi y == temp [0] hoặc y == temp [1]:
            y = ngẫu nhiên.randint (0,9)
        temp.append (y) #append một chữ số duy nhất khác hai lần
        temp.append (y)

    tempstr = ""
    cho tôi trong temp:
        tempstr + = str (i)
    in tempstr

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng!


5
Tôi đề xuất "Đầu ra có thể (xác suất> 0)" và "Đầu ra không thể (xác suất = 0)" thay vì "Sự thật" và "Falsy", có vẻ phù hợp hơn với những gì tôi nghĩ bạn đang hỏi (và với Python ).
Khuldraeseth na'Barya

9
Chúng ta có phải in một đầu ra như 09033 với số 0 đứng đầu không?
xnor

3
Nếu xác suất là đồng nhất, bạn có thể chỉ định điều đó trong câu hỏi. Theo mặc định, randomkhông có nghĩa là thống nhất như vậy
Jo King

3
có thể thêm 99233, để triệu tập để hiểu
l4m2

3
Chào mừng đến với PPCG! Thử thách đầu tiên tốt đẹp.
Jonathan Allan

Câu trả lời:



9

CJam (16 byte)

YmrG*98+ZbA,mrf=

Bản demo trực tuyến

Lưu ý: Tôi đã giả định rằng OP "độc nhất" thực sự có nghĩa là "khác biệt".

Cũng cho 16 byte:

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

Mổ xẻ

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"

Các biến thể khác tạo ra bằng cách sử dụng [1 0 1 2 2]và sau đó chọn kết quả hoặc ngược lại.


9

Perl 5 , 81 63 56 byte

Cắt 7 byte với cảm hứng từ @DomHastings

Xây dựng số từ mẫu thích hợp.

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

Hãy thử trực tuyến!


Perl 5 , 89 byte

Chọn ngẫu nhiên 5 chữ số cho đến khi tìm thấy một số đáp ứng các tiêu chí.

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

Hãy thử trực tuyến!


Thủ thuật hay bằng cách sử dụng các khóa băm cho ngẫu nhiên! Tôi nghĩ rằng điều này tương đương với -8, mặc dù tôi có thể đã bỏ lỡ một trường hợp cạnh ... Hãy thử trực tuyến!
Dom Hastings

1
Ngẫu nhiên băm. Xuất sắc! ngắn hơn
TonMedel

Câu hỏi là liệu có time%2đủ ngẫu nhiên hay không , vì theo một nghĩa nào đó, nó nằm dưới sự kiểm soát của người dùng.
Xcali

@Xcali Có vẻ như đồng thuận rằng nó vẫn ổn miễn là bạn chỉ sử dụng một lần nên tôi nghĩ bạn nên giỏi.
FryAmTheEggman

8

Python 2 , 80 byte

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

Hãy thử trực tuyến!

Xuất ra một danh sách các chữ số.

Python 2 , 83 byte

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

Hãy thử trực tuyến!

Đầu ra là một con số.


Nếu tính ngẫu nhiên không đồng nhất được cho phép theo mặc định (câu hỏi không chỉ định), bạn cũng có thể lưu byte bằng cách lấy mẫu độ đảo ngược: Thử trực tuyến! Chỉnh sửa: Đừng bận tâm, tôi thấy tính đồng nhất đã được chỉnh sửa vào thông số kỹ thuật. Tôi tự hỏi nếu phương pháp này vẫn có thể được cứu vãn.
xnor

7

APL (Dyalog Unicode) , 22 21 20 18 17 byte

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

Hãy thử trực tuyến!

Nếu có thể chấp nhận đầu ra các số luôn ở cùng định dạng, thì điều này có thể rút ngắn xuống còn 12 byte, 1⌽1↓,∘⌽⍨3?10hoặc 3⌽1↓,∘⌽⍨3?10.

Đã lưu một byte bằng cách loại bỏ những thứ không cần thiết .

Đã lưu một byte nhờ H.PWiz, và sau đó thêm 2 byte do mẹo của họ.

Đã lưu một byte nhờ ngn.

Hàm giả định ⎕IO←0( I ndex O rigin).


Làm sao?

(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.

Không thể đưa ra đầu vào
drham

@drham không có đầu vào cho hàm. Trong trường hợp này, trường TIO Inputđược sử dụng để gọi hàm g. Ngoài ra, số g←này không được tính vào số byte vì không cần thiết, nó chỉ được sử dụng để gọi hàm.
J. Sallé

Thực tế gđược gọi trong phần đầu vào chỉ là một cách giải thích về cách APL được thiết lập để chạy trên TIO
H.PWiz

(4∨?2)tiết kiệm một byte hơn1 4[?2]
H.PWiz

1
Bạn cũng có thể lưu byte bằng cách không gán fvà sử dụng tàu. Tôi sẽ để lại cho bạn mặc dù :)
H.PWiz

6

Java 8, 145 136 125 119 byte

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

-9 byte nhờ @ OlivierGrégoire.
-11 byte nhờ @RickHitchcock .
-6 byte nhờ @Nevay .

Giải trình:

Hãy thử trực tuyến.

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 Bạn có đăng bài này ở thử thách chính xác không? ..: S Trông có vẻ quen, nhưng chắc chắn đây không phải là thử thách này ..
Kevin Cruijssen

Một chút rắc rối đã phá vỡ liên kết của tôi ... Dù sao, đây là golf:v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
Olivier Grégoire

1
Tôi nghĩ rằng regex của bạn có thể được rút ngắn (.).*\\1(.).*\\2, tiết kiệm 11 byte.
Rick Hitchcock

1
119 byte:v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Nevay 12/03/18 lúc

5

Thạch , 23 byte

⁵Ḷṗ3⁼Q$ÐfXµḢ;`;ŒBW;U$µX

Hãy thử trực tuyến!


Thật tuyệt, tôi sẽ nâng cao, nhưng tôi không thể
drham

7
@drham :) cảm ơn. bạn sẽ có thể sớm, một khi hầu hết các thành viên tích cực đánh thức câu hỏi của bạn có thể sẽ nhận được rất nhiều sự ủng hộ. tốt thử thách đầu tiên và chào mừng đến với PPCG bằng cách này!
HyperNeutrino

5

Thạch , 12 11 byte

ØDẊ⁽0yṃ,U$X

Hãy thử trực tuyến!


Giải trình


Ø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.

(*) Đối số đúng là danh sách ['0','1','2',...,'9'], được xáo trộn ngẫu nhiên, có 10 yếu tố. Vì vậy, số 13122sẽ được chuyển đổi thành cơ sở sinh học 10 ( [1,3,1,2,2]) và lập chỉ mục vào danh sách (vì vậy nếu danh sách là l, giá trị trả về của nguyên tử là [l[1],l[3],l[1],l[2],l[2]], trong đó Jelly sử dụng lập chỉ mục dựa trên 1)


(cùng ý tưởng với câu trả lời 05AB1E, được đưa ra một cách độc lập)
user202729

... 05AB1E nhận được 6 upvote vì có thể ràng buộc Jelly, Jelly chỉ nhận được 2 upvote vì không thể giành được 05AB1E?
dùng202729

2
tôi nêu lên câu trả lời của bạn ->
LOẠI

4

JavaScript (ES6), 79 byte

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()

Hãy thử trực tuyến!

Làm sao?

Math.random()cho một số float ngẫu nhiên trong [0..1) . Chúng tôi sử dụng +fđể ép buộc một chuỗi. Chúng tôi bỏ qua số 0 và dấu thập phân hàng đầu bằng cách thực hiện [,,( hủy bỏ việc gán hai ký tự đầu tiên thành không có gì) và thu thập 4 chữ số thập phân đầu tiên thành d , a , bc .

Nếu một , bc là 3 số nguyên phân biệt, chúng tôi xây dựng đầu ra cuối cùng dưới AABCB hoặc BCBAA định dạng (sử dụng tính chẵn lẻ của d để quyết định). Nếu không, chúng tôi thử lại cho đến khi họ được.

Trong trường hợp rất khó có thể Math.random()trả về giá trị mà không có đủ số thập phân, ít nhất c sẽ được đặt thành ký tự không có chữ số, buộc thử nghiệm thất bại và cuộc gọi đệ quy xảy ra. Nếu a , bc là các số nguyên hợp lệ thì d cũng được đảm bảo là một số nguyên hợp lệ, vì vậy số này không cần phải được kiểm tra.


Cả hai đều &&có thể &. Ngoài ra, làm thế nào để [,,a,b,c,d]làm việc? Tôi chưa bao giờ thấy một đầu vào như [,,trước đây.
Kevin Cruijssen

1
@KevinCruijssen Một bitwise VÀ sẽ thất bại a=4, b=2, c=14-2&4-1&2-1 == 2&3&1 == 0. Tôi đã thêm một lời giải thích ngắn về việc gán biến.
Arnauld

Tất nhiên rồi. Tôi chỉ cố gắng &&để &trong TIO và nó đã cho kết quả đầu ra chính xác, vì vậy tôi cho rằng nó là tốt. Không nhận ra &thay vì &&sẽ lọc ra đầu ra hợp lệ. Và cảm ơn vì lời giải thích thêm về nhiệm vụ phá hủy, chưa từng thấy nó trước đây.
Kevin Cruijssen

Đây chỉ là +1 tuyệt vời
Luis felipe De jesus Munoz


2

Bẩn , 33 byte

Sử dụng --numeric-outputcờ để có thể đọc được, nếu không, nó sẽ xuất ra một chuỗi các ký tự điều khiển với các điểm mã tương ứng với các chữ số.

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

Hãy thử trực tuyến!

Giải thích:

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

Than , 34 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

  χ                                 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

Võng mạc , 40 byte


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

Hãy thử trực tuyến!

Có thể in chuỗi với số không hàng đầu.

Giải trình


10*

Khởi tạo chuỗi thành 10 dấu gạch dưới.

Y`w`d

Chuyển từ các ký tự từ thành chữ số theo chu kỳ. Điều này hơi lạ. Các wdngắn gọn cho các chuỗi sau, tương ứng:

w: _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
d: 0123456789

Phiên âm theo chu kỳ có nghĩa là trước tiên, cả hai chuỗi được lặp lại theo chiều dài của LCM của chúng:

_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_012345...
0123456789012345678901234567890123456789012345678901234567890123456789...

Vì độ dài chuỗi 53 và 10 là nguyên tố cùng nhau, mỗi bản sao của _được ghép với một chữ số khác nhau. Và bây giờ phiên âm theo chu kỳ sẽ thay thế bản sao thứ i_ bằng cặp thứ i trong danh sách mở rộng đó. Vì vậy, chúng tôi kết thúc với chuỗi sau đây:

0369258147

Tất cả điều đó để lưu một byte đơn trên chuỗi ký tự 0369258147, vì vậy tôi đoán vậy? :CƯỜI MỞ MIỆNG

Dù sao, chúng tôi đã có một chuỗi gồm tất cả 10 chữ số.

V?`

Điều này xáo trộn các chữ số. Vì vậy, ba chữ số đầu tiên sẽ là một lựa chọn ngẫu nhiên thống nhất của ba chữ số riêng biệt.

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

Chúng tôi khớp chuỗi ...ABCvà biến nó thành BABCC. Cách chúng ta làm điều này thật điên rồ và một lần nữa chỉ tiết kiệm được một byte so với cách tiếp cận đơn giản hơn. Đầu tiên chúng ta khớp tất cả cácv cặp ký tự chồng chéo ( ), bắt giữ ký tự thứ hai ( .(.)). Sau đó chúng tôi giữ lại chỉ là trận đấu thứ 8 ( 7, zero-based) mà là AB...ABC. Sau đó, chúng tôi thay thế ( $) nó bằng: B( $1), ABC( $<'là hậu tố của dấu phân cách khớp bên trái của trận đấu), C( $'là hậu tố của chính trận đấu).

O?`...?

Cuối cùng, chúng tôi khớp 3 hoặc 2 ký tự và xáo trộn các trận đấu, cho chúng tôi BABCChoặc CCBABngẫu nhiên.


2

R , 78 byte

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

Hãy thử trực tuyến!

samplechọn 3 giá trị ngẫu nhiên từ 0:9, được đặt trong một vectơ như vậy : a b a c c. Bây giờ chúng ta có cơ hội 50/50 để đảo ngược vectơ này, sau đó nối và in.


Rất đẹp! 62 byte ; có vẻ như bạn hơi mất tập luyện;)
Giuseppe

Tôi đã xem xét việc sử dụng rt, nhưng vì một số lý do tôi nghĩ rằng nó dài hơn ....
JAD

(như không-op là một tìm kiếm tốt :)
JAD

@Giuseppe asnwer của bạn có thể được chơi gôn tới 55 byte ... TIO
JayCe

2

PHP, 73 72 66 byte

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

Chỉnh sửa: 66 byte nhờ đề xuất của @David.

Hãy thử trực tuyến!


Bạn có thể đưa nó lên 65 với điều này:<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
Davіd

@David Thật không may, giải pháp của bạn vi phạm quy tắc 5. Nó có thể giống như vậy rand(0,3).rand(4,6).rand(7,9), nhưng sau đó một lần nữa không phải là "ngẫu nhiên thống nhất". Btw. Tôi không quen thuộc rand()%2, vì vậy bình luận của bạn đã giúp tôi cải thiện một chút giải pháp của mình.
retrowaver

1
à, vâng, bạn đúng Tôi đã không nhìn thấy quy tắc đó. Tôi đã có một cái hoạt động ngay bây giờ, ở mức 66 byte : <?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));. Bạn có thể kiểm tra array_randtham số thứ hai chỉ trả về kết quả duy nhất tại đây (đã kiểm tra hơn 10000 lần lặp).
Davіd

@David cảm ơn, vừa cập nhật bài viết của tôi!
retrowaver

1

Đỏ , 147, 146 125 byte

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)]]

Hãy thử trực tuyến!

Ung dung:

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

Python 3 + gọn gàng, 69 byte

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

Giải trình

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 byte

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

Hãy thử trực tuyến!

Tôi chắc chắn rằng nó có thể được chơi gôn hơn nữa.

Giải trình:

  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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.