Con số này có ngẫu nhiên không?


18

Tôi đã hỏi Random.org cho 128 số nguyên ngẫu nhiên trong khoảng từ 0 đến 2 32 - 1. Vì trình tạo số ngẫu nhiên rất háo hức đưa ra 64 số đầu tiên trước tiên, chúng rõ ràng là ngẫu nhiên hơn 64 số còn lại.

Viết chương trình hoặc hàm đầy đủ trả về kết quả trung thực khi một trong 64 số nguyên sau đây được nhập:

[1386551069, 1721125688, 871749537, 3410748801, 2935589455, 1885865030, 776296760, 614705581, 3841106923, 434616334, 1891651756, 1128215653, 256582433, 310780133, 3971028567, 2349690078, 489992769, 493183796, 3073937100, 3968540100, 777207799, 515453341, 487926468, 2597442171, 950819523, 1881247391, 3676486536, 3852572850, 3498953201, 2544525180, 297297258, 3783570310, 2485456860, 2866433205, 2638825384, 2405115019, 2734986756, 3237895121, 1560255677, 4228599165, 3106247743, 742719206, 2409129909, 3008020402, 328113612, 1081997633, 1583987616, 1029888552, 1375524867, 3913611859, 3488464791, 732377595, 431649729, 2105108903, 1454214821, 997975981, 1764756211, 2921737100, 754705833, 1823274447, 450215579, 976175934, 1991260870, 710069849]

Và một kết quả falsey cho 64 số khác:

[28051484, 408224582, 1157838297, 3470985950, 1310525292, 2739928315, 3565721638, 3568607641, 3857889210, 682782262, 2845913801, 2625196544, 1036650602, 3890793110, 4276552453, 2017874229, 3935199786, 1136100076, 2406566087, 496970764, 2945538435, 2830207175, 4028712507, 2557754740, 572724662, 2854602512, 736902285, 3612716287, 2528051536, 3801506272, 164986382, 1757334153, 979200654, 1377646057, 1003603763, 4217274922, 3804763169, 2502416106, 698611315, 3586620445, 2343814657, 3220493083, 3505829324, 4268209107, 1798630324, 1932820146, 2356679271, 1883645842, 2495921085, 2912113431, 1519642783, 924263219, 3506109843, 2916121049, 4060307069, 1470129930, 4014068841, 1755190161, 311339709, 473039620, 2530217749, 1297591604, 3269125607, 2834128510]

Bất kỳ đầu vào nào ngoài một trong số 128 số này là hành vi không xác định.

Nếu giải pháp của bạn được tìm thấy theo chương trình, vui lòng chia sẻ mã được sử dụng để tạo nó!

Đây là , vì vậy giải pháp ngắn nhất tính bằng byte sẽ thắng.


19
Vì trình tạo số ngẫu nhiên đã cho 64 số đầu tiên trước tiên, chúng phải ngẫu nhiên hơn ಠ ___
Luis Mendo

Bạn có thể phân biệt hai bộ modulo 834
CalculatorFeline

1
Những con số đó không phải là ngẫu nhiên.
Máy

"Maybe, not enough information."&33 byte, trả lời câu hỏi.
Máy

3
@CatsAreFluffy Trên thực tế, miễn là đầu vào không chứa 0 hoặc 1 và không có hai phần tử nào khác nhau 1, bạn có thể tách chúng bằng một chuỗi modulo. ví dụ: tách [4 20 79]từ [8 18 100]có thể được thực hiện bằng cách [99 79 20 17 7 4](xem nếu bạn có thể phát hiện ra mẫu). Chắc chắn, một nửa câu trả lời ban đầu của bạn có thể sử dụng một modulo nhỏ hơn nhiều so với đầu vào, nhưng nửa sau bao gồm dịch chuyển một phần tử tại một thời điểm.
Sp3000

Câu trả lời:


11

CJam, 53 52 47 byte

