Найдите программу, которая печатает эту целочисленную последовательность (нить Копса)


39

Это нить полицейских. Нить грабителей идет сюда .

Последний поток был уже 4 месяца назад .

Задача полицейского

  • Задача полицейского - написать программу / функцию, которая принимает положительное (или неотрицательное) целое число и выводит / возвращает другое целое число.
  • Полицейский должен заявить это, если программа нетерпима к нулю.
  • Полицейский предоставит как минимум 2 образца ввода / вывода.
  • Например, если я решил написать последовательность Фибоначчи , я написал бы это в своем ответе:
a (0) возвращает 0
а (3) возвращает 2
  • Количество примеров зависит от усмотрения полицейского.
  • Тем не менее, последовательность должна фактически существовать в онлайн-энциклопедии целочисленных последовательностей® , так что вам не нужен генератор псевдослучайных чисел.:(
  • Полицейский может скрыть столько персонажей, сколько пожелает.
  • Например, если моя программа:

function a(n)
    if n>2 then
        return n
    else
        return a(n-1) + a(n-2)
    end
end

  • Тогда я бы спрятал эти символы так, как хочу:

function a(n)
    if ### then
        ########
    else
        ######################
    end
end

Задача грабителя

  • Очевидно, чтобы найти оригинальный исходный код.
  • Однако любой предложенный исходный код, который производит тот же набор выходных данных, также считается действительным, если он также найден в OEIS.

Советы для полицейских

  • Функция поиска в OEIS работает только для последовательных терминов, поэтому, если вы хотите скрыть свою последовательность, просто оставьте дыру в любом месте.
  • Видимо, нет способа скрыть последовательность. Помните это, когда вы выбираете последовательность.

Ваша оценка - это количество байтов в вашем коде.

Победителем станет представление с самым низким счетом, которое не было взломано в течение 7 дней.

Только заявки, опубликованные в апреле 2016 года, имеют право на победу. Материалы, которые размещены позже, приветствуются, но не могут выиграть.

Чтобы претендовать на выигрыш, вам необходимо раскрыть полный код и последовательность OEIS (через 7 дней).

Ваш пост должен быть отформатирован следующим образом (NN - количество символов):


Луа, 98 байт

Выход:

a(0) returns 0
a(3) returns 2

Код ( #помечает нераскрытые символы):

function a(n)
    if ### then
        ########
    else
        ######################
    end
end

Если код взломан, вставьте [Cracked](link to cracker)в шапку. Если отправка безопасна, вставьте «Safe» в заголовок и покажите полный код в вашем ответе. Только ответы, которые раскрыли полный код, будут иметь право на выигрыш.


2
Кроме того, поиск OEIS может иметь пробелы _, fyi
Sp3000

9
Это может быть слишком поздно для изменения, но разрешение последовательностей, кратных последовательности OEIS и / или включающих только каждый n-й член, сделало бы эту задачу намного лучше. песочница, подсказка, подсказка
Натан Меррилл

6
Могу ли я, например, выбрать последовательность Фибоначчи и предоставить только a(1000)? (которая является частью последовательности, но слишком большой для поиска в OEIS)
Sp3000

2
Я бы сказал, что значения должны быть доступны для поиска в OEIS, чтобы можно было легко убедиться, что значения верны для выбранной последовательности.
Mego

3
«Нетерпимость к нулю» не имеет смысла. Что это должно значить?
feersum

Ответы:


11

Vim, 36 нажатий клавиш - безопасно!

i****<esc>:let @q="^*i****$**@***"<cr><n>@qbD

(Примечание: <n>где вы вводите данные)

Вот код, не связанный с генерацией чисел:

          :let @q="              "<cr><n>@qbD

Это значит, что я раскрываю 5 из 19 символов.

<n>это вход. Вот несколько примеров выходных данных:

1@q:    1
2@q:    3
6@q:    18

Ответ

Этот код печатает номера Лукаса ( A000032 ), которые похожи на последовательность Фибоначчи, за исключением того, что она начинается 2, 1вместо 1, 1. Вот первые 15 номеров:

2, 1, 3, 4, 7, 11, 18, 29, 47, 76, 123, 199, 322, 521, 843

Вот раскрытый код:

i2 1 <esc>:let @q="^diwwyw$pb@-<c-v><c-a>"<cr><n>@qbD

Объяснение:

i2 1 <esc>                          "Insert the starting numbers
          :let @q="....."<cr>       "Define the macro 'Q'

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

^                      "Move to the first non-whitespace character on the line.
 diw                   "(d)elete (i)nner (w)ord. This is different then 'dw' because it doesn't grab the space. 
                      "It also throws people off since 'i' is usually used for inserting text.
    wyw$               "Move to the next number, yank it then move to the end of the line 
        pb             "(p)aste the yanked text and move (b)ack
          @-     <c-a> "@- is the register holding the word we deleted. Increment the current number that many times.
            <c-v>      "Since we're adding <c-a> this from the command line, we need to type it as a literal.

Теперь нам просто нужно удалить второе число, так как первое число - это номер lucas, который мы хотим. Итак, мы делаем

b   "move (b)ack
 D  "(D)elete to the end of the line.

Также, если я не ошибаюсь, это первая безопасная подача! Это круто.


Я знаю последовательность, я думаю. Я просто не знаю, как превратить это в нажатия клавиш Vim.
Фонд Моника Иск

Вывод это просто число или вся строка?
ASCIIThenANSI

@ASCIIThenANSI После нажатия bDв конце выдается только одно число и дополнительный пробел.
DJMcMayhem

Я понял последовательность правильно!
Фонд Моника иск

8

05AB1E , 5 байт, безопасный

Последний на сегодня: с. Выход:

a(0) = 9
a(5) = 4
a(10) = 89

Код:

___m_

Запутанные символы обозначены _. Попробуйте онлайн! -ссылка. Использует CP-1252 кодировку .


Решение:

žhžm‡

Объяснение:

žh       # Short for [0-9].
  žm     # Short for [9-0].
    ‡    # Translate.

Попробуйте онлайн! или попробуйте для всех тестовых случаев! ,


Я знаю последовательность, но не то, как ее сгенерировать за несколько байтов ...
LegionMammal978

@ LegionMammal978 Да, я думаю, что это будет самая трудная часть этого.
Аднан,

Я могу получить его в 5 байтов с, g°<¹-но я не могу придумать, как использовать mэтот размер! D:
user81655

@ user81655 Да, это было альтернативное решение :).
Аднан

6

Элемент , 7 байт, трещины

Выход:

a(3) = 111
a(7) = 1111111

Это #скрытые символы, и все они для печати ASCII. Я думаю, что это на самом деле довольно сложно (всего 5 пропущенных символов).

###,##}

Для удобства вот попробуй онлайн и вики-версия Esolang страницы .


Моя оригинальная программа была:

_'[,$ ` }

Хитрость в том, что

]и }функционально идентичны (оба переводят на }Perl). Кроме того, я использовал ,$для создания 1дополнительного слоя путаницы, хотя можно ,полностью игнорировать , делая ,1вместо этого.


