Жесткое кодирование копов и грабителей (грабителей)


12

Это задача . Нить ментов на этот вызов здесь

Интересный вопрос для размышления:

Если у меня есть последовательность чисел, сколько из них я должен предоставить, прежде чем станет ясно, о какой последовательности я говорю?

Например, если я хочу поговорить о натуральных числах по порядку, начиная с , я могу сказать 1 , 2 , 3 , , но достаточно ли этого?11,2,3,

У меня есть один способ ответить на этот вопрос, и я играю в код-гольф. Он включает в себя код-гольф. Вы предоставили достаточно терминов последовательности, если самый короткий код, который создает эти термины, создает все термины последовательности. Если мы подумаем об этом с точки зрения кода-гольфа, это будет означать, что вы предоставили достаточно тестовых примеров, чтобы самый короткий код, который проходит тестовые задачи, выполнял желаемую задачу.

Вызов

Эта задача - проблема . В котором полицейские будут представлять контрольные примеры, а грабителям придется искать более короткий способ подделки контрольных примеров, помимо предполагаемой последовательности. Копы представят следующие вещи:

  • Кусок кода, который принимает положительное целое число в качестве входных данных и производит целое число в качестве выходных данных. Этот код может быть либо нулевым, либо индексированным, но должно быть понятно, что такое индексирование. Этот код будет определять вашу последовательность.

  • Любые соответствующие требования платформы или языка, которые могут повлиять на вывод, например размер longint.

  • Число вместе с первыми n членами последовательности, рассчитанной по коду. Они будут действовать как «контрольные примеры».nn

Грабители будут находить программу на том же языке, которая короче представленной и проходит все тестовые случаи (выдает тот же вывод для первых входов, что и код полицейского). Код грабителя должен также отличаться в выходных данных от программы полицейского для некоторого числа, большего чем n .nn

счет

Грабители будут оценены по количеству трещин, которые они найдут, и чем больше трещин будет лучше. Ответ может быть снова взломан путем нахождения правильного ответа короче исходного взлома. Если ответ взломан во второй раз, точка дается второму взломщику, а не первому.


2
Разве мы не позволяем грабителям избивать друг друга за то, что они
взломали

@ fəˈnɛtɪk Звучит, хорошо, что я добавил это.
Специальный охотник за

Ответы:




4

Хаскель , ответ Лайкони , 15 байт

b n=n*div(n+1)2

Попробуйте онлайн!

Обычно я отмечал что-то подобное в комментарии, но потом я подумал, что полицейские и грабители немного более опасны.

Это всего лишь ответ BMO за исключением особого случая b 42. Поскольку оригинал Лайкони проходит через число с плавающей запятой, в этом нет необходимости: просто найдите число, достаточно большое, чтобы в нем были ошибки округления, но не в точной Integerарифметике. Например:

a 100000000000000000000000 = 4999999999999999580569600000000000000000000000
b 100000000000000000000000 = 5000000000000000000000000000000000000000000000

Я подумал, что это возможно (поэтому я написал, что это можно переписать для требуемых терминов), но не нашел значения, для которого это работает .. Отлично сделано!
მოიმო

4

Python 2 , ответ xnor , 43 байта

n=69

f=lambda n,p=2:n<1or-~f(n-(~-2**p%p<2),p+1)

Попробуйте онлайн!

кредиты

Большая заслуга этого взлома должна достаться @ Mr.Xcoder, который первым опубликовал комментарий о возможной атаке с использованием этого метода, и @PoonLevi, который нашел 44-байтовое решение.

Как?

теория

pap

(1)ap11(modp)

a=2

2p11(modp)

k

2p1=kp+1

Что приводит к:

2p=2kp+2
2p1=2kp+1
(2)2p11(modp)

p=22

an11(modn)na

2n=341=11×31

234111(mod341)
234111(mod341)

341347

Реализация

(2)

f=lambda n,p=1:n and-~f(n-(~-2**p%p==1),p+1)

<2==112110(mod1)

f=lambda n,p=1:n and-~f(n-(~-2**p%p<2),p+1)

Попробуйте онлайн!

p=2

f=lambda n,p=2:n and-~f(n-(~-2**p%p<2),p+1)

Попробуйте онлайн!

Последний трюк должен использовать n<1orвместо n and. Это так же долго, но последняя итерация возвращает True вместо 0 , что добавляет недостающее смещение к каждому члену.