l~"X    0'ò"2/Dfb+:%"gÇâì6Ô¡÷Ç8nèS¡a"312b2b=

Không thể in được, nhưng hai chuỗi có thể được lấy bằng

[88 9 48 5 39 5 29 1 242]:c
[8 103 199 226 236 54 212 15 161 247 199 56 110 232 83 161 97]:c

tương ứng. Điều này cũng cho thấy các điểm mã dưới 256.

Đây là câu trả lời chuỗi modulo, trong đó chúng tôi áp dụng các modul sau cho số nguyên đầu vào, theo thứ tự:

[1153 629 512 378 242 136]

Vì danh sách này chứa các số nguyên lớn hơn 255, nên danh sách được mã hóa bằng hai ký tự mỗi ký tự. Việc giải mã được thực hiện bằng cách 2/Dfbphân tách chuỗi thành các đoạn có độ dài hai và chuyển đổi từng chuỗi từ một số cơ sở 13 (ví dụ 88*13 + 9 = 1153). Tuy nhiên, có hai trường hợp ngoại lệ cho việc giải mã:

  • Số cuối cùng ( 136) không được bao gồm (xem bên dưới),
  • Số cuối cùng thứ hai được biểu thị bằng một char duy nhất, vì số ( 242) nhỏ hơn 256 và tách một mảng có độ dài lẻ thành các khối có kích thước 2 sẽ để lại một mảng kích thước 1 ở cuối. Cảm ơn @ MartinBüttner cho mẹo này!

Khi modul đã giảm số nguyên đầu vào xuống một số tương đối nhỏ, chúng tôi thực hiện tra cứu từ bảng. Bảng này được mã hóa thông qua chuỗi thứ hai, được chuyển đổi thành 312số cơ sở sau đó được giải mã thành cơ sở 2, mà chúng tôi lập chỉ mục. Kể từ khi kết thúc việc lập chỉ mục mảng của CJam, chúng ta có thể bỏ qua modulo cuối cùng như đã đề cập trước đó.

Dùng thử trực tuyến | Bộ kiểm tra


1
Làm thế nào để mọi người đến với các moduli ma thuật?
Máy

@CatsAreFluffy Chỉ là một DFS đơn giản với giới hạn về số lượng modul. Việc triển khai hiện tại của tôi khá chậm, vì vậy nếu tôi cảm thấy như chương trình bị kẹt trong một thời gian, tôi sẽ thử một điểm khởi đầu khác.
Sp3000

DFS là gì? (Wikipedia không có ích.)
Máy

@CatsAreFluffy Tìm kiếm đầu tiên sâu
Sp3000

Ah. Tôi chỉ sử dụng một thuật toán tham lam.
Máy


2

JavaScript (ES6) 233

Hàm ẩn danh trả về 0 là falsyvà khác khôngtruthy

x=>~"lnhp2wm8x6m9vbjmrqqew9v192jc3ynu4krpg9t3hhx930gu8u9n1w51ol509djycdyh077fd1fnrzv6008ipkh0704161jayscm0l6p4ymj9acbv5ozhjzxo3j1t20j9beam30yptco033c9s3a8jwnre63r29sfbvc5371ulvyrwyqx3kfokbu66mpy9eh" // newline added for readability
.search((x.toString(36)).slice(-3))

Kiểm tra 3 chữ số cuối cùng trong biểu diễn số trong cơ sở 36.

Chuỗi kiểm tra được xây dựng để:

a=[1386551069, 1721125688, ... ]
H=x=>(x.toString(36)).slice(-3)
Q=a.map(x=>H(x)).join('')

Kiểm tra

f=x=>~"lnhp2wm8x6m9vbjmrqqew9v192jc3ynu4krpg9t3hhx930gu8u9n1w51ol509djycdyh077fd1fnrzv6008ipkh0704161jayscm0l6p4ymj9acbv5ozhjzxo3j1t20j9beam30yptco033c9s3a8jwnre63r29sfbvc5371ulvyrwyqx3kfokbu66mpy9eh"
.search((x.toString(36)).slice(-3))

