「フィット」番号を出力する


21

「フィット番号」

サムには、圧縮に関する「素晴らしい」アイデアがあります。手伝ってくれますか?


これがサムの圧縮スキームの要約です。最初に、厳密に2 ^ 16よりも小さい任意の自然数の基数10表現を取得し、先行ゼロなしのバイナリ文字列として書き込みます。

1-> 1
9-> 1001
15-> 1111
13-> 1101
16-> 10000
17-> 10001
65535-> 111111111111111

1つ以上のゼロのグループを単一のゼロに置き換えます。これは、数値がスリムになったためです。バイナリ文字列は次のようになります。

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」オブライエンさんのブログから来てここにフィット数字のこのOEISを参照してください。https://oeis.org/A090078


1
コナーさん漫画ブログ@から:リンク
Rɪᴋᴇʀ

3
OEIS A090078役に立つかもしれません。
アドナン

コミックを書いたのは私です。<s>また、35%の代表ロイヤリティが期待されます</ s>;)
コナーオブライエン

ダウンボッターは問題を説明していただけますか?
ロハンジュンジュンワラ

1
16が8に等しいのはなぜですか?16はいけません10000か?
eithed

回答:


10

05AB1E8 6バイト

b00¬:C

説明

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

オンラインで試す

Adnanのおかげで2バイト節約


あなたは置き換えることができます„00'0によって00¬:)。
アドナン

@アドナンナイス!それを考えなかった。
エミグナ

私は明示的に文字列としてそれらをプッシュなぜ私もわからない...
Emigna

ええ、少し直感に反しますが、動作します:)。
アドナン

これは勝つように見えます:D、より多くの人々が参加できるように、受け入れる前にもう少し時間を与えます。
ローハンジュンジュンワラ


7

JavaScript(ES6)、41バイト

n=>+`0b${n.toString(2).replace(/0+/g,0)}`

7

クラゲ、20バイト

p
d
# S
,1
*
\dbi
 2

オンラインでお試しください!

説明

  • i 入力されます。
  • b バイナリ(数字のリスト)に変換します
  • \d引数2と数字リストは、数字リストのdすべての長さ2の部分文字列に適用されます(2進数から数字へ)。
  • * 結果の符号を取ります:00は0になり、その他はすべて1になります。
  • ,1 最後に1を付けるため、最後の数字は失われません。
  • # Sbi上記で計算されたリストに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]

場合はn4の倍数である、それはバイナリで2つの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. bcに値を渡すために使用されるエコーとパイプに変更さsed -E 's/0+sed 's/00*、変更されました<<<
  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;/'|bc2バイト短い
ライリー

1
パイプとエスケープを使用してください:echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]。しかしdctr それをずっと短くしてください
デジタル外傷

1
@DigitalTrauma:ありがとう、それは素晴らしい!@Riley:すてきなアイデア、それはそのようなビット短く、次のようになりますbc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
Master_ex

tr -s 0sedの代わりに使用する場合、36バイトまで減らすことができます
ライリー

@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

strrepMATLABでは論理入力を処理できるため、このバージョンはMATLABでのみ機能します。論理入力を明示的にtypeにキャストする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バイト。

Sp3000のおかげで4バイト節約されました。

非常に簡単なソリューション。

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

4
あなたは保つことができる0bだけとeval代わりに?
Sp3000

@ Sp3000確かにできます!提案をありがとう!
モーガンスラップ

匿名のラムダが許可されます。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
これはスニペットではないかと思います。チャレンジの説明に特に明記されていない限り、ソリューションは完全なプログラムまたは機能であることが期待されます。
マナトワーク

関数を使用したくない場合、Javascriptで「完全なプログラム」にする必要があるのは何ですか?お知らせ下さい。
-cychoi

Node.jsの持つ例:console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0)))
マナトワーク

オフトピック。コードブロックに @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ありがとう。それは私が自分自身を見るべきだったかなり明白なものでした。
Jeroen

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")に変換し、ゼロのブロックを1つのゼロに置き換え、結果を10進数(oct"0b".)に変換します。


2

C#、112 91バイト

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

TuukkaXのおかげで-8バイト


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バイトを計算します。私は手で解決策をタイプしなければなりません
でした

2

