"Подходящие номера"
У Сэма есть «блестящая» идея по сжатию! Вы можете помочь?
Вот краткое изложение схемы сжатия Сэма. Сначала возьмем в качестве базового 10 представление любого натурального числа, строго меньшего 2 ^ 16, и запишем его в виде двоичной строки без начальных нулей.
1 -> 1 9 -> 1001 15 -> 1111 13 -> 1101 16 -> 10000 17 -> 10001 65535 -> 111111111111111
Теперь замените любую группу из одного или нескольких нулей одним нулем. Это потому, что число стало меньше. Ваша двоичная строка теперь будет выглядеть следующим образом.
1 -> 1 -> 1 9 -> 1001 -> 101 15 -> 1111 -> 1111 13 -> 1101 -> 1101 16 -> 10000 -> 10 17 -> 10001 -> 101 65535 -> 111111111111111 -> 111111111111111
Теперь вы преобразуете двоичную строку обратно в базовое 10 представление и выводите ее в любом приемлемом формате. Вот ваши тесты. Первое целое число представляет вход, а последнее целое представляет выход. Обратите внимание, что некоторые числа не меняются, и, таким образом, их можно назвать «соответствовать»
1 -> 1 -> 1 -> 1 9 -> 1001 -> 101 -> 5 15 -> 1111 -> 1111 -> 15 13 -> 1101 -> 1101 -> 13 16 -> 10000 -> 10 -> 2 17 -> 10001 -> 101 -> 5 65535 -> 1111111111111111 -> 1111111111111111 -> 65535 65000 -> 1111110111101000 -> 11111101111010 -> 16250
Вы можете использовать любой язык, но учтите, что Сэм ненавидит стандартные лазейки. Это кодовый гольф, поэтому код может быть как можно короче, чтобы освободить место для «сжатых» чисел ».
Примечание. Это НЕ приемлемая схема сжатия. Используя это быстро вы получите уволены.
Необходимая цитата: я не беру кредит на эту концепцию. Это взято из блога @Conor O 'Brien здесь, смотрите этот OEIS подходящих чисел. https://oeis.org/A090078
10000
?Ответы:
05AB1E ,
86 байтобъяснение
Попробуйте онлайн
Сохранено 2 байта благодаря Аднану
источник
„00'0
на00¬
:).Утилиты Bash + GNU, 27
Ввод читать из STDIN.
источник
dc
:)JavaScript (ES6), 41 байт
источник
Медуза , 20 байт
Попробуйте онлайн!
объяснение
i
это вход.b
преобразует его в двоичный файл (список цифр)\d
с аргументами2
и список цифр применяетсяd
(двоичные цифры к номеру) для каждой подстроки длины-2 списка цифр.*
принимает значение результатов: 00 переходит в 0, все остальное в 1.,1
ставит 1 в конец, поэтому последняя цифра не теряется.# S
выбирает изbi
тех цифр, которые имеют 1 в списке, вычисленном выше: те, которые не являются левой половиной 00.d
преобразует обратно в число иp
печатает результат.источник
Python 2, 36 байт
Прямая рекурсивная реализация без встроенных базовых преобразований или строковых операций. Менее гольф:
Когда
n
значение кратно 4, оно заканчивается двумя двоичными числами 0, поэтому мы сокращаем одно делением на пол на 2. В противном случае мы разбиваемсяn
на части(n%2) + 2*(n/2)
, оставляем последнюю двоичную цифру вn%2
покое и рекурсивно определяем другие цифрыn/2
.источник
n%2
избыточно?|n
дает неправильные результаты.(n%4>0)|n%2
с(n%4>0)
.(f(n/2)<<(n%4>0)) | n%2
.Bash (sed + bc),
605543 байтаредактировать:
sed -E 's/0+
наsed 's/00*
и изменил эхо и трубу, используемую для передачи значения в bc с<<<
.пример:
источник
echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bc
на 2 байта корочеecho $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]
. Ноdc
иtr
сделайте это короче .bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
tr -s 0
вместо sed, вы можете получить до 36 байтPerl 6 ,
3127 байтОбъяснение:
Пример:
источник
MATL,
1198 байтЭта версия работает только в MATLAB, поскольку
strrep
в MATLAB может обрабатывать логические входы. Вот версия, которая будет работать в Octave (9 байт) (и, следовательно, онлайн-интерпретатор), которая явно вводит логические входные данные для вводаdouble
.Попробуйте онлайн
объяснение
источник
Python 3,
55, 50 байтов.Сохранено 4 байта благодаря Sp3000.
Довольно простое решение.
источник
0b
и простоeval
вместо этого?lambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
Javascript (ES6), 40 байт
источник
console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0)))
.N=>
что сделает его действительным представлением функции.На самом деле, 14 байтов (не конкурирующих)
Попробуйте онлайн!
Это сообщение не является конкурирующим, поскольку после публикации этого запроса
Æ
было сделано исправление для .Объяснение:
источник
Рубин,
3531 байт-2 байта благодаря @ Doorknob
Смотрите его на repl.it: https://repl.it/CnnQ/2
источник
Желе ,
137 байт6 байтов спасибо Згарбу за его алгоритм .
Попробуйте онлайн!
источник
PHP,
5351 байтПринимает аргумент из консоли.
Благодаря:
@manatwork замените "0" на 0
источник
"0"
и0
обрабатываются одинаково.Perl, 38 + 1 (
-p
) = 39 байтНеобходимо
-p
запустить флаг (я добавил-l
флаг, чтобы сделать его более читабельным, но в противном случае он не нужен):Обратите внимание на многое, что можно сказать о коде: он преобразует число в двоичную (
sprintf"%b"
), затем заменяет блоки нулей на один ноль и преобразует результат в десятичную (oct"0b".
).источник
C #,
11291 байт-8 байт благодаря TuukkaX
источник
int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}
- 94 байта с использованием регулярных выражений. Я видел много решений на C #, которые не включены,System.Text.RegularExpressions
так что, может быть, это разрешено и здесь ...?int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}
86 байт.Ява, 75
Тестовая программа:
источник
PARI / GP ,
5443 байтаисточник
PowerShell v2 +, 69 байт
( функция-запрос Более короткий способ преобразования в / из двоичного файла в PowerShell )
Принимает ввод
$args[0]
, использует встроенный .NET[convert]::ToString(int,base)
для преобразования входного целого числа в двоичную базовую строку. Это фильтрует через,-replace
чтобы убрать любые прогоны из одного или нескольких нулей, чтобы просто0
. Эта результирующая строка отправляется обратно в другом направлении через[convert]::ToInt32(string,base)
чтобы превратить двоичный код обратно в целое число. Это целое число остается в конвейере, а вывод неявным.Тестовые случаи
источник
Реализация в SILOS «всего» 417 байт
Golfed
Вот эталонная реализация, полностью расклеенная. В качестве бонуса он выводит шаги, необходимые для ответа.
По запросу транспиляция была удалена. Не стесняйтесь просматривать историю редактирования, чтобы восстановить ее, в противном случае перейдите к этому репозиторию для переводчика.
Пример вывода на 65000
источник
Пиф, 12
В сети.
источник
Сетчатка , 30 байт
Попробуйте онлайн!
И тут я подумала, что Ретина будет среди первых ответов ...
источник
Java,
152143138 байтисточник
Integer i;
Часть проста и фантастика!Дьялог АПЛ , 19 байт
Попробуй APL онлайн!
Эта функция действительно «поверх» двух функций, первая функция:
2∘⊥⍣¯1
обратный из бинарны в десятичное целом конверсии, т.е. бинарен от десятичного целого преобразованиядва
2
связанно∘
с -в-десятичном⊥
повторить операцию
⍣
одно отрицательного время¯1
(т.е. один раз, но перевернутое)Во второй функции бинарный результат выше представлен
⍵
:{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵
Булево для где {0, 0} начинается в ⍵~
Булево отрицание, так что теперь мы имеем ᴛʀᴜᴇ везде, но при непервых нулях в нулевых сериях⍵/⍨
используем это для фильтрации ⍵, так что это удаляет наши нежелательные нули2⊥
преобразования двоичного в десятичноеисточник
TSQL, 143 байта
Не использовать встроенные модули для преобразования из и в двоичный файл.
Golfed:
Ungolfed:
скрипка
источник
CJam, 16
Попробуйте онлайн
Это довольно долго из-за отсутствия регулярных выражений.
Объяснение:
источник
Java, 64 байта
Тестовая программа
источник
CJam , 23 байта
Попробуйте онлайн!
объяснение
источник
Рубин,
3735 байтСохранено два байта благодаря ручной работе.
Наивный подход. (:
источник
"0"
см 2 - й пункт в sepp2k «s наконечник . Относительно того.to_i(2)
, где нет двусмысленности относительно того, где принадлежит параметр, круглые скобки являются необязательными.C 37 байт
источник