a=[1386551069, 1721125688, 871749537, 3410748801, 2935589455, 1885865030, 776296760, 614705581, 3841106923, 434616334, 1891651756, 1128215653, 256582433, 310780133, 3971028567, 2349690078, 489992769, 493183796, 3073937100, 3968540100, 777207799, 515453341, 487926468, 2597442171, 950819523, 1881247391, 3676486536, 3852572850, 3498953201, 2544525180, 297297258, 3783570310, 2485456860, 2866433205, 2638825384, 2405115019, 2734986756, 3237895121, 1560255677, 4228599165, 3106247743, 742719206, 2409129909, 3008020402, 328113612, 1081997633, 1583987616, 1029888552, 1375524867, 3913611859, 3488464791, 732377595, 431649729, 2105108903, 1454214821, 997975981, 1764756211, 2921737100, 754705833, 1823274447, 450215579, 976175934, 1991260870, 710069849]
b=[28051484, 408224582, 1157838297, 3470985950, 1310525292, 2739928315, 3565721638, 3568607641, 3857889210, 682782262, 2845913801, 2625196544, 1036650602, 3890793110, 4276552453, 2017874229, 3935199786, 1136100076, 2406566087, 496970764, 2945538435, 2830207175, 4028712507, 2557754740, 572724662, 2854602512, 736902285, 3612716287, 2528051536, 3801506272, 164986382, 1757334153, 979200654, 1377646057, 1003603763, 4217274922, 3804763169, 2502416106, 698611315, 3586620445, 2343814657, 3220493083, 3505829324, 4268209107, 1798630324, 1932820146, 2356679271, 1883645842, 2495921085, 2912113431, 1519642783, 924263219, 3506109843, 2916121049, 4060307069, 1470129930, 4014068841, 1755190161, 311339709, 473039620, 2530217749, 1297591604, 3269125607, 2834128510]

A.textContent=a.map(x=>f(x))
B.textContent=b.map(x=>f(x))
<table>
  <tr><th>first 64 - truthy</th></tr><tr><td id=A></td></tr>
  <tr><th>other 64 - falsy</th></tr><tr><td id=B></td></tr>
</table>  


1

Toán học, 218 217 byte