Java、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(整数x){return x.parseInt(x.toString(x、2).replaceAll( "0 +"、 "0"));}数バイト少ないため
Rohan Jhunjhunwala

@RohanJhunjhunwalaそれは間違っています。ベース2を使用する必要があります。ラムダに関しては、型指定がないと不完全だと感じます。
aditsu

[OK]ああ、他のJavaの答えは同じ技術を使用しています
ロハンJhunjhunwala



1

PowerShell v2 +、69バイト

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

PowerShellでバイナリとの間で変換するより短い方法

入力を受け取り$args[0]、.NETビルトイン[convert]::ToString(int,base)を使用して、入力整数をバイナリベース文字列に変換します。を介してフィルター処理され、-replace1つ以上のゼロの実行をすべて削除します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バイト

ゴルフ

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
リファレンス実装は、回答としてではなく、チャレンジ本体にあるべきです。なぜなら、それらは無制限であり、したがって、深刻な競合者ではないからです。
メゴ

OK、ゴルフします。
ローハンジュンジュンワラ

この@Megoでチャレンジボディを膨らませたくありませんでした
Rohan Jhunjhunwala

@TimmyD 1秒私は今、それを下にゴルフをしています
ロハンJhunjhunwala

@Mego私は今ゴルフをしました
Rohan Jhunjhunwala


1

網膜、30バイト

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

オンラインでお試しください!

ここで、Retinaが最初の答えの1つになると思いました...


@randomra私は質問OPに説明を求めています
リーキー修道女

Retinaはバイナリから10進数への変換またはバイナリから単項への変換が可能ですか?Retinaを除外しないように、どちらか一方を除外します
Rohan Jhunjhunwala

@RohanJhunjhunwala:はい、そうです
Business Cat

これを単項または小数に変換することは可能ですか?理想的には10進数を表示したいのですが、どちらでも受け入れます。
ローハンジュンジュンワラ

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));}}
  • @RohanJhunjhunwalaのおかげで9バイト少なくなりました。mainなどで完全に機能するプログラムとして保持することを好みます。ただし、それ以外の場合はもちろんゴルフをすることができます。
  • @LeakyNunの提案のおかげで5バイト少なくなりました。

1
クラス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バイトの節約
Rohan Jhunjhunwala

クラス定義とセットをさらに保存および削除するために、ラムダ式でラップします。
ローハンジュンジュンワラ

@RohanJhunjhunwala:ああ!Integer i;一部には、シンプルで素晴らしいです!
Master_ex

1
動作しますが、ほとんどの健全なIDEで(エラーではなく)警告が生成される場合があります。重要なのは、非静的コンテキストから静的メソッドをいつでも呼び出すことができますが、静的コンテキストから非静的メソッドを呼び出すことはできないということです。この手法を使用することは本番コードでは強く推奨されていませんが、合法的なjavaです。
ローハンジュン

1
codegolf.stackexchange.com/questions/6671/…Java言語のあまり知られていない(私は陰気だと言います) "機能"をよりよく理解するための良い読み物です。
ローハンジュンジュンワラ

1

Dyalog APL、19 バイト

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

TryAPLオンライン!

この関数は実際には2つの関数の「上」にあり、最初の関数は次のとおりです。

2∘⊥⍣¯1バイナリレベルの -decimal変換、すなわち、バイナリレベルから -decimal変換
二つが 2 結合している -to-小数
リピート動作 負の1の時間に¯1(すなわち一度、しかし反転)

2番目の関数では、上記のバイナリ結果は次のように表され ます。

{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵{0、0}がneg
~ブール否定で始まる場所のブール値なので、今ではどこでもhaveがありますが、ゼロランの最初でないゼロでは
⍵/⍨それを使用してfilterをフィルタリングするため、不要なゼロを削除して
2⊥バイナリから10進数に変換します


1

TSQL、143バイト

ビルドインとバイナリの変換にビルドインを使用していません。

ゴルフ:

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

ゴルフをしていない:

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

わかりました-
ローハン

@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バイト

manatworkのおかげで2バイト節約されました。

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

素朴なアプローチ。(:


に関しては"0"sepp2kヒントの 2番目のポイントを参照してください。に関して.to_i(2)、パラメータがどこに属するかについてあいまいさがない場合、括弧はオプションです。
マナトワーク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.