Чи є це число випадковим?


18

Я запитав random.org про 128 випадкових цілих чисел від 0 до 2 32 - 1. Оскільки генератор випадкових чисел настільки прагне дати спочатку перші 64 числа, вони, очевидно, більш випадкові, ніж інші 64.

Напишіть повну програму або функцію, яка повертає істинний результат, коли вводиться одне з наступних 64 цілих чисел:

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

І результат фальси для інших 64 номерів:

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

Будь-який вхід, крім одного з цих 128 номерів, є невизначеним поведінкою.

Якщо ваше рішення знайдено програмно, також поділіться кодом, який використовується для його створення!

Це , тому найкоротше рішення в байтах виграє.


19
Оскільки генератор випадкових чисел вперше дав перші 64 числа, вони повинні бути більш випадковими ಠ ___ ಠ
Луїс Мендо

Можна виділити два набори по модулю 834
CalculatorFeline

1
Ці числа не є випадковими.
CalculatorFeline

"Maybe, not enough information."&33 байти, відповідає на питання.
CalculatorFeline

3
@CatsAreFluffy Насправді, доки вхід не містить 0 або 1 і два елементи не відрізняються від 1, ви можете розділити їх за модульним ланцюгом. наприклад, відокремлення [4 20 79]від [8 18 100]можна зробити за допомогою [99 79 20 17 7 4](дивіться, чи ви можете помітити шаблон). Звичайно, початкова половина вашої відповіді може використовувати набагато менший модуль, ніж вхідний, але задня половина складається зі зміщення одного елемента за раз.
Sp3000

Відповіді:


11

CJam, 53 52 47 байт

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

Існують недруковані версії, але ці два рядки можна отримати

[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

відповідно. Це також показує, що кодові точки нижче 256.

Це відповідь по модульному ланцюгу, де ми застосовуємо наступні модулі до вхідного цілого числа для того, щоб:

[1153 629 512 378 242 136]

Оскільки цей список містить цілі числа, що перевищують 255, список кодується за допомогою двох символів у кожному. Розшифровка виконується тим 2/Dfb, що розбиває рядок на шматки довжиною два і перетворює кожен з базового 13 числа (наприклад 88*13 + 9 = 1153). Однак у декодуванні є два винятки:

  • Останнє число ( 136) не включено (див. Нижче),
  • Друге-останнє число представлене єдиним знаком, оскільки число ( 242) менше 256, а розбиття масиву непарної довжини на шматки розміром 2 залишить в кінці масив розміром 1. Дякуємо @ MartinBüttner за цю пораду!

Після того як модулі зменшили вхідне ціле число до відносно невеликого числа, ми виконуємо пошук з таблиці. Ця таблиця кодується за допомогою другого рядка, який перетворюється в базове 312число, а потім декодується в базу 2, яку ми індексуємо. Оскільки індексація масиву CJam обгортає, ми можемо залишити остаточний модуль, як згадувалося раніше.

Спробуйте в Інтернеті | Тестовий набір


1
Як вам люди придумують чарівні модулі?
CalculatorFeline

@CatsAreFluffy Просто простий DFS з обмеженням кількості модулів. Моя поточна реалізація досить повільна, тому, якщо я відчуваю, що програма застрягла на деякий час, я спробую іншу початкову точку відліку.
Sp3000

Що таке DFS? (Вікіпедія не допомагає.)
CalculatorFeline

@CatsAreFluffy Перший глибинний пошук
Sp3000

Ага. Я просто використовував жадібний алгоритм.
CalculatorFeline

4

Сітківка , 117 байт

([023]3|[067]0|[1289]1|5[5689]|67|96|88|77|65|05)$|^(8|4[358]|7[147]|51|37|30)|865|349|2.{5}5|761|74[348]|728|811|990

Відповідь на регекс-гольф, виводячи додатне ціле число для правди і нульове значення для помилки.

Спробуйте в Інтернеті! | Тестовий набір - truthy | Тестовий набір - фальшивий | Регекс101


2

JavaScript (ES6) 233

Анонімна функція, що повертає 0 як falsyі ненульове значення якtruthy

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

Перевірка останніх 3 цифр у поданні числа в базі 36.

Контрольна рядок побудований так:

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

Тест

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

Математика, 218 217 байт

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

З будь-якої причини існує набір модулів, який дозволяє нам розрізнити два множини лише за тим, чи застосовувати модулі, чи ні, результат дорівнює нулю чи ні. Довгий список модулів був сформований цією програмою:

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

Перший вихід - це модулі, другий і третій виходи - це два списки, застосувавши модулі. Два довгих списки - це безліч.


2
Можливо, ви можете стиснути частину списку в рядок.
njpipeorgan

1

PowerShell, v3 + 194 байт

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

Трохи інший підхід, тому я подумав, що опублікую його. Це не виграє найкоротше, але це може дати комусь іншим ідеї скоротити код.

Ми все ще беремо вхідне ціле число $args[0]і застосовуємо до нього модульні операції, тому нічого іншого там немає. У вищесказаному ми використовуємо -inоператор (отже, v3 + вимога), тому це буде виводити Trueдля значень, що знаходяться в тестовому випадку.

Однак я намагаюся знайти результуючі масиви, де ми можемо використовувати функцію ..діапазону, щоб скоротити кількість байтів, але все ще мають чіткі масиви між значеннями truthy та falsey. Ми можемо це зробити, оскільки поведінка, відмінна від введення truthy / falsey, не визначена, тому, якщо діапазон вловлює значення поза входом truthy / falsey, це не має значення.

Це поки що досить ручний процес, оскільки мета полягає в тому, щоб спробувати знайти модуль, коли один з макетів truthy або falsey має великий проміжок між номерами, а інший масив має велику кількість чисел у цьому проміжку. Я до сих пір ходив по інтуїції та почуттю кишечника, але, можливо, врешті-решт я напишу грубий насильник, щоб вирішити це. Наведене вище - це найкоротший, який я знайшов (в основному вручну).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.