Вывести «Fit» номера


21

"Подходящие номера"

У Сэма есть «блестящая» идея по сжатию! Вы можете помочь?


Вот краткое изложение схемы сжатия Сэма. Сначала возьмем в качестве базового 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


1
Из комического блога @ Конора: ссылка
Rɪᴋᴇʀ

3
OEIS A090078 может пригодиться.
Аднан

Это я написал комикс. <s> Я также ожидаю 35% повторения роялти </ s>;)
Конор О'Брайен

Будет ли downvoter, пожалуйста, объяснить проблему?
Рохан Джунджхунвала

1
Почему 16 равно 8? Не должно быть 16 10000?
eithed

Ответы:


10

05AB1E , 8 6 байт

b00¬:C

объяснение

b        # convert input to binary
 00¬:    # replace 00 with 0 while possible
     C   # convert to int

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

Сохранено 2 байта благодаря Аднану


Вы можете заменить „00'0на 00¬:).
Аднан

@ Аднан Ницца! Не думал об этом.
Emigna

Я даже не знаю, почему я явно выдвинул их как строки ...
Emigna

Да, это немного нелогично, но это работает :).
Аднан

Похоже, это победит: D, я дам ему немного больше времени, прежде чем принять, чтобы больше людей могло участвовать.
Рохан Джунджхунвала



7

Медуза , 20 байт

p
d
# S
,1
*
\dbi
 2

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

объяснение

  • i это вход.
  • b преобразует его в двоичный файл (список цифр)
  • \dс аргументами 2и список цифр применяется d(двоичные цифры к номеру) для каждой подстроки длины-2 списка цифр.
  • * принимает значение результатов: 00 переходит в 0, все остальное в 1.
  • ,1 ставит 1 в конец, поэтому последняя цифра не теряется.
  • # Sвыбирает из biтех цифр, которые имеют 1 в списке, вычисленном выше: те, которые не являются левой половиной 00.
  • dпреобразует обратно в число и pпечатает результат.

6

Python 2, 36 байт

f=lambda n:n and f(n/2)<<(n%4>0)|n%2

Прямая рекурсивная реализация без встроенных базовых преобразований или строковых операций. Менее гольф:

f=lambda n:n and[f(n/2),n%2+2*f(n/2)][n%4>0]

Когда nзначение кратно 4, оно заканчивается двумя двоичными числами 0, поэтому мы сокращаем одно делением на пол на 2. В противном случае мы разбиваемся nна части (n%2) + 2*(n/2), оставляем последнюю двоичную цифру в n%2покое и рекурсивно определяем другие цифры n/2.


Разве это не n%2избыточно?
xsot

@xsot Не уверен, что ты имеешь в виду. Делать |nдает неправильные результаты.
xnor

Я имею в виду , вы можете заменить все (n%4>0)|n%2с (n%4>0).
xsot

@xsot Приоритет идет как (f(n/2)<<(n%4>0)) | n%2.
xnor

Ах, мой плохой тогда. Я думал, что сдвиг имеет самый низкий приоритет.
xsot

5

Bash (sed + bc), 60 55 43 байта

echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]

редактировать:

  1. изменил sed -E 's/0+на sed 's/00*и изменил эхо и трубу, используемую для передачи значения в bc с <<<.
  2. Гениальное предложение от @Digital Trauma!

пример:

$ bash script.sh 65000
16250
$ bash script.sh 15
15
$ bash script.sh 9
5

1
sed + bc был моей первой мыслью тоже. echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bcна 2 байта короче
Райли

1
Используйте трубы и убегает в свою пользу: echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]. Но dcи tr сделайте это короче .
Цифровая травма

1
@DigitalTrauma: Спасибо, это здорово! @Riley: хорошая идея, это было бы немного короче так:bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
Master_ex

если вы используете tr -s 0вместо sed, вы можете получить до 36 байт
Riley

@Riley: Да, но Digital Trauma уже использует его в другом ответе bash, поэтому я предпочитаю не использовать его :)
Master_ex

4

Perl 6 ,  31  27 байт

{:2(.base(2).subst(:g,/0+/,0))}
{:2(.base(2)~~{S:g/0+/0/})}

Объяснение:

-> $_ {
  # convert from base 2
  :2(

    # convert to base 2
    $_.base(2)

    # substitute
    .subst(
      :global,
      / 0+ /,  # all substrings made of 0s
      '0'      # with one 0
    )
  )
}