(Я знаю, что не должен спрашивать об этом, но) ты уверен, что это правильно? В частности }вместо ]?
Утренняя монахиня

@KennyLau }Правильно, и моя программа (насколько я знаю) работает в каждой версии Element.
PhiNotPi


Я думаю, что форматирование неправильно в вашем исходном коде?
Rɪᴋᴇʀ

@EasterlyIrk Это так. Если ты знаешь, как это исправить, будь моим гостем.
PhiNotPi

5

Джольф , 5 байт, трещины

Выход:

a(2) = 8
a(10) = 4738245926336

Все это очень важно, и я показал 1 из 5.

####x

Оригинальный код:

mPm$x
mP     cube
  m$   catalan number
    x  input

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



1
Для всех, кто интересуется, вот эта последовательность: oeis.org/A033536
Blue

5

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

Выход

f(0) -> 1
f(1) -> -1

Код

t=>~t##**#

Проверьте это в Firefox по ночам.Код является анонимной функцией. Это, вероятно, будет легко, поскольку спрятано всего три символа, но, по крайней мере, оно короткое! :П


Мой оригинальный код был:

t=>~top**t

но после грубого применения собственного кода для решения, я вскоре понял,

t=>~t.x**t(где xможет быть любой символ имени переменной)

также может быть использован. Это работает, потому что

