Жорстке кодування копів та розбійників (грабіжників)


12

Це виклик . Поліція копів до цього виклику знаходиться тут

Цікавим питанням, про який слід задуматися, є наступне:

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

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

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

Виклик

Цей виклик є викликом для . У яких поліцейські представлятимуть тестові справи, а грабіжникам доведеться знайти коротший спосіб підробляти тестові справи, окрім передбачуваної послідовності. Копи представлять наступні речі:

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

  • Будь-які відповідні вимоги до платформи чи мови, які можуть вплинути на вихід, наприклад, розмір longint.

  • Число , поряд із першими членами послідовності, обчисленими кодом. Вони будуть виконувати роль "тестових випадків".nнн

Розбійники знайдуть програму на тій же мові, яка коротша за представлену, і передає всі тестові випадки (видає той самий вихід для перших входів, як і код поліцейського). Код грабіжника також повинен відрізнятися за результатами програми копа на деяку кількість, що перевищує .nнн

Оцінка балів

Грабіжники будуть набрані за кількістю тріщин, які вони виявлять, а більше тріщин буде кращим. Відповідь можна знову зламати, знайшовши дійсну відповідь, меншу за вихідну. Якщо відповідь зламається вдруге, то бал надається другому злому, а не першому.


2
Чи не дозволяємо розбійникам бити один одного за зламати відповідь (тобто найкоротший тріск у мові, який перемагає)
fəˈnɛtɪk

@ fəˈnɛtɪk Звучить, добре, що я додав це.
Ad Hoc Hunter Hunter

Відповіді:



5

JavaScript, відповідь fəˈnɛtɪk (17 байт)

x=>"11237"[x]||22

Що ж, на жорсткому коді було легко отримати набагато менший бал ... Відмінність від еталонної реалізації для будь-якого запису , 0-індексується. Для цього використовується дуже відомий трюк для гольфу JS: індексація в послідовності з цілим числом, яке перевищує межі його, повертає помилкове значення ( ), тому в цьому просто його можна привести до значення за замовчуванням, використовуючи логічний АБО ( ) випадку , що обробляє останній термін послідовності, а також наступний термін.x6undefined||22

Тестування

let f=x=>"11237"[x]||22

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

Крім того, спробуйте в Інтернеті!


4

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

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

Спробуйте в Інтернеті!

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

Це лише відповідь BMO мінус особливий випадок b 42. Оскільки оригінал Лайконі переходить через плаваючу точку, це не обов'язково: просто знайдіть число, яке є досить великим, щоб дати помилки округлення в цьому, але не в точній Integerарифметиці. Наприклад:

a 100000000000000000000000 = 4999999999999999580569600000000000000000000000
b 100000000000000000000000 = 5000000000000000000000000000000000000000000000

Я думав, що це може бути можливим (отже, я написав, що його можна переписати на необхідні умови), але не знайшов значення, для якого це працює. Чудово зроблено!
ბიმო

4

Python 2 , відповідь xnor , 43 байти

н=69

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

Спробуйте в Інтернеті!

Кредити

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

Як?

Теорія

pаp

(1)аp-11(модp)

а=2

2p-11(модp)

к

2p-1=кp+1

Що призводить до:

2p=2кp+2
2p-1=2кp+1
(2)2p-11(модp)

p=22

ан-11(модн)на

2н=341=11×31

2341-11(мод341)
2341-11(мод341)

341347

Впровадження

(2)

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

<2==1121-10(мод1)

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, завдяки Лайконі !

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

Спробуйте в Інтернеті!

Пояснення

0н20ceiling(realToFrac n/2)div(n+1)2н>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.

Спробуйте в Інтернеті!

0н120н=128127126

Це здається пізньою відповіддю, але все одно дякую @AlexRacer за гарну головоломку!


1
Ого, це навіть коротше, ніж у мене. Ласкаво просимо до PPCG!
AlexRacer


1

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

Ви можете бачити у посиланні TIO або в результаті фрагмента стека, що він не вдається для записів вище 15 .

x=>2.7182819**x|1

Якщо точність буде потрібна лише для (перші 15 значень), тон1415x=>Math.exp(x)|1 вона працювала б і для 16 байт.

Тестування

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 байт БМО з  3  2 байтами

-1 завдяки BMO ( LdΣ-> оскільки, коли йому дано a Tnum, Lвиконується "довжина представлення рядків")

Спробуйте в Інтернеті!

а(0)а(23)а(24)
3←d+164 .

Т(0)=010


Вітаю, це було моє точне рішення! Однак я щойно зазначив, що для TNum s Lта Ld еквівалента економлять байт;)
ბიბ

Ах, я шукав "цифру" у вікі, щоб спробувати знайти цифрову довжину, але не помітив, що Lзамінює "довжину представлення рядків" для Tnum.
Джонатан Аллан

(Зверніть увагу, що вони еквівалентні лише для негативних цілих чисел - досить добре для цього.)
Джонатан Аллан


0

JavaScript, відповідь fəˈnɛtɪk , 23 байти

0н14

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

Спробуйте в Інтернеті!

Як?

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

н14

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

21 байт

NaNн14

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

Спробуйте в Інтернеті!

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