Пример:

my &fit-compress = {:2(.base(2)~~{S:g/0+/0/})}
say fit-compress 1;     # 1
say fit-compress 9;     # 5
say fit-compress 15;    # 15
say fit-compress 13;    # 13
say fit-compress 16;    # 2
say fit-compress 17;    # 5
say fit-compress 65535; # 65535
say fit-compress 65000; # 16250

# number created with 「:2( [~] <0 1>.roll: 256 )」
say fit-compress 80794946326210692074631955353531749442835289622757526957697718534769445507500
# 4240335298301026395935723255481812004519990428936918

4

MATL, 11 9 8 байт

BFFOZtXB

Эта версия работает только в MATLAB, поскольку strrepв MATLAB может обрабатывать логические входы. Вот версия, которая будет работать в Octave (9 байт) (и, следовательно, онлайн-интерпретатор), которая явно вводит логические входные данные для ввода double.

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

объяснение

    % Implicitly grab input
B   % Convert decimal to binary
FF  % Create the array [0 0]
O   % Number literal
Zt  % Replaces all [0 0] with [0] (will replace any number of 0's with 0)
XB  % Convert binary to decimal
    % Implicitly display

4

Python 3, 55 , 50 байтов.

Сохранено 4 байта благодаря Sp3000.

Довольно простое решение.

import re
f=lambda x:eval(re.sub('0+','0',bin(x)))

4
Можете ли вы сохранить 0bи просто evalвместо этого?
Sp3000

@ Sp3000 Конечно, можно! Спасибо за предложение!
Морган Трепп

Анонимные лямбды разрешены; Вы можете уменьшить это до 48 байтов, используяlambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
MilkyWay90

3

Javascript (ES6), 40 байт

n=>'0b'+n.toString(2).replace(/0+/g,0)-0

1
Боюсь, это фрагмент. Если в описании задачи не указано иное, ожидается, что решения будут либо полными программами, либо функциями.
manatwork

Что требуется, чтобы быть "полной программой" в Javascript, если я не хочу использовать функцию? Пожалуйста, порекомендуйте.
cychoi

Например , с Node.js: console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0))).
manatwork

Не по теме. Ваш блок кода имеет ту же проблему, что и @Master_ex. Это потому, что некоторые популярные скрипты конфигурации оболочки загрязняют терминал? Или вина SE?
cychoi

1
Самое короткое исправление будет заключаться в добавлении, N=>что сделает его действительным представлением функции.
Мартин Эндер

3

На самом деле, 14 байтов (не конкурирующих)

├`'0;;+(Æ`Y2@¿

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

Это сообщение не является конкурирующим, поскольку после публикации этого запроса Æбыло сделано исправление для .

Объяснение:

├`'0;;+(Æ`Y2@¿
├               bin(input) (automatically discards leading zeroes)
 `'0;;+(Æ`Y     call this function until the output stops changing:
  '0;;+           push "0", "00"
       (Æ         replace "00" with "0" in binary string
           2@¿  convert from binary to decimal

Тогда разместите конкурирующую версию!
Утренняя монахиня



2

PHP, 53 51 байт

<?=bindec(preg_replace("/0+/",0,decbin($argv[1])));

Принимает аргумент из консоли.

Благодаря:

@manatwork замените "0" на 0


1
В основном "0"и 0обрабатываются одинаково.
manatwork

@ Manatwork Спасибо. Это было довольно очевидно, я должен был увидеть себя.
Йерун

2

Perl, 38 + 1 ( -p) = 39 байт

$_=oct"0b".sprintf("%b",$_)=~s/0+/0/gr

Необходимо -pзапустить флаг (я добавил -lфлаг, чтобы сделать его более читабельным, но в противном случае он не нужен):

perl -plE '$_=oct"0b".sprintf("%b",$_)=~s/0+/0/gr' <<< "1
9
15
13
16
17
65535
65000"

Обратите внимание на многое, что можно сказать о коде: он преобразует число в двоичную ( sprintf"%b"), затем заменяет блоки нулей на один ноль и преобразует результат в десятичную ( oct"0b".).


2

C #, 112 91 байт

int x(int x)=>Convert.ToInt32(Rege‌​x.Replace(Convert.ToS‌​tring(x,2),"0+","0"),2);

-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так что, может быть, это разрешено и здесь ...?
Yytsi

int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}86 байт.
Yytsi