в оригинальной спецификации оператора возведения в степень ES7 оператор имел более низкий приоритет, чем унарные операторы (в отличие от обычной математики и большинства других языков). ~выполняет побитовое NOT для t.x( undefined) или top( Object), которое преобразует их в 32-разрядное целое число со знаком (такие некастабильные, как они 0) перед выполнением NOT (так 0становится -1). Я углубился в это, и совсем недавно спецификация изменилась, чтобы запретить неоднозначные ссылки, подобные этой (не годится для будущего игры в гольф D:), однако большинство двигателей ES7 еще не обновили до последней версии спецификации.


1
@insertusernamehere Кажется, он содержит недопустимое выражение. Это работает в Firefox по ночам, хотя. Я предполагаю, что они реализуют спецификацию ES7 по-другому.
user81655

Я только что получил Firefox каждую ночь, и я должен жаловаться, что это не работает там. 32-битные окна отсюда
Конор О'Брайен

Предполагая, что **это равносильно тому Math.pow, что я провел некоторое собственное тестирование и даже использовал грубую силу. Это довольно сложно взломать!
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ Мой Firefox по ночам обновляется по состоянию на вчерашний день. Я использую OS X, но я уверен, что он будет работать и в Windows. Traceur с соответствующими опциями ES7 также правильно его переносит.
user81655

@ CᴏɴᴏʀO'Bʀɪᴇɴ Только что попробовал в 32-битной Windows по вашей ссылке, и это тоже работает. Я удивлен, что твой поиск грубой силы не смог его взломать. Я на самом деле только что понял, что есть много решений для этого! D:
user81655

4

05AB1E, 4 байта ( треснутый )

Образец вывода:

a(5) = 51
a(8) = 257

И для кода:

###^

