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


28

Это задача . Нить грабителей здесь .

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

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

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

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

Вызов

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

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

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

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

Вам рекомендуется объяснить, что делает ваша последовательность, и связать OEIS, если она существует, однако именно ваш код определяет последовательность, а не описание.

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

Копы должны иметь возможность взломать свои собственные ответы перед их отправкой.

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

счет

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


Ясно, что есть способы нематематически взломать проблему, например, просто распечатать все контрольные примеры, но эта проблема зависит от предоставленных полицейскими случаев. Должно ли быть правило об этом? Есть ли ограничение на вычислимость последовательностей или что-нибудь из теории Рамси? (т.е. нужно ли иметь возможность взломать на вашей машине?)
theREALyumdub

2
@ theReallyumdub вопрос предусматривает, что вы должны иметь возможность взломать свое представление.
Волшебник пшеницы

@ CatWizard Спасибо, я пошел вперед, и это уже на очевидном мета-посте, он явно мешает некоторым из этих парней. Так что это не в духе тега, чтобы взломать вычисление заняло больше часа или что-то в этом роде
theREyyumdub


Существует ли условие "хотя теоретически ваше решение должно работать для всех чисел, на практике оно должно работать только для ..."?
user202729

Ответы:


6

cQuents , 4 байта ( взломанные )

"::$

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

Вот восемь ( n=8) случаев:

1 1
2 12
3 123
4 1234
5 12345
6 123456
7 1234567
8 12345678

Объяснение кода:

"      Stringify sequence (join on "", remove it and see what happens)
 ::    Given input n, output all items in the sequence up to and including n
   $   Each item in the sequence equals the index

Таким образом, последовательность состоит в том 1,2,3,4,5 ..., что она объединяется , и ""становится такой 12345 ..., ::что означает, что она печатает до ввода.



5

Python 3 , 66 57 байт ( треснувший )

взломанный xnor
также взломанный Cat Wizard перед редактированием

def f(n):x=n/10-2;return int(x*60-x**3*10+x**5/2-x**7/84)

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

Здравствуйте! Вот последовательность для взлома для . Это дает эти первые 40 элементов с 0-индексацией, это не последовательность OEISn=40

[-54, -56, -58, -59, -59, -59, -59, -57, -55, -53, -50, -46, -43, -38, -33, -28, -23, -17, -11, -5, 0, 5, 11, 17, 23, 28, 33, 38, 43, 46, 50, 53, 55, 57, 59, 59, 59, 59, 58, 56]

Я забыл удалить пробел, я еще не эксперт по гольфу: p Вы не против, если я отредактирую это?
аварии

Конечно, идти вперед. Я удалю свою трещину.
Пшеничный волшебник


5

Python 2 , 44 байта ( взломан )

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

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

Простые числа. Какая последовательность может быть чище? Или более перестарались ? Ваша цель состоит в том, чтобы произвести первые 50 простых чисел для n=1к n=50.

Код является генератором теорем Вильсона, скопированным именно из этого совета .

Различные значения для альтернативной последовательности не связаны с машинными ограничениями, такими как переполнение и точность. Нет сторонних библиотек.


Трещины на Arnauld, @PoonLevi, и г - н Xcoder.


Уверен, что вы не хотели этого ; может быть, указать "Python (без сторонних библиотек)" или "Python (без импорта)" или что-то еще?
Джонатан Аллан

@JonathanAllan Спасибо, я отредактировал, что нет сторонних библиотек.
xnor

Я еще не смог взломать это (моя лучшая попытка на данный момент составляет 47 байтов или около того), но я думаю, что есть кое-что интересное, чтобы отметить эти конкретные простые числа. Для каждого с i [ 1 , 50 ] N это имеет место: 2 p i2 ( mod  p i ), поэтому для более высоких значений. Я оставляю эту идею здесь, чтобы другие могли попробовать свои силы в крэке, используя упомянутую технику, и, возможно, получить лучший результат :)пяя[1,50]N2пя2(модификация пя) . В то же время, это не верно для любого числа, которое не является простым (в диапазоне, указанном выше), но оно делает
Mr. Xcoder

@ Mr.Xcoder Вот моя лучшая попытка, основанная на предложенном вами методе. Он успешно расходится при N = 69, возвращая 341 (первый псевдопростой Ферма к основанию 2 или первому числу Пулета), но также не дает результатов при N = 1. Я сомневаюсь, что смогу это исправить самостоятельно, поэтому подумал, что лучше поделиться тем, что у меня есть. (Мое лучшее исправление - 46 байт ...)
Арно

1
@Arnauld Я нашел 44-байтовое решение используя этот метод. Я не могу идти дальше. Может быть, кто-то еще сможет понять это.
Пун Леви

4

Wolfram Language (Mathematica) , 39 34 байта (безопасный)

