Это число случайно?


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 Поиск в
глубину

Ах. Я просто использовал жадный алгоритм.
CalculatorFeline


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

Mathematica, 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значения, которые находятся в истинном тестовом примере.

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

Пока это довольно ручной процесс, так как цель состоит в том, чтобы попытаться найти модуль по модулю, в котором один из массивов истинного или ложного имеет большой (ые) разрыв (ы) между числами, а другой массив содержит большое количество чисел в этом промежутке. До сих пор я в основном чувствовал интуицию и интуицию, но в конечном итоге я могу написать грубую игру, чтобы решить эту проблему. Вышеуказанное является самым коротким из найденных мной (в основном вручную).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.