Я показал последний. Хотя должно быть достаточно легко, мне было довольно трудно найти последовательность :(

Все скрытые символы доступны для печати.



4

MATL , 5 байт, трещины

Скрытые символы обозначены %.

%5%*%

Выход:

a(1) = 3
a(2) = 6
a(4) = 12

Ввод 0действителен.


Оригинальный код:

35B*s

то есть,

35    % push number 35
B     % convert to binary: array [1 0 0 0 1 1]
*     % multiply element-wise by implicit input n: gives [n 0 0 0 n n]
s     % sum of array: gives 3*n

2
Хм, пятерка в коде очень раздражает!
Аднан,

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



4

Рубин, 46 байтов, безопасный

Изменить, чтобы добавить отказ от ответственности / извинения: эта последовательность начинается с f [0], а запись OEIS начинается с f [1]. Значения одинаковы.

Запутанный код ( #это любой символ):

->####or x##1###(#..##0#);x*=3;end;#.###ect:+}

Звоните как

->####or x##1###(#..##0#);x*=3;end;#.###ect:+}[3] (returns 39)

Выход:

f[0] = 0
f[1] = 3
f[2] = 12
f[3] = 39
f[4] = 120
f[5] = 363
f[6] = 1092
f[7] = 3279
f[8] = 9840
f[9] = 29523

Решение:

f=->*x{for x[-1]in(0..x[0]);x*=3;end;x.inject:+}

Последовательность:

http://oeis.org/A029858

Объяснение:

Небольшая хитрость здесь в том, что мы объявляем параметр как, *xа не x. Это означает, что если вы проходите 2, сначала xустанавливается [2]... Основных трюк использует странно, и справедливо неясными, Ruby синтаксис , где вы можете установить итератор в цикле с любой действительной левой стороне выражения присваивания, вместо переменной итератора , как i. Таким образом, это перебирает от 0 до (в этом примере) 2, присваивая каждому числу x[-1]значение, означающее, что оно перезаписывает последнее значение x. Затем тело цикла x*=3дополнительно мутирует x, объединяя его с собой 3 раза. Итак, сначала х становится [0], потом [0,0,0]. На следующем цикле это становится [0,0,1], тогда [0,0,1,0,0,1,0,0,1]. Наконец мы переходим в 2, и это становится [0,0,1,0,0,1,0,0,2], то[0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 2], Затем мы суммируем результат, используя injectметод, который уменьшает массив, применяя +(переданный в метод) к каждому элементу по очереди. Если мы рассмотрим, как каждая итерация меняет сумму, мы увидим, что мы эффективно добавляем 1 (перезаписывая последний элемент на один элемент выше), а затем умножаем на 3. Так как 3*(n+1) = 3*n + 3это реализует рекуррентное отношение Александра Вайнберга для последовательности, как описано в стр.


Мне очень нравятся ваши копы здесь, особенно этот. Отлично сработано.
Не то, что Чарльз


3

Гексагония , 7 байт, трещины

Выход:

a(1) = 2
a(2) = 4

Скрытый код:

?#####@

Или в качестве альтернативы:

 ? #
# # #
 # @

Попробуйте онлайн, может пригодиться.



Подожди, твой код работает на ввод 0?
Мартин Эндер

@ MartinBüttner О, нет, мой плохой. Ваше решение было правильным, хотя.
Аднан,

3

PHP, 41 байт, взломан

Да, наконец-то еще один вызов копов и грабителей. Надеюсь, я не успокоился.

Выход

a(5)   = 0
a(15)  = 1
a(35)  = 0
a(36)  = 1
a(45)  = 1

Источник

____________________$argv[1]____________;
####################        ############

Заметки


Трещины

Я очевидно сделал это легко и предоставил недостаточно примеров. Последовательность, которую я имел в виду, была A010054 :

a (n) = 1, если n - треугольное число, иначе 0.

Вот мой оригинальный исходный код:

echo(int)($r=sqrt(8*$argv[1]+1))==$r?1:0;

Он проверяет, является ли вход треугольным числом и выводит 1или 0соответственно.



3

Jolf, 11 байт, Cracked , A011551

c*______x__

c*mf^+91x~P

Оригинальный код:

c*^c"10"x~P

Примеры:

0 -> 1

12 -> 1618033988749


@ Adnan Хорошая работа, хотя и отличается от моей. И вы не могли понять, первая операция. : P
Rɪᴋᴇʀ

Да, я не мог понять, что он делает: р
Аднан

@Adnan, это был приведенный к функции int, неправильно используемый как напольный.
Rɪᴋᴇʀ


3

Java, 479 байт, треснувший

Выходы:

a(10) = 81
a(20) = 35890

(Входные данные предоставляются через аргументы командной строки)

Код ( #отмечает скрытые символы):

import java.util.*;
public class A{

    public static int#########
    public boolean###########

    static A a = new A();

    public static void main(String[] args){
        int input = Integer.parseInt(args[0]);

        LinkedList<Integer> l = new LinkedList<>();
        l.add(1);
        l.add(0);
        l.add(0);

        for(int ix = 0; ################if(##>##{
            ###########d#
            #######+##p##########+##########(#######
        }

        System.out.println(#########################
            ###(A.#############(#5#####)));
    }
}

Программа начинается с индекса 0.

(Обратите внимание, что SE заменяет все \tотступы четырьмя пробелами, в результате чего общее количество байт до 569. Нажмите здесь, чтобы увидеть программу с\t отступами вместо пробелов.)

Оригинальный код:

import java.util.*;
public class A{
    public static interface B{
    public boolean C(int i);} 

    static A a = new A();

    public static void main(String[] args){
        int input = Integer.parseInt(args[0]);

        LinkedList<Integer> l = new LinkedList<>();
        l.add(1);
        l.add(0);
        l.add(0);

        for(int ix = 0; ix<input; ix++)cif(i->  {
            return l.add(
            l.pop()+l.peekFirst()+l.peekLast());});{    
        }

        System.out.println(l.get(1));}static boolean 
            cif(A.B b5){return (b5.C((0)));
    }
}

(Тот же код, но в обычном формате):

import java.util.*;

public class A {
    public static interface B { //functional interface for lambda expression
        public boolean C(int i); //void would have given it away
    }

    static A a = new A(); //distraction

    public static void main(String[] args) {
        int input = Integer.parseInt(args[0]);//Input

        LinkedList<Integer> l = new LinkedList<>();
        l.add(1);//Set up list
        l.add(0);
        l.add(0);

        for (int ix = 0; ix < input; ix++)
            cif(i -> { //Fake if statement is really a lambda expression
                return l.add(l.pop() + l.peekFirst() + l.peekLast());
            });
        { //Distraction
        }

        System.out.println(l.get(1));//Output
    }

    static boolean cif(A.B b5) { //Used to pass in lambda expression.
                  //The A. and b5 were both distractions
        return (b5.C((0)));
    }
}

Хм, как вы пришли к числу байтов 488? Я считаю 545 от iдо }? И, пожалуйста, укажите 0-допуск.
вампир

Разве не ваши примеры, a(9)и a(19)или a(8)и a(18), в соответствии с какой версией этого на OEIS вы взяли?
вампир

@ BjörnKautler Я отправлю ссылку на счетчик байтов, когда вернусь домой. Что вы подразумеваете под 0-толерантностью? Первое значение (1) = 0
Даниэль М.

Из ОП: «Задача полицейского - написать программу / функцию, которая принимает положительное (или неотрицательное) целое число и выводит / возвращает другое целое число. Полицейский должен указать это, если программа нетерпима к нулю». Поэтому я полагаю, что вы принимаете вход 1 как 0, и это также объясняет смещение позиции в соответствии с последовательностью OEIS.
вампир

@ BjörnKautler Хорошо, спасибо. Программа не падает, если вводится 0, но последовательность начинается с индекса 1, так что я думаю, что она нетерпима к нулю.
Даниэль М.


3

C, 71 байт взломан

############
#####
main(){
 scanf("%d",##);
 ###6#;
 printf("%d",##);
}

Выход:

a(1) = 0   a(2) = 0   a(5) = 1
a(6) = 1   a(7) = 1   a(9) = 2

Это работает с gcc и является полной программой. Он принимает 0 в качестве ввода.



Ну, я должен был показать больше персонажей. Я отправил другой, и я попытался избежать вызовов функций. codegolf.stackexchange.com/a/77583/52554
mIllIbyte

3

Pyth, 70 байт, треснувший

DhbI|qb"#"qb"#"R!1Iqb"#"#####+""s####2###;##lY+Q1Ih+""Z#####)=Z+Z1;@YQ

# скрытые персонажи

Был взломан, так что вот версия без скрытых символов:

DhbI|qb"4"qb"0"R!1Iqb"1"R!0Rh+""sm^sd2cb1;W<lY+Q1Ih+""Z=Y+YZ)=Z+Z1;@YQ

Пример выходов:

a(2) -> 10
a(4) -> 19

Удачи, чтобы найти это на OEIS, лично я не смог найти это на тех примерах (даже если последовательность довольно легко определить).



3

Рубин, 38 байт, трещины

Запутанный код ( #может быть любым символом):

->#{(s=#########).sum==#3333&&eval(s)}

Выход:

Умножает ввод на 10 (A008592). Работает для любого целого числа, включая 0. Например

->#{(s=#########).sum==#3333&&eval(s)}[3]  => 30
->#{(s=#########).sum==#3333&&eval(s)}[10] => 100




3

Lua, 45 байт, трещины

Небольшая подсказка:

a(0) will make the program crash :)

Выход

a(1)=>0
a(2)=>1

Код

Использует, #чтобы скрыть код :).

a=function(n)#####n###### and #or ########end

Я использовал OEIS A007814 со следующим кодом:

a=function(n)return n%2>0 and 0or 1+a(n/2)end


@KennyLau Отлично, я добавил OEIS, о котором думал, и предполагаемый код, мне нужно было добавить хотя бы еще один вывод, чтобы этого не произошло: p
Katenkyo

3

Пайк , 15 байт, БЕЗОПАСНЫЙ

Выход

a(2) = 21
a(15) = 17

Раскрытый код:

#R#D######+##)#

Решение:

OEIS A038822
wR}DSR_Q*L+#P)l
Я использовал пару красных сельдей, wR}чтобы сгенерировать число 100 и раскрыть символ, Rкоторый обычно используется для вращения стека. Я также использовал #P)lвместо более простого mPsподсчета количества простых чисел в последовательности.


Рассматриваемая последовательность начинается с n = 1, а не n = 0, между прочим
Blue

Я думал, что это та последовательность, за исключением того, что она начинается с n = 0, а не n = 1, как вы заявили.
Emigna

3

C, 82 байта, безопасно

####=############
main(i){scanf("%d",##);
for(i=1;i++/4<#;)##=2;
printf("%d",##);}

Работает с gcc, и это полная программа, которая читает входные данные из stdin и выводит их в stdout. Здесь последовательность A004526, этаж (n / 2) .

a(0) = 0    a(1) = 0    a(2) = 1
a(3) = 1    a(4) = 2    a(5) = 2
a(6) = 3    a(7) = 3    a(8) = 4

Решение:

a;*b=(char*)&a+1;
main(i){scanf("%d",&a);
for(i=1;i++/4<2;)a*=2;
printf("%d",*b);}

Это работает только на машинах с прямым порядком байтов и только если размер charсоставляет 1 байт.
И только если байт, превышающий байт самого высокого порядка, aимеет значение 0. Я думаю, что это верно для gcc, поскольку по умолчанию неинициализированные глобальные переменные идут в сегмент bss, а инициализированные глобальные переменные идут в сегмент данных (см. Https: // stackoverflow.com/questions/8721475/if-a-global-variable-is-initialized-to-0-will-it-go-to-bss ).
Таким образом, только aидет в bss (единственная другая глобальная переменная bинициализируется и, таким образом, входит в сегмент данных). Если значение aне находится в конце bss, то байт, более высокий, чем байт самого высокого порядка a, также находится в bss и, таким образом, имеет значение 0.


Попробуйте сделать
вызов

1
Я не думаю, что вы должны были указать последовательность ...
FliiFe

@FliiFe - Исправлено :)
mIllIbyte


2

Элемент , 10 байт, трещины

Выход:

a(3) = 6561
a(4) = 4294967296

Вероятно, есть только несколько способов вычислить эту последовательность в элементе. Я нашел решение с 9 символами, но я подумал, что это решение с 10 символами на самом деле сложнее. Это #скрытые персонажи.

#_####@^#`

Для удобства, вот вики- страницы Try It Online и Esolang .


Оригинал был

2_3:~2@^^`

Покажите еще один байт.
Утренняя монахиня

@KennyLau Я думал, что это был 1 из 5? Это 10 байт, и я показываю 3.
PhiNotPi

Входы и выходы не учитываются, поэтому у вас есть 8 байтов, и вы показали 1.
Leaky Nun

@KennyLau сделано.
PhiNotPi



2

05AB1E , 5 байтов,трещины

Я надеюсь, что это представление не так просто, как мои другие: с. Выходы:

a(0) = 0
a(1) = 1
a(2) = 6
a(3) = 24
a(4) = 80
a(5) = 240

Запутанный код:

####O

Содержит некоторые не-ASCII символы, хотя и использует кодировку CP-1252 .

Попробуйте онлайн! может пригодиться: с.



Почему я чувствую, что видел это раньше?
Утренняя монахиня

@KennyLau ¯ \ _ (ツ) _ / ¯
Аднан,

2

Джольф , 11 байт, Cracked .

Выход:

a(10) = 4
a(20) = 6
a(30) = 8

И частично скрытый код:

####xd###x#

Подсказка:

Когда я просмотрел последовательности по порядку, я не пошел очень далеко, прежде чем нашел этот.

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

l fzxd!m%xH

(Единственная часть, в которой я не уверен - !mэто то, что проверяет, равна ли переменная нулю.)


Я нашел последовательность ... Жаль, что я не очень хорошо знаю Jolf или javascript :(
Blue

@muddyfish, То же самое здесь ...
LegionMammal978

Ну, думаю, настало время для мастера сделать это ... можно?
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ Если все остальные находятся в тупике - и похоже, что они - не стесняйтесь.
Фонд Моники Иск


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