Это был вдохновлен задачи 13 - неповторяющихся Binary о недавнем конкурсе НР CodeWars.
Давайте возьмем случайное десятичное число, скажем
727429805944311
и посмотрите на его двоичное представление:
10100101011001011111110011001011101010110111110111
Теперь разбейте это двоичное представление на подпоследовательности, где цифры 0
и 1
чередуются.
1010 010101 10 0101 1 1 1 1 1 10 01 10 0101 1 1010101 101 1 1 1 101 1 1
И преобразовать каждую подпоследовательность обратно в десятичную.
10 21 2 5 1 1 1 1 1 2 1 2 5 1 85 5 1 1 1 5 1 1
Задание
Возьмите одно положительное целое число в качестве входных данных и выведите последовательность положительных целых чисел, полученных в результате вышеуказанного процесса.
Детали
- Вход и выход должны быть десятичными или одинарными.
- Числа в выходных данных должны быть разделены разумным, понятным для человека способом, и они должны быть в десятичной или одинарной форме. Нет ограничений на пустое пространство. Допустимые стили вывода:
[1,2,3]
,1 2 3
,1\n2\n3
где\n
есть буквальные переводы строки и т.д.
Контрольные примеры
Input | Output
0 | 0
1 | 1
2 | 2
3 | 1 1
4 | 2 0
5 | 5
6 | 1 2
7 | 1 1 1
8 | 2 0 0
9 | 2 1
10 | 10
50 | 1 2 2
100 | 1 2 2 0
1000 | 1 1 1 1 10 0 0
10000 | 2 1 1 2 0 2 0 0 0
12914 | 1 2 2 1 1 2 2
371017 | 5 42 10 2 1
Дополнительное примечание: все числа в выходных данных должны иметь форму (2^k-1)/3
или 2*(2^k-1)/3
. То есть, 0 1 2 5 10 21, 42, 85, 170, ...
это A000975 в OEIS.
code-golf
sequence
base-conversion
binary
subsequence
El'ndia Starman
источник
источник
|tac
тогда останется в моем ответе :)Ответы:
Pyth,
1716 байт1 байт благодаря Якубе
демонстрация
Хорошее, умное решение. Использует некоторые менее известные особенности Pyth, такие как
x<int><list>
иc<str><list>
.источник
tJ
,+dJ
вы можете удалитьhM
.Mathematica, 47 байт
Ungolfed:
Split[list,f]
разбивает список на несколько списков, разбивая на позиции междуa
иb
еслиf[a,b]
не возвращаетTrue
.FromDigits[n,2] => Fold[#+##&,n]
это аккуратный наконечник от алефальфа.источник
Python, 86 байт
Так как я получил ужасное превосходство в Pyth, давайте просто сделаем это снова в Python.
Попробуй это здесь!
объяснение
Мы начнем с преобразования входного числа
n
в двоичную строку.bin(n)[2:]
заботится об этом. Нам нужно отбросить первые 2 символа этой строки, так какbin()
возвращает строку в формате0b10101
.Далее нам нужно определить границы подпоследовательностей. Это можно сделать с помощью регулярного выражения,
(?<=(.))(?=\1)
которое соответствует позициям нулевой длины в строке, имеющим одинаковое число слева и справа.Очевидным способом получения списка всех подпоследовательностей было бы использование метода,
re.split()
который разбивает строку на определенное регулярное выражение. К сожалению, эта функция не работает для совпадений нулевой длины. Но, к счастью,re.sub()
это так, поэтому мы просто заменяем эти совпадения нулевой длины пробелами и разделяем строку на них после этого.Затем мы просто должны разобрать каждую из этих подпоследовательностей обратно в десятичное число с помощью
int(s,2)
и все готово.источник
Желе, 12 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Утилиты Bash + GNU, 51
Ввод взят из STDIN.
dc -e2o?p
читает входное целое число из STDIN и выводит строку base 2sed -r ':;s/(.)\1/\1 \1/;t'
разбивает строку base 2 с пробелом везде, где есть одинаковые цифрыdc -e2i?f
читает разделенный двоичный файл за один раз, помещая каждую часть в стек, а затемf
выгружает весьdc
стек (выходные числа в обратном порядке) ...tac
.источник
JavaScript (ES6) 58
62 63Редактировать 1 байт, сохраненный thx @ETHproductions
Редактирование 4 байт сохраненного ТНХ @Neil
источник
/(01)*0?|(10)*1?/g
, или это что-то испортит ??x=>'0b'+x-0+' '
чтобы сохранить байт./((.)(?!\2))*./g
экономит вам крутые 4 байта.Pyth, 26 байт
Попробуй это здесь!
объяснение
Поскольку функция Python split () не разбивает совпадения нулевой длины, я должен заменить эти совпадения пробелом и разделить результат на этом.
источник
Pyth,
2221 байтПопробуйте онлайн: демонстрация
Действительно утомительное задание в Pyth.
Объяснение:
источник
05AB1E , 18 байт
Код:
Объяснение:
Попробуйте онлайн!
Использует кодировку CP-1252 .
источник
MATL ,
1817 байтПопробуйте онлайн!
источник
зш,
676355 байтЯ не знаю почему, но это не работает в Bash.
Спасибо Денису за 8 байтов!
источник
for
синтаксис. ... Подожди, нетfor
с?for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i]
.PHP,
В разобранном виде171168162160158121120131124118116113112 байтИспользуйте,
d(int)
и вы выключены, вывод -echo
строка ed,int
разделенная пробелом.Редактирует:
-3: перенес
$b
определение вstrlen()
вызов.-6: Удалено
$c
создание экземпляров.-2: наконец исправлена проблема конкатенации.
-2: без скобок для одной строки
for()
.-37: капитальный ремонт. Идти с
Array
chunklets вместо повторных вызововArray
->String
->Array
.-1: хитрый
$c
сброс.+11: Исправление. Отсутствовал последний кусок. Больше не надо.
-7: Не нужно создавать экземпляры
$d
вообще? Ницца.-6:
return
->echo
.-2: хруст
$c
.-3:Тернар, моя первая любовь.
-1: подлый подлый
$u
.источник
function d($i){for(;$d<$l=strlen($b=decbin($i));print$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"")$c.=$u=$b[$d];}
.Выпуклый 0.2+, 25 байт
Convex - это новый язык, который я разрабатываю и который основан на CJam и Golfscript. Интерпретатор и IDE можно найти здесь . Ввод - это целое число в аргументах командной строки. Это использует кодировку CP-1252 .
Объяснение:
источник
Java 8,
127119 байтВероятно, есть лучшее регулярное выражение для разделения строки. Я не опытный в регулярных выражениях, но я буду продолжать экспериментировать.
-8 байт благодаря @FryAmTheEggman
источник
APL (APL) ,
2125 байтовТеперь обрабатывает и 0.
Попробуйте онлайн!
2⊥⍣¯1⊢
преобразовать в base-2, используя столько битов, сколько необходимо (буквенное обратное преобразование из base-2){
…}
Применить следующую анонимную функцию0::
если произойдет какая-либо ошибка:0
вернуть 0⋄
Теперь попробуйте:2=/⍵
попарное равенство аргумента (потерпит неудачу в двоичном представлении длины 0)1,
подготовить 1⍵⊂⍨
использовать это для разделения аргумента (начинается новый раздел на каждом 1)2⊥¨
конвертировать каждый из базы-2источник
⊂
здесь действительно полезно. Я должен добавить это к Желе.R←X⊂Y
: С⎕ML<3
(т. Е. В стиле Dyalog) новый раздел запускается в результате, соответствующем каждому 1 в X, до позиции до того, как следующий 1 в X (или последний элемент X) станет последовательные элементы R. С⎕ML=3
(т. е. стиль IBM) новый результат запускается в результате всякий раз, когда соответствующий элемент в X больше, чем предыдущий. Элементы в Y, соответствующие 0 в X, не включаются в результат. Так что⎕ML←1 ⋄ 1 0 0 1 0 1 1 ⊂ ⍳7
это эквивалентно⎕ML←3
3 4 3 2 4 4 5 7 ⊂ ⍳7`Japt , 7 байт
Попробуй это
объяснение
источник
Python 3, 115 байт
объяснение
Полученные результаты
предыдущее решение (118 байт)
источник
Haskell,
147, 145 байтовmap(sum.zipWith((*).(2^))[0..]).([]%).b
это безымянная функция, которая вычисляет список.Менее гольф:
источник
Perl, 53 байта
Включает +1 для
-p
Запустить с номером на STDIN
alterbits.pl
:источник
PowerShell, 103 байта
Поскольку я ужасен в регулярных выражениях, я использую то же выражение, что и в ответе edc65 .
Абсолютно уничтожены длительными вызовами .NET для преобразования в / из двоичного файла и вызовом .NET для получения совпадений регулярных выражений. В остальном довольно просто. Принимает входные данные
$args[0]
,convert
s это в двоичном формате,Matches
передает их, принимает результирующие.Value
s, направляет их через цикл|%{...}
иconvert
возвращает эти значения обратноint
. Вывод остается в конвейере и неявно печатается с новыми строками.Для дополнительного кредита - (в основном) версия без регулярных выражений в 126 байтах
Мы снова берем входные данные,
$args[0]
иconvert
это в двоичном виде. Мы повторно приводим как массив символов, сохраняя первый символ в,$l
а остальные символы в$r
. Затем мы отправляем$r
через цикл, в|%{...}
котором каждую итерацию мы выбираем из символа с добавлением пробела или только из символа, в зависимости от результата двоичного xor с$l
, и затем устанавливаем$l
равным символу. Это эффективно гарантирует, что если у нас будет один и тот же символ дважды в строке, мы добавим пробел между ними.Выходные данные цикла
-join
редактируются вместе и добавляются к первому символу$l
, а затем-split
к пробелам (что технически является регулярным выражением, но я не собираюсь его считать). Затем мы делаем тот же цикл, что и регулярное выражение для ответа,convert
и выводим целые числа.источник
Java 345 байт
Тест
Выход
источник
package
иclass
, и удаления ненужных пробелов. Дайте знать, если у вас появятся вопросы!Юлия,
7057 байтЭто анонимная функция, которая принимает целое число и возвращает массив целых чисел. Чтобы вызвать его, назначьте его переменной.
Подход здесь похож на хороший ответ DenkerAffe на Python . Мы получаем двоичное представление
n
использованияbin(n)
и разбиваем результирующую строку на все совпадения регулярного выражения(?<=(.))(?=\1)
. Это на самом деле совпадение нулевой длины;(?<=(.))
является положительным взглядом сзади, который находит любой отдельный символ, и(?=\1)
является положительным взглядом вперед, который находит совпавший символ во взгляде сзади. Это находит места, где число следует за собой в двоичном представлении. Простоparse
каждый как целое число в базе 2, используяmap
и вуаля!источник
C
137129 байтВвод и вывод ведутся по стандартным потокам.
источник
puts
, хотя это было бы неприятно для использования, спецификация не требует завершающей строки.J , 16 байт
Попробуйте онлайн!
объяснение
источник
q / kdb +, 52 байта
Решение:
Примеры:
Объяснение:
q
интерпретируется справа налево.Преобразуйте входные данные в двоичные, обрежьте начальные нули, найдите индексы, где они разные, инвертируйте, чтобы получить индексы, где один и тот же, разбейте список по этим индексам, преобразуйте обратно в base-10. Выглядит немного тяжело по сравнению с решением APL, хотя ...
источник
PHP, 147
Нужно поставить дополнительное место в конце вывода, так как их нет ограничений. Уведомления отображаются для краткого кодирования.
Неуправляемая версия
источник
Сетчатка, 60
Попробуйте онлайн! Или попробуйте слегка модифицированную версию для всех тестовых случаев (с десятичным вводом / выводом).
К сожалению, совпадения нулевой длины, похоже, имеют две "стороны", что приводит к дублированию при использовании с регулярным выражением из третьего этапа. Хотя стоит всего один байт.
Принимает входные данные как унарные, выходные данные как унарные. Не совсем уверен в использовании различных унарных значений ввода / вывода, но это сэкономит 4 байта.
источник
Желе , 9 байт (не конкурирует?)
Попробуйте онлайн!
источник