Определим функцию g как g (n) = n XOR (n * 2) для любого целого числа n> 0 .
Учитывая x> 0 , найдите наименьшее целое число y> 0 такое, что g k (y) = x для некоторого k> 0 .
пример
x = 549
549 = 483 XOR (483 * 2) (as binary: 1000100101 = 111100011 XOR 1111000110)
483 = 161 XOR (161 * 2) (as binary: 111100011 = 10100001 XOR 101000010)
Это означает, что g 2 (161) = 549 . Мы не можем идти дальше, так как нет такого n , что g (n) = 161 . Таким образом, ожидаемый результат для x = 549 равен y = 161 .
правила
- Вы не должны поддерживать недействительные записи. Пара (y, k) гарантированно существует для входного значения x .
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах!
Контрольные примеры
3 --> 1
5 --> 1
6 --> 2
9 --> 7
10 --> 2
23 --> 13
85 --> 1
549 --> 161
960 --> 64
1023 --> 341
1155 --> 213
1542 --> 2
9999 --> 2819
57308 --> 19124
57311 --> 223
983055 --> 1
a(n) = g(n)
Ответы:
Java 8,
68575352 байта-5 байт благодаря @ OlivierGrégoire .
Попробуйте онлайн.
Объяснение:
источник
n->{for(int i=0;i<n;)i-=(i*2^i)==n?n=i:-1;return n;}
(52 байта). Извините ^^ 'for(int i=0;n>i-=i+i^i^n?-1:n=i;);
?i+i^i^n?
это не логическое значение, поэтому он даже не будет компилироваться. Кроме того,n>i-=...
потребуется скобка (n>(i-=...)
), иn=i
она не разрешена в предложении else в тернарном if, только в предложении if (это последнее, я не знаю почему, но, к сожалению, именно так и есть в Java) ).n=i
не допускается в другом предложении троичного-if". Потому что Java будет разбирать его как(i-=(i*2^i)!=n?-1:n)=i
недопустимый.Python 2 ,
5453 байтаПопробуйте онлайн!
источник
JavaScript, 53 байта
G
isg^-1
, который установленi
в0
случае успеха, установленi
в1
случае сбоя.источник
f=n=>(g=n=>n<2?0/!n:n%2+2*g(n/2^n%2))(n)?f(g(n)):n
. К сожалению, скучный подход на 12 байтов короче.Pyth ,
13 1210 байтСохранено 1 байт благодаря @MrXcoder, и еще 2 байта после их предложения
Попробуйте онлайн
Объяснение:
источник
T
на 12 байтов.R ,
7365 байтПопробуйте онлайн!
Большое спасибо Giuseppe (-8) из-за ваших настроек, таких простых, но очень эффективных
источник
f=
так как функция должна быть связана дляf
правильной работы. Это, как говорится, хорошая работа, и взять +1 от меня!JavaScript,
3836 байтПопробуйте онлайн - начинает выдавать ошибки переполнения где-то между
9999
&57308
.источник
Желе ,
87 байтИспользуйте
⁺¿
для возврата последнего ненулевого элемента (спасибо Деннису за -1 байт)Попробуйте онлайн!
Грубая сила побеждает снова :(
источник
^Ḥ)i$⁺¿
сохраняет байт.C (gcc) ,
57565551 байт!=
~-
.байтпять байтов благодаря Rogem ; используя троичное выражение и причуды gcc.Попробуйте онлайн!
источник
X(O,R)
for(R=1;R;O=R?R:O)
сохраняет байт.R=O;
в конце кажется ненужным, экономя еще 4 байта.Z80Golf , 22 байта
Порт Java-ответа @ KevinCruijssen
Пример с вводом 9-Попробуйте онлайн!
Пример с вводом 85-Попробуйте онлайн!
Монтаж:
Пример сборки для вызова функции и вывода результата:
источник
a
вместо счетчика сделать счетчик цикловd
, вы можете заменитьld d,0
инструкции вxor a
обоих случаях, что сэкономит два байта.Java (JDK 10) , 78 байт
Попробуйте онлайн!
источник
JavaScript (Node.js),
484538 байт-7 байт благодаря @Neil, создающему рекурсивную версию моей итерационной версии ниже. Не работает для больших тестовых случаев.
Попробуйте онлайн.
Итеративная 45-байтовая версия, которая работает для всех тестовых случаев:
Порт моего Java ответа.
-3 байта благодаря @Arnauld .
Попробуйте онлайн.
источник
i-=i*2^i^n?-1:n=i
(но, к сожалению, не на Java).1
в JS. Благодарность!f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n
Рубин , 39 байт
Попробуйте онлайн!
Как и ожидалось для рекурсивной версии, жалуется на «слишком большой уровень стека» в последних тестовых случаях.
источник
Желе ,
119 байтПопробуйте онлайн!
Советы: используйте рекурсивную функцию вместо циклов.
Очень быстро, к сожалению, проигрывает подход грубой силы.
Обратите внимание, что:
Итак, мы неоднократно:
B
)^\
илиÄḂ
, они имеют тот же эффект).?
) хвост (последний элемент) (Ṫ
) накопленного XOR ненулевым (нечетное количество)ṛ
).источник
B^\⁸Ḅß$Ṫ?
Forth (gforth) , 71 байт
Попробуйте онлайн!
объяснение
источник
Perl 6 , 44 байта
Попытайся
Expanded:
источник
Пролог (SWI) , 44 байта
Попробуйте онлайн!
источник
PHP, 49 байт
Основано на ответах Кевина Круйссена.
Запустите как трубу с
-nr
или попробуйте онлайн .источник
F #, 92 байта
Попробуйте онлайн!
Рекурсивно проверяет числа от 1 до
i-1
. Если есть совпадение, проверьте меньшее для этого числа. Если совпадений нет, верните введенный номер.источник
JavaScript (Node.js) , 40 байт
Попробуйте онлайн!
Спасибо Шегги за -1 байт.
Порт моего желе ответа .
Наконец, есть язык, где этот подход
короче( упс ). (Я пробовал Python и Java , это не работает)Может кто-нибудь объяснить, почему я могу использовать
/2
вместо>>1
?источник
x/2
работает из-за арифметического занижения. Любое число IEEE 754 в конечном итоге будет оценено как 0, если его разделить на 2 достаточных раза. (А десятичная часть просто игнорируется, когда выполняется XOR, так что это не влияет на результат.)false
Вернулся на последней итерации неявно приводится к0
путем побитового оператора XOR.false
, не участвует . JS&&
ведет себя почти идентично Python / Luaand
.K (нгн / к) ,
3226 байтПопробуйте онлайн!
{
}
это функция с аргументомx
/
применяет его до схождения$[
;
;
]
если-то-иначе2\x
двоичные цифрыx
(это характерно для ngn / k)+\
частичные суммы2!
мод 2a:
назначить вa
*|
last - перевернуть (|
) и получить first (*
)если выше 1,
x
будут возвращеныв противном случае:
-1_a
отбросить последний элементa
2/
расшифровать двоичный файлисточник
C, 62 байта
На основе Java Кевина Круйссена:
int n(int j){for(int i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
Тестировать:
При запуске тестовая программа выводит:
C 54 байта
Работает только с C89 или K & R C:
n(j){for(i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
источник
int n(int j){for(int i=0;j>i-=i*2^i^j?-1:j=i;);return j;}
Эти 57 байтов работают?Wolfram Language (Mathematica) , 58 байт
Попробуйте онлайн!
Начинается со списка, содержащего только ввод. Итеративно заменяет список всеми целыми числами, которые уже есть в нем, или отображаются в нем с помощью операции double-and-xor. Затем
//.
говорит сделать это до достижения фиксированной точки. Ответ является наименьшим элементом результата.источник