Fold[Mod,#,{834,551,418,266,228,216,215,209,205,199,198,195,178,171,166,162,154,151,146,144,139,137,122,120,117,114,110,106,101,98,95,88,84,67,63,61,60,57,55,51,45,44,43,41,40,35,34,30,27,26,25,23,20,14,13,11,10,9}]<1

Vì lý do nào, một tập hợp các mô đun tồn tại cho phép chúng ta phân biệt hai tập hợp chỉ bằng cách có hay không, sau khi áp dụng các mô đun, kết quả bằng không hoặc không. Danh sách dài các mô-đun được tạo bởi chương trình này:

Block[{data1, data2, n, mods}, 
 data1 = {1386551069, 1721125688, 871749537, 3410748801, 2935589455, 
   1885865030, 776296760, 614705581, 3841106923, 434616334, 
   1891651756, 1128215653, 256582433, 310780133, 3971028567, 
   2349690078, 489992769, 493183796, 3073937100, 3968540100, 
   777207799, 515453341, 487926468, 2597442171, 950819523, 1881247391,
    3676486536, 3852572850, 3498953201, 2544525180, 297297258, 
   3783570310, 2485456860, 2866433205, 2638825384, 2405115019, 
   2734986756, 3237895121, 1560255677, 4228599165, 3106247743, 
   742719206, 2409129909, 3008020402, 328113612, 1081997633, 
   1583987616, 1029888552, 1375524867, 3913611859, 3488464791, 
   732377595, 431649729, 2105108903, 1454214821, 997975981, 
   1764756211, 2921737100, 754705833, 1823274447, 450215579, 
   976175934, 1991260870, 710069849};
 data2 = {28051484, 408224582, 1157838297, 3470985950, 1310525292, 
   2739928315, 3565721638, 3568607641, 3857889210, 682782262, 
   2845913801, 2625196544, 1036650602, 3890793110, 4276552453, 
   2017874229, 3935199786, 1136100076, 2406566087, 496970764, 
   2945538435, 2830207175, 4028712507, 2557754740, 572724662, 
   2854602512, 736902285, 3612716287, 2528051536, 3801506272, 
   164986382, 1757334153, 979200654, 1377646057, 1003603763, 
   4217274922, 3804763169, 2502416106, 698611315, 3586620445, 
   2343814657, 3220493083, 3505829324, 4268209107, 1798630324, 
   1932820146, 2356679271, 1883645842, 2495921085, 2912113431, 
   1519642783, 924263219, 3506109843, 2916121049, 4060307069, 
   1470129930, 4014068841, 1755190161, 311339709, 473039620, 
   2530217749, 1297591604, 3269125607, 2834128510};
 n = 1;
 mods = {};
 While[Intersection[Mod[data1, n], Mod[data2, n]] != {}, n++];
 FixedPoint[
  (mods = Append[mods, n]; data1 = Mod[data1, n]; 
    data2 = Mod[data2, n]; n = 1;
    While[Intersection[Mod[data1, n], Mod[data2, n]] != {}, n++]; 
    n) &
  , n];
 {mods, {Fold[Mod, data1, mods], Fold[Mod, data2, mods]}}
 ]

Đầu ra đầu tiên là các mô-đun, đầu ra thứ hai và thứ ba là hai danh sách, đã áp dụng các mô-đun. Hai danh sách dài là các bộ.


2
Bạn có thể có thể nén một phần của danh sách thành một chuỗi.
njpipe Organ

1

PowerShell, v3 + 194 byte

$args[0]%834%653-in(40..45+4,8,12,51,60,64,69,76,84,86,93,97,103,117+137..149+160,162,178+195..209+215..227+255,263+300..329+354,361,386,398,417,443,444+469..506+516,519,535,565,581,586,606,618)

Một chút về một cách tiếp cận khác nhau, vì vậy tôi đoán rằng tôi sẽ đăng nó. Nó sẽ không giành chiến thắng ngắn nhất, nhưng nó có thể cung cấp cho người khác ý tưởng để rút ngắn mã của họ.

Chúng tôi vẫn lấy số nguyên đầu vào $args[0]và áp dụng các phép toán modulo cho nó, vì vậy không có gì khác nhau ở đó. Trong phần trên, chúng tôi đang sử dụng -intoán tử (do đó yêu cầu v3 +) vì vậy điều này sẽ xuất ra Truecác giá trị trong trường hợp kiểm tra trung thực.

Tuy nhiên, tôi đang cố gắng tìm các mảng kết quả nơi chúng ta có thể tận dụng ..hàm phạm vi để rút ngắn số byte, nhưng vẫn có các mảng khác biệt giữa các giá trị trung thực và falsey. Chúng ta có thể làm điều này vì hành vi khác với đầu vào trung thực / falsey không được xác định, vì vậy nếu phạm vi bắt các giá trị bên ngoài đầu vào trung thực / falsey, thì đầu ra không thành vấn đề.

Cho đến nay, đây là một quy trình khá thủ công, vì mục tiêu là thử và tìm modulo trong đó một trong các mảng trung thực hoặc falsey có khoảng cách lớn giữa các số và mảng khác có số lượng lớn trong khoảng cách đó. Tôi đã chủ yếu đi theo trực giác và cảm giác ruột thịt cho đến nay, nhưng cuối cùng tôi có thể viết một chuyên gia vũ phu để giải quyết điều này. Trên đây là đoạn ngắn nhất mà tôi (chủ yếu là thủ công) tìm thấy cho đến nay.

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.