я не знаю, как вы считаете байты, я использую этот mothereff.in/byte-counter
downrep_nation

Я тоже использую эту страницу, но она не будет работать, поэтому я использовал другую страницу. Вы также должны указать требуемую версию C #.
Yytsi

mothereff.in/byte-counter вычисляет 79 байтов для вашего текущего решения. Я должен был напечатать решение вручную, иначе это дало бы мне 91.
Yytsi

2

Ява, 75

int f(Integer x){return x.valueOf(x.toString(x,2).replaceAll("0+","0"),2);}

Тестовая программа:

public class Fit {
    int f(Integer x){return x.valueOf(x.toString(x,2).replaceAll("0+","0"),2);}

    public static void main(final String... args) {
        final Fit x = new Fit();
        System.out.println(x.f(65000));
    }
}

Java 8 конвертировать в lamda x-> blah; для меньшего количества байтов
Rohan Jhunjhunwala

int f (Integer x) {return x.parseInt (x.toString (x, 2) .replaceAll ("0 +", "0"));} на пару байтов меньше
Рохан Джунджхунвала

@RohanJhunjhunwala Это неправильно, нужно использовать базу 2. Что касается лямбды, я чувствую, что она неполна без спецификации типа.
aditsu

о, хорошо, другой ответ java использует ту же технику
Rohan Jhunjhunwala



1

PowerShell v2 +, 69 байт

[convert]::ToInt32(([convert]::ToString($args[0],2)-replace'0+',0),2)

( Более короткий способ преобразования в / из двоичного файла в PowerShell )

Принимает ввод $args[0], использует встроенный .NET [convert]::ToString(int,base)для преобразования входного целого числа в двоичную базовую строку. Это фильтрует через, -replaceчтобы убрать любые прогоны из одного или нескольких нулей, чтобы просто 0. Эта результирующая строка отправляется обратно в другом направлении через[convert]::ToInt32(string,base) чтобы превратить двоичный код обратно в целое число. Это целое число остается в конвейере, а вывод неявным.

Тестовые случаи

PS C:\Tools\Scripts\golfing> 1,9,15,13,16,17,65535,65000|%{"$_ -> " +(.\output-fit-number.ps1 $_)}
1 -> 1
9 -> 5
15 -> 15
13 -> 13
16 -> 2
17 -> 5
65535 -> 65535
65000 -> 16250

1

Реализация в SILOS «всего» 417 байт

Golfed

readIO :
i + 1
I = i
z = 1 
n = 32
b = n
z = 1
n = b
lbla
n - 1
GOSUB p
j = i
j - p
if j b
if z c
z = 1
GOTO e
lblc
b - 1
if n a
GOTO f
lblb
z = 0
A = a
A + 1000
set A 1
i - p
lble
a + 1
if n a
lblf
q = 1000
e = q
e + b
i = 0
lbl>
d = q
d - e
if d ?
n = b
n - i
GOSUB p
g = get q
g * p
o + g
i + 1
q + 1
GOTO >
lbl?
o / 2
printInt o
GOTO z
funcp
p = 1
Z = n
lblQ
if Z C
GOTO D
lblC
Z - 1
p * 2
GOTO Q
lblD
return
lblz

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

/**
*Reference Implementation in the high quality S.I.L.O.S language.
*/
readIO Enter a number to "compress"
//some declarations
i + 1
I = i
z = 1 
//the above is a flag which shows whether or not a zero was last outputted
n = 32
b = n
//maximum number of input bits
printLine Original Binary



lblbinLoop
n - 1
GOSUB pow
j = I
j - p
if j printOne
if z ENDLOOP
print 0
GOTO ENDLOOP
lblprintOne
z = 0
print 1
I - p
lblENDLOOP
if n binLoop




printLine  
printLine Binary "Compressed"


z = 1
n = b


lbltopA
n - 1
GOSUB pow
j = i
j - p
if j printAOne
if z DontPrint
z = 1
print 0
GOTO ENDLOOPA
lblDontPrint
b - 1
if n topA
GOTO endOfBin
lblprintAOne
z = 0
print 1
A = a
A + 1000
set A 1
i - p
lblENDLOOPA
a + 1
if n topA

lblendOfBin

printLine  
printLine -----------
printLine Base 10 Output
print Out Bits:
printInt b

