Рассмотрим следующий процесс:
Возьмите некоторое неотрицательное целое число N.
например, N =
571
Выразите это в двоичном виде без начальных нулей. (Сам ноль является единственным исключением, став
0
.)например
571
=1000111011
в двоичномРазбейте последовательные серии единиц и нулей в этом двоичном представлении.
например ,
1000111011
→1
,000
,111
,0
,11
Сортировать пробеги от самого длинного к самому короткому.
например
1
,000
,111
,0
,11
→000
,111
,11
,1
,0
Перезаписывайте все цифры в каждом прогоне чередующимися буквами
1
's0
' и 's', всегда начиная с1
's'.например
000
,111
,11
,1
,0
→111
,000
,11
,0
,1
Объедините результат, чтобы получить новое двоичное число.
например
111
,000
,11
,0
,1
→1110001101
=909
в десятичной системе
Когда вы выводите значения, полученные этим процессом, вы получаете довольно аккуратный график:
И, надеюсь, понятно, почему я называю полученную последовательность последовательностью Temple Skyline :
Вызов
Напишите программу или функцию, которая принимает неотрицательное целое число N и печатает или возвращает соответствующий порядковый номер Temple Skyline. Ваш ввод и вывод должны быть в десятичном виде.
Например, если вход является 571
выходом, должно быть 909
.
Самый короткий код в байтах побеждает.
Для справки приведем термины в последовательности от N = 0 до 20:
0 1
1 1
2 2
3 3
4 6
5 5
6 6
7 7
8 14
9 13
10 10
11 13
12 12
13 13
14 14
15 15
16 30
17 29
18 26
19 25
20 26
.BQ
вместоjQ2
, что означает, что вы можете потерять пространство между8
и предыдущим2
.is*R`s=!Z_ShMr.BQ8 2
интересное решение той же длины. Главным образом, потому что я не ожидал, что назначение в аргументе карты будет работать.`s
на]
. Сохраняет один байт.Python 2, 121 байт
125121: Спасибо Sp3000 за удаление 4 байта!
125
источник
n*`~i%2`for
вместо"10"[i%2]*n for
sorted(...,key=len)
вместо того, чтобы использовать,map(len,...
но я не до конца понимаю вашу программу, поэтому я не уверен, что это принесет вам пользу.len
потому что это единственная информация, которая мне нужна для репликации количества 1 и 0. Я попробовал ваше предложение, и оно добавляет 2 байта, так как мне придется использовать егоlen
дважды, но спасибо за предложение!JavaScript ES6, 110 байт
113116119120Сохранено 3 байта благодаря @intrepidcoder
Сохранено 3 байта благодаря @NinjaBearMonkey
Прямой подход. Не нравится длина функции сортировки, но я не могу придумать, как это сделать.
источник
+
вместоeval
.split(/(0+)/g)
должен быть в состоянии заменитьmatch(/(.)\1*/g)
.+(s=0, ... .map(l=>l.replace(/./g,s^=1))...)
C ++,
535527 байт(спасибо Зерегесу за то, что он сбрил несколько байтов.)
Теперь, когда мы избавились от этих байтов, программа стала конкурентоспособной;)
Я новичок в гольф, поэтому, пожалуйста, дайте мне несколько советов в комментариях .
Такие вещи, как «вам не нужны эти скобки» или «использовать printf», все полезны, но я также ценю советы по логике. Заранее спасибо!
Для простоты чтения я представляю версию без гольфа:
EDIT версия для гольфа сбила пару байтов, версия без гольфа не изменилась
источник
int a; int b;
использоватьint a,b;
. Также переменные в в глобальном контексте инициализируются с0
. Также вам не нужно использовать фигурные скобки, когда выполняется только одна команда. Такжеones=!ones;
может быть упрощено какones ^= 1;
for
цикл1
, т. Е.for(int i=D;i;i--)
И используйтеpow(2,i-1)
внутри цикла.ones
также может бытьint
. Может быть, макроint(pow(i))
вP(i)
. Я бы порекомендовал вам прочитать обсуждение здесьHaskell,
132131 байтПример использования:
Как это работает:
источник
J - 30 байт
Функция принимает целое число справа. Правильно обрабатывает 0.
#:
- Возьмите двоичное представление.1,2~:/\]
- Между каждой цифрой, отчет True, если они разные. Добавьте « Истину», чтобы в начале каждого «запуска» в списке было « Истина ».(#;.1~...)
- Используя приведенный выше логический вектор, определите длину каждого прогона.\:~
- Сортировать эти длины от самой длинной до самой короткой.2|#\
- Возьмите список чередования1 0 1 0 ...
до тех пор, пока список длин.(...#...)
- Для каждого числа слева (отсортированные длины) возьмите столько же соответствующего элемента справа (чередуя 1 и 0)&.
- Преобразуйте это новое двоичное представление обратно в число.Примеры:
источник
Perl 5.10,
121101Я думаю, что часть сортировки может быть короче.
Изменить: -20 байт, благодаря symbabque!
источник
\n
, иm
не требуется для сопоставления регулярных выражений. В вашей замене просто используйте.
вместо группы char.grep
части либо.oct
Это аккуратный , хотя :)Python 3,
146136 байтисточник
map
сlambda
, было бы лучше сделать''.join(... for ... in ...)
?Mathematica, 83 байта
Это определяет безымянную функцию.
источник
Руби,
107104102 байта(сэкономлено 3 байта благодаря NIMI )
Не собираюсь побеждать таких, как CJam, но я получил довольно мало для здравомыслящего языка.
источник
(i+=1)%2
естьi=1-i
.Java 8,
179176 байтЯ использовал два статических импорта:
java.util.Integer.highestOneBit
иjava.util.Arrays.sort
.Для читабельности вот код без кода:
источник
Python 2, 170 байт
источник
t(0) = 0
когда1
ожидается иt(4) = 1
когда ожидается 6