Check[{1,9,7}[[#]],18+Boole[#>9]]&

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

Выглядит просто, решение должно быть сложным.

1-индексированный и . Эта последовательность недоступна в OEIS.Nзнак равно99

{1, 9, 7, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}

Этот список выше равен:

Join[{1, 9, 7}, Table[18, 6], Table[19, 90]]

Вот шаблон для проверки вашего решения: попробуйте онлайн!

Преднамеренная трещина

Подвох в том, что выход увеличивается на 1, когда число цифр увеличивается на 1, за исключением первых трех членов; Предполагаемое решение связано с преобразованием строк.

Следовательно, читая документацию по преобразованию выражений и строк , можно найти функцию SpokenString.

Решением является просто длина строковой версии выражения x^nдля различных входных данных:StringLength@SpokenString[x^#]&


3

Haskell , 29 байт (треснуло: 1 , 2 )

a n=n*ceiling(realToFrac n/2)

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

Это A093005 : a(N)знак равноNN2 .

Тестовые случаи для , то есть :0N20map a [0..20]

[0,1,2,6,8,15,18,28,32,45,50,66,72,91,98,120,128,153,162,190,200]

Предполагаемое решение (20 байтов)

b n=sum$n<$show(3^n)

Попробуйте онлайн! Отличается при , при a ( 23 ) = 276 и b ( 23 ) = 253Nзнак равно23a(23)знак равно276б(23)знак равно253 .

Эта функция эквивалентна . Благодаря потолку обе функции перекрываются для целочисленных аргументов в диапазоне от 0 до 22 :б(N)знак равноN LеN(3N)знак равноNLог10(1+3N)022

источник



@Laikoni, если предполагаемая трещина короче, то кто-то еще может претендовать на грабителя из BMO.
fəˈnɛtɪk

@ fəˈnɛtɪk Спасибо, я не знал об этом правиле.
Лайкони


2
@BMO Вот и все :)
Лайкони

2

JavaScript (ES6), 12 байт ( взломан )

Это довольно просто.

n=>n*(8*n+1)

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

Это A139275 :

a(N)знак равноN(8N+1)

Ваш код должен поддерживать :0N<9

0,9,34,75,132,205,294,399,520

И согласно правилам испытания, это должно отклониться вне.


n=>8*n*n+nотличается n=94906273, это действительная трещина?
нгн

@ngn Для меня это выглядит правильно в соответствии с правилами испытаний, но, может быть, вам следует спросить ОП, считается ли потеря точности действительной дивергенцией? Предполагаемая трещина отличается n=9, хотя.
Арно

@CatWizard ^
нгн

Я бы сказал, что это настоящая трещина.
Пшеничный волшебник

2
треснул ( |вместо +)
нгн


2

> <> , 276 байт ( треснувший )

1$1-:?!v$:      1[0$          >:?!va2[$:{:@%:{$-{,]v
       >$n; v              <  ^   >~{]02.1+1+ffr+1r<
 :}[r]{  [01>:{*@@+$a*l2=?!^~]+ff+9+1g"3"=?v"3"ff+9+1pf0.
 :}[l01-$>    $:0(?v$@$:@@:@)?v@@1-$}v     >"2"ff+9+1p00.
>.       ^-1l v!?} <  .4a}$@@$<   .4a<
^26{]r0[}:{]~{<

Попробуйте онлайн! Вызовите его, -v nчтобы получить n-й элемент (1-индексированный)

1$1-:?!;$::n84*o1[0$          >:?!va2[$:{:@%:{$-{,]v
            v              <  ^   >~{]02.1+1+ffr+1r<
 :}[r]{  [01>:{*@@+$a*l2=?!^~]+ff+9+1g"3"=?v"3"ff+9+1pf0.
 :}[l01-$>    $:0(?v$@$:@@:@)?v@@1-$}v     >"2"ff+9+1p00.
>.       ^-1l v!?} <  .4a}$@@$<   .4a<
^26{]r0[}:{]~{<

Попробуйте онлайн! Позвоните, -v nчтобы получить список из n-1 элементов, начиная с 1

Онлайн переводчик рыбы

Длинный и сложный, это OEIS A004000 .

Пусть a (n) = k, образуйте m путем обращения цифр к k. Добавьте m к k. Затем отсортируйте цифры суммы в порядке возрастания, чтобы получить a (n + 1).

Пример: 668 -> 668 + 866 = 1534 -> 1345.

Nзнак равно34

1 2 4 8 16 77 145 668 1345 6677 13444 55778 133345 666677 1333444 5567777 12333445 66666677 133333444 556667777 1233334444 5566667777 12333334444 55666667777 123333334444 556666667777 1233333334444 5566666667777 12333333334444 55666666667777 123333333334444 556666666667777 1233333333334444 5566666666667777

Как запустить программу, чтобы получить один выход для данного n(как того требует вопрос)?
Джонатан Аллан

Поскольку на самом деле в «рыбах» нет «функций», я добавил версию, которую вы можете вызвать, чтобы получить n-ую (которая по сути та же самая, потому что она должна вычислить n-1 предыдущих элементов)
crashoz

Что еще более важно, у вас есть трещина, которая соответствует той же входной индексации, которая дает один выход?
Джонатан Аллан

1
1<=N<=34N>34


2

Желе , 6 байт , безопасно!

<4+ạ2ȯ

Это определяет последовательность с нулевым индексом , где:

a(N)знак равно{1N<32Nзнак равно3N-2N>3

Как таковые первые шестнадцать значений a(0)a(15) являются 1,1,1,2,2,3,4,5,6,7,8,9,10,11,12,13

Попробуйте онлайн! ( здесь версия с одним значением)

Это не в настоящее время в OEIS (хотя A34138 будет работать как трещина, если достаточно короткая)

Преднамеренная трещина

Последовательность выше согласуется с количеством десятичных цифр первых 16члены A062569 , сумма делителей факториалаN(также с нулевым индексом).
17госрок А062569 , однако,107004539285280 который имеет 15 цифры не 14знак равноa(16),

Требуемый код составляет пять байт в Jelly !ÆsDL.


1

JavaScript, 26 байт ( взломан )

let f=x=>x>1?f(x-1)*f(x-2)+1:1

for (x of [0,1,2,3,4,5,6,7]) {
  console.log(x + ' -> ' + f(x))
}

OEIS A007660

Выводятся первые 6 элементов с индексированием 0 (1,1,2,3,7,22)

(несколько смещено от того, что OEIS перечислило как)

Просто создаю простой, чтобы решить ответ, чтобы начать вещи

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



Вывод вашего примера фрагмента начинается с 1, а не с 0?
Пауло Эберманн

@ PaŭloEbermann Исправлено
fəˈnɛtɪk


1

APL (Dyalog Unicode) , 17 15 байт

⌈∊∘1 5+.633*5-⊢

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

Первые 13 терминов (на основе 1):

2 1 1 1 2 2 3 4 7 10 16 25 39

Подсказка. Предполагаемое решение использует одну из наименее используемых встроенных функций.



@ngn Обновлено представление полицейского :)
Bubbler

1

Шелуха , 5 байт ( треснул от Jonathan Allan )

Этот A000030 смещен на16:

←d+16

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

Последовательность 0-индексирована, вывод для0N<23:

1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3

объяснение

←d+16  -- example input:  23
  +16  -- add 16:         39
 d     -- digits:         [3,9]
←      -- extract first:  3

Решение

LdΣ



1

JavaScript, 25 байт ( взломан 21 байт)

f=
x=>[7,11,12,13,13][x]||14

for(i=0;i<15;i++)
  console.log(i+"->"+f(i))

Последовательность 7,11,12,13,13, за которой следуют бесконечные 14 с.

Предполагаемое решение 22 байта:

х = Math.atan (х + 1) * 10 | 0

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



0

JavaScript, 22 байта ( взломан )

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

for(y=0;y<16;y++)
  console.log(y +"->"+f(y))

Это индексировано 0, и требуется точность до ввода 15. Его нельзя найти в OEIS.

Мое решение 20 байт

х => 163 ** (32 * х / 163) | 1

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



0

> <> , 42 байта, трещины

i3%0v
642 .
840
789
159
a 1
v<<
n
l
?
\/
;

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

Последовательность взлома (0-индексированная): 101786, 5844, 19902(не в OEIS).

Предполагаемое решение , для справки.



Обычно грабители должны жестко кодировать вывод
Джо Кинг,

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

1
Я обновил свой ответ, чтобы получить другое значение4
Джо Кинг,

0

Perl 6 , 53 байта

{(1,2,2,{$!=++$;prepend(@,2-$!%2 xx$_).pop}...*)[$_]}

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

Анонимный кодовый блок, который возвращает 0-индексированную последовательность Колакоски ( OEIS A000002 ). Решения должны соответствовать первым 130 элементам, так что для некоторых n > 129он отличается от последовательности Колакоски.


0

Паскаль (FPC) , 86 байт ( взломан )

var n:word;begin read(n);write(n div 2+n div 4+n div 8+n div 16+n div 32+n div 64)end.

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

Последовательность должна быть равна до Nзнак равно120, Последовательность от входа 0 до входа 120

0   0   1   1   3   3   4   4   7   7   8   8  10  10  11  11  15  15  16  16  18  18  19  19  22  22  23  23  25  25  26  26  31  31  32  32  34  34  35  35  38  38  39  39  41  41  42  42  46  46  47  47  49  49  50  50  53  53  54  54  56  56  57  57  63  63  64  64  66  66  67  67  70  70  71  71  73  73  74  74  78  78  79  79  81  81  82  82  85  85  86  86  88  88  89  89  94  94  95  95  97  97  98  98 101 101 102 102 104 104 105 105 109 109 110 110 112 112 113 113 116


Мое оригинальное решение было

var n,i,s:word;begin read(n);i:=2;repeat s:=s+n div i;i:=i*2until i>n;write(s)end.

но r_64 сделал это еще лучше !


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