q = 1000
e = q
e + b
i = 0
lblOutputDec
d = q
d - e
if d DONE
n = b
n - i
GOSUB pow
g = get q
g * p
o + g
i + 1
q + 1
GOTO OutputDec
lblDONE
printLine
printLine ---------
o / 2
printInt o

GOTO funcs
//function declarations must be wrapped in gotoes to avoid the interpreter from complaining (breaking)

/**
*This will store the nth power of two in the "p" variable
*/
funcpow
p = 1
Z = n
lbltop
if Z continue
GOTO end
lblcontinue
Z - 1
p * 2
GOTO top
lblend
return

lblfuncs

По запросу транспиляция была удалена. Не стесняйтесь просматривать историю редактирования, чтобы восстановить ее, в противном случае перейдите к этому репозиторию для переводчика.

Пример вывода на 65000

Enter a number to "compress"
65000
Original Binary
1111110111101000 
Binary "Compressed"
11111101111010 
-----------
Base 10 Output
Out Bits:14
---------
16250

4
Реализованные реализации должны быть в теле запроса, а не в качестве ответов, так как они не одурачены и, следовательно, не являются серьезными соперниками.
Mego

Хорошо, я буду играть в гольф.
Рохан Джунджхунвала

Я не хотел раздуть контрольный корпус с этим @Mego
Rohan Jhunjhunwala

@TimmyD одну секунду я играю в гольф сейчас
Rohan Jhunjhunwala

@Mego Я играю в гольф сейчас
Rohan Jhunjhunwala


1

Сетчатка , 30 байт