Поздравляю всех вас! Это решение, которое я имел в виду. Я думаю, это забавно, что из мотивации вызова «Если у меня есть последовательность чисел, сколько из них я должен предоставить, прежде чем станет ясно, о какой последовательности я говорю?», Первых 50 простых чисел явно недостаточно - иностранец, играющий в гольф на питоне, предположил бы, что вы говорите о другой последовательности.
xnor

@xnor Мне нравится идея «инопланетянина,
играющего в питон



2

Хаскель , ответ Лайкони , 26 22 байта

-4 байта, не используя инфикс div, благодаря Laikoni !

b 42=0;b n=n*div(n+1)2

Попробуйте онлайн!

объяснение

0n20ceiling(realToFrac n/2)div(n+1)2n>20

b 42=0

Ах, я не думал об этом. У меня другой подход, который приводит к трещине в 20 байт на случай, если вы захотите немного больше разгадать. Также ((n+1)`div`2)-> div(n+1)2.
Лайкони

@Laikoni: Да, пока не раскрывай! Упс, да, прошло довольно много времени с тех пор, как я немного поиграл в гольф, я обновлю его.
მოიმო

2

> <> , ответ крашоза 203 байта

:l2-$g:0=?;n:





M
-
B
"
BM
",
7M
!"
BBM
!",
7CM
!"-
BBBM
!!",
7BBMM
!!,,
7BBBMM
!!,,
7BBBMM
!!!,,
7BBBBMM
!!!,,
7BBBBMM
!!!!,,
7BBBBBMM
!!!!,,
7BBBBBMM
!!!!!,,
7BBBBBBMM

Попробуйте онлайн!

Я собирался сделать что-то умное с тем фактом, что нечетные / четные числа выше n=20были одинаковыми, за исключением повторяющегося элемента в центре, но было проще просто жестко кодировать каждый элемент.

Ввод осуществляется через -vфлаг. Ничего не печатает для элементов выше 34.


2

Паскаль (FPC) , ответ AlexRacer , 80 байт

var n,m:word;begin read(n);while n<>0 do begin n:=n div 2;m:=m+n;end;write(m)end.

Попробуйте онлайн!

0n120n=128127126

Это кажется запоздалым ответом, но в любом случае спасибо @AlexRacer за хорошую головоломку!


1
Вау, это даже короче, чем у меня было. Добро пожаловать в PPCG!
AlexRacer


1

JavaScript, ответ fəˈnɛtɪk (17 байт)

15

x=>2.7182819**x|1

n1415x=>Math.exp(x)|1

тестирование

f=x=>2.7182819**x|1
g=x=>(3-(5/63)**.5)**x|1

tmp=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
console.log(tmp.map(f).join(","))
console.log(tmp.map(g).join(","))

Или попробуйте онлайн!


1

Шелуха , взламывая 5 байтов BMO с  3  2 байтами

-1 благодаря BMO ( LdΣ->, так как, когда дано Tnum, Lвыполняет "длину представления строки")

Попробуйте онлайн!

a(0)a(23)a(24)
3←d+164

T(0)=010


Поздравляю, это было мое точное решение! Однако я только что заметил, что для TNum s Lи Ld эквивалентно сэкономить вам байт;)
ბიმო

Ах, я искал "цифру" в вики, чтобы попытаться найти цифровую длину, но не обнаружил, что она Lпереопределяется как "длина представления строки" Tnum.
Джонатан Аллан

(Обратите внимание, что они эквивалентны только для неотрицательных целых чисел - достаточно для этого.)
Джонатан Аллан

1

> <> , Ответ Эйдена Ф. Пирса , 36 байт

v101786
i5844
419902
%
>l{:}g:0=?;o:

Попробуйте онлайн!

Еще одно решение, в котором каждое значение жестко закодировано в строке. Поскольку первоначальный ответ также был в основном жестко запрограммирован, я не чувствую себя слишком виноватым по этому поводу.


0

JavaScript, ответ fəˈnɛtɪk , 23 байта

0n14 .

x=>14-`${73211e9}`[x]|0

Попробуйте онлайн!

Как?

Выражение `${73211e9}`расширяется до строки"73211000000000" , предоставляя таблицу поиска из 14 значений, которые вычитаются из 14, что дает ожидаемую последовательность.

n14

(14 - undefined) | 0
=== NaN | 0
=== 0

21 байт

NaNn14

x=>14-`${73211e9}`[x]

Попробуйте онлайн!

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