.+
$*1;
+`(1+)\1
$1;
1;
1
;+
0

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

И тут я подумала, что Ретина будет среди первых ответов ...


@randomra Я задаю вопрос OP для разъяснения
Leaky Nun

Способна ли Retina к двоичному или десятичному преобразованию или двоичному к унарному? Я исключу любую из них, чтобы не исключать сетчатку
Рохан Джунджхунвала


Можно ли сделать это преобразовать в унарный или десятичный? В идеале я хотел бы видеть десятичную, но я приму либо.
Рохан Джунджхунвала

1

Java, 152 143 138 байт

interface C{static void main(String[]b){Integer i=0;System.out.print(i.parseInt(i.toString(i.parseInt(b[0]),2).replaceAll("0+","0"),2));}}
  • На 9 байт меньше благодаря @RohanJhunjhunwala. Я предпочитаю сохранить его как полностью функционирующую программу с основным и тому подобным. Тем не менее, конечно, это может быть в гольф в противном случае.
  • На 5 байтов меньше благодаря предложениям @ LeakyNun.

1
class A {public static void main (String [] a) {Integer i; System.out.print (i.parseInt (i.toBinaryString (i.parseInt (a [0]))). replaceAll ("0+", " 0 "), 2));}} для 8 байтов сохранения
Рохан Джхунджхунвала

оберните его в лямбда-выражение для еще большего сохранения и удаления определений классов и вашего набора.
Рохан Джунджхунвала

@RohanJhunjhunwala: Ах! Integer i;Часть проста и фантастика!
Master_ex

1
Это работает, но может выдавать предупреждение (в отличие от ошибки) в большинстве вменяемых IDE. Дело в том, что вы всегда можете вызывать статические методы из нестатического контекста, но вы никогда не можете вызывать нестатический метод из статического контекста. Хотя использование этого метода настоятельно не рекомендуется в производственном коде, это законный Java.
Рохан Джунджхунвала

1
codegolf.stackexchange.com/questions/6671/… Хорошее чтение, чтобы познакомиться с менее известными (смею сказать, более сомнительными) «особенностями» языка Java.
Рохан Джунджхунвала

1

Дьялог АПЛ , 19 байт

{2⊥⍵/⍨~0 0⍷⍵}2∘⊥⍣¯1

Попробуй APL онлайн!

Эта функция действительно «поверх» двух функций, первая функция:

2∘⊥⍣¯1обратный из бинарны в десятичное целом конверсии, т.е. бинарен от десятичного целого преобразования
два 2 связанно с -в-десятичном
повторить операцию одно отрицательного время ¯1(т.е. один раз, но перевернутое)

Во второй функции бинарный результат выше представлен :

{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵Булево для где {0, 0} начинается в ⍵
~Булево отрицание, так что теперь мы имеем ᴛʀᴜᴇ везде, но при непервых нулях в нулевых сериях
⍵/⍨используем это для фильтрации ⍵, так что это удаляет наши нежелательные нули
2⊥преобразования двоичного в десятичное


1

TSQL, 143 байта

Не использовать встроенные модули для преобразования из и в двоичный файл.

Golfed:

DECLARE @i INT=65000

,@ CHAR(99)=''WHILE @i>0SELECT @=REPLACE(LEFT(@i%2,1)+@,'00',0),@i/=2WHILE @>''SELECT @i+=LEFT(@,1)*POWER(2,LEN(@)-1),@=STUFF(@,1,1,'')PRINT @i

Ungolfed:

DECLARE @i INT=65000

,@ CHAR(99)=''
WHILE @i>0
  SELECT @=REPLACE(LEFT(@i%2,1)+@,'00',0),@i/=2

WHILE @>''
  SELECT @i+=LEFT(@,1)*POWER(2,LEN(@)-1),@=STUFF(@,1,1,'')

PRINT @i

скрипка


+1 за неиспользование встроенных модулей. Мой ответ SILOS (эталонная реализация) делает то же самое, но за него проголосовали, потому что люди не думали, что это серьезный конкурент. Важна ли новая линия?
Рохан Джунджхунвала

@ RohanJhunjhunwala новая линия не имеет значения. Я считаю символы кода после определения входной переменной и присвоения ей значения.
t-clausen.dk

хорошо, смысл смысла -
Рохан Jhunjhunwala

@RohanJhunjhunwala Я думаю, это круто, что вы используете неконкурсивный язык для решения вопросов Codegolf. Похоже, у вас есть ненужный код для добавления дополнительной информации - возможно, только в вашей версии без заглядывания. Вы всегда должны стараться предоставить максимально короткий код, сокращая углы и злоупотребляя языковыми запросами (в рамках вопроса). Если возможно, вы должны предоставить скрипку, так что магглы могут это проверить
t-clausen.dk

Версия без гольфа содержит ненужный код, но версия для гольфа не содержит дополнительного кода. Я могу перенести его в Java, если вы хотите, чтобы я это проверил.
Рохан Джунджхунвала

1

CJam, 16

q~2b1+0a%0a*);2b

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

Это довольно долго из-за отсутствия регулярных выражений.

Объяснение:

q~     read and evaluate the input number
2b     convert to base 2 (array of 1s and 0s)
1+     append a 1 to deal with trailing zeros
0a%    split by [0], dropping empty pieces; only chunks of 1s are left
0a*    join by [0]
);     discard the 1 we appended before
2b     convert back from base 2

1

Java, 64 байта

i->{return i.parseInt(i.toString(i,2).replaceAll("0+","0"),2);};

Тестовая программа

public static void main(String[] args) {
    Function<Integer, Integer> function = i -> {
        return i.parseInt(i.toString(i, 2).replaceAll("0+", "0"), 2);
    };

    System.out.println(function.apply(1)); // 1
    System.out.println(function.apply(9)); // 5
    System.out.println(function.apply(15)); // 15
    System.out.println(function.apply(13)); // 13
    System.out.println(function.apply(16)); // 2
    System.out.println(function.apply(17)); // 5
    System.out.println(function.apply(65535)); // 65535
}

1

CJam , 23 байта

ri2be`{_:g:>{:g}&}%e~2b

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

объяснение

ri          e# Read input as an integer
2b          e# Convert to binary
e`          e# Run-length encoding. Gives a nested (2D) array with run-lengths 
            e# and binary digits
{           e# This block is mapped over the outer array, i.e. is applied to
            e# each inner array
   _        e#   Duplicate the inner array
  :g        e#   Signum of each element of inner array
  :>        e#   This gives true if second element (digit) is false and first
            e#   element (run-length) is not zero. If so, we need to set that
            e#   run-length to 1
  {:g}&     e#   If that's the case, apply signum to original copy of inner
            e#   array, to make run-length 1
}%          e# End block which is mapped over the outer array
e~          e# Run-length decoding
2b          e# Convert from binary. Implicitly display

1

Рубин, 37 35 байт

Сохранено два байта благодаря ручной работе.

->a{a.to_s(2).gsub(/0+/,?0).to_i 2}

Наивный подход. (:


Что касается "0"см 2 - й пункт в sepp2k «s наконечник . Относительно того .to_i(2), где нет двусмысленности относительно того, где принадлежит параметр, круглые скобки являются необязательными.
manatwork

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