「無限」からカウントダウン


47

不可能なタスクのように思えますか?まあ、実際にはそれほど難しくありません。単語Infinityを8ビットのバイナリASCIIコードとして記述すると、次のようになります。

01001001 01101110 01100110 01101001 01101110 01101001 01110100 01111001

これを連結し、10進数値に変換できます5291279215216915577。これで作業できる数は...

カウントダウンする方法は次のとおりです。

  1. 元の文字列を10進数として出力します(上記を参照)
  2. バイナリ表現の先頭の0を削除します(存在する場合)
  3. バイナリ表現のビットを切り替えます(1-> 0、0-> 1)
  4. 数値を10進数で出力します
  5. 0に達するまで手順2〜4を繰り返します。

チャレンジ:

入力として文字列を受け取り、上記の手順を実行したときに取得する数値を(適切な形式で)出力するプログラムまたは関数を作成します。

テストケース:

チャレンジは1つのテストケースにすぎませんが、このチャレンジはかなり簡単に理解できると思います。これをかなり短くするためにInf代わりに使用しますInfinity

Inf
4812390  (10010010110111001100110)
3576217  ( 1101101001000110011001)
618086   (   10010110111001100110)
430489   (    1101001000110011001)
93798    (      10110111001100110)
37273    (       1001000110011001)
28262    (        110111001100110)
4505     (          1000110011001)
3686     (           111001100110)
409      (              110011001)
102      (                1100110)
25       (                  11001)
6        (                    110)
1        (                      1)
0        (                      0)

Input: Inf 
Output:
4812390, 3576217, 618086, 430489, 93798, 37273, 28262, 4505, 3686, 409, 102, 25, 6, 1, 0 

Input: Infinity
Output:
5291279215216915577, 3932092821637860230, 679593196789527673, 473328307817319302, 103132444486104185, 40982743589751686, 31074850448176249, 4953946570787718, 4053252683953273, 450346943417222, 112603010004089, 28134478351238, 7049893737593, 1746199284614, 452823970937, 96931842950, 40507110521, 28212366214, 6147372153, 2442562438, 1852404857, 295078790, 241792121, 26643334, 6911097, 1477510, 619641, 428934, 95353, 35718, 29817, 2950, 1145, 902, 121, 6, 1, 0

コードは、言語の制限まで、2進数として表現できる文字列をサポートする必要があります。すべての文字列には、32〜126(チルダまでのスペース)の印刷可能なASCII文字のみが含まれます。


リーダーボード


31
チャックノリス、8バイト:Inf:-1:0
ルイスメンドー

2
@LuisMendoチャック・ノリスNARS-APL:∞..0
アダム・

5
@LuisMendo本当にJon Skeetじゃないの?
mbomb007

回答:


12

ゼリー15 10 バイト

@Dennisのおかげで-5バイト(通常のキャスト後にベース256から直接変換)

Oḅ⁹µBCḄµÐĿ

TryItOnline!

どうやって?

Oḅ⁹µBCḄµÐĿ - Main link: s                     e.g. "Inf"
O          - cast to ordinals                 e.g. [73,110,102]
 ḅ⁹        - convert from base 256 to integer e.g. 4812390
   µ   µ   - monadic chain separations
    B      -     convert to binary
     C     -     complement
      Ḅ    -     convert to integer
        ÐĿ - loop until no longer unique and collect results 

1
最初の部分はただOḅ⁹です。
デニス

ああ、どうやってそれを見逃したの?!
ジョナサンアラン

11

Python 2、89 82 77 76 75バイト

n=0
for c in input():n=n<<8|ord(c)
while 1:print n;n^=2**n.bit_length()-n/n

Ideoneでテストします。

使い方

n0に初期化した後、2行目は、チャレンジで指定された文字列から整数への変換を次のように実行します。

各ステップで、n8単位左にシフトされ、次の文字cのコードポイントとビット単位でOR演算されます。入力Infの場合、これは次のようになります。

n                                  0
a = n<<8                           0
b = 'I'                      1001001
n = a ^ b                    1001001
a = n<<8             100100100000000
b = 'n'                      1101110
n = a ^ b            100100101101110
a = n<<8     10010010110111000000000
b = 'f'                      1100110
n = a ^ b    10010010110111001100110

これで、出力を生成する準備が整いました。nのビットを反転するには、次のように進めます。

最初に、先行ゼロなしでnのバイナリ表現のビットを計算します。結果をkと呼びましょう。次に、2のk k乗を計算します。これには、k + 1の 2進数があります。1つの1k 0が続きます。結果から1を引き、k個の 1で構成される数を生成します。その後、nとXORしてビットを反転します。入力infの場合、これは次のようになります。

n         4812390   10010010110111001100110
k              23 
t = 2**k           100000000000000000000000
t -= 1              11111111111111111111111
n ^= t    3576217    1101101001000110011001
k              22
t = 2**k            10000000000000000000000
t -= 1               1111111111111111111111
n ^= t     618086      10010110111001100110
.
.
.
n               6                       110
k               3
t = 2**k                               1000
t -= 1                                  111
n ^= t          1                         1
k               1
t = 2**k                                 10
t -= 1                                    1
n ^= t          0                         0

実装のさらなるハードルは、最初のステップの前、最後のステップの、およびその間のすべてのステップでnを印刷する必要があることです。Pythonにはdo-whileループがなく、1つのprintステートメントのコストは8バイトなので、代わりに次のようにします。

更新手順の簡単な実装では、つまり、

while n:print n;n^=2**n.bit_length()-1
print n

無限ループ(while 1)でループを置き換え、ループ内でを計算1しますn/nn> 0の場合、これは同等です。

n = 0になったら、ループにとどまり、状態をもう一度出力して、更新を試みます。ただし、ZeroDivisionErrorを0/0トリガーし、ループから抜け出し、エラーで終了します。これにより、デフォルト許可される STDERRへの漂遊出力が発生することに注意してください。


2
私はその-n/nトリックが大好き:
ETHproductions

n/nトリックよりも説明できますか?おそらく別の答えで説明されているかもしれませんが、私はそれを見つけていません。ここで何をしますか?
スチューウィーグリフィン

@StewieGriffin n / nはnが0になるまで1であり、エラーがスローされてプログラムが停止します。
jazzpi

エラーメッセージが表示されます(希望)。
スティーヴィーグリフィン

1
@StewieGriffin確かに。Pythonは、エラー報告に関しては非常に冗長です。私は答えを編集して説明を組み込みました。
デニス

8

JavaScript、82バイト

@Arnualdのおかげで1バイト節約

for(y of prompt(n=0))n=n<<8|y.charCodeAt()
for(;alert(n)|n;)for(i=1;i<=n;i*=2)n^=i

完全なプログラムが機能よりも優れている(ES6がES5を上回ることはない)非常にまれな時間の1つです...


上記は最大4文字の単語をサポートします。最大6文字の単語をサポートするには、4バイトを追加します。

for(y of prompt(n=0))n=n*256+y.charCodeAt()
for(;alert(n)|n;n=i-n-1)for(i=1;i<=n;)i*=2


g=a=>a[0]?a.pop().charCodeAt()+g(a)*256:0(-1)
タイタス

@タイタスありがとう!なぜそれを考えなかったのかわからない
-ETHproductions

n<<8|y.charCodeAt()バイトを保存する必要があります。for(;n;)for(i=!alert(n);i<=n;i*=2)n^=i別のバイトを保存しますが0、おそらく表示されるはずです。
アルノー

@Arnauldありがとう。私はn<<8以前にやろうと考えましたが、31ビットを超えるとnで壊れるのでうまくいかないと決めました。私はすでに31ビットバージョンと53ビットバージョンに分割しているので、それは問題ではないと思います...そして悲しいことに、最初の両方に警告しながら、反復と最後。
ETHproductions

7

実際には、14バイト

2@├¿W■├♂≈♂Y2@¿

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

説明:

2@├¿W■├♂≈♂Y2@¿
 @├             encode input in binary
2  ¿            convert from binary to decimal
    W           while the number is not 0:
     ■            print the number without popping
      ├           convert number to binary
       ♂≈         convert each character to an int
         ♂Y       boolean negate each int
           2@¿    convert from binary to decimal

6

05AB1E、18バイト

CP-1252エンコードを使用します。

Çžz+b€¦J[CÐ,_#bS_J

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

説明

Ç                     # convert string to list of ascii codes
 žz+                  # add 256 to each
    b                 # convert to binary
     €¦               # remove the first digit of each list of digits
       J              # join
        [             # start loop
         C            # convert to decimal
          Ð           # triplicate
           ,          # print 1 copy
            _#        # if the 2nd copy is 0, break loop
              b       # convert 3rd copy to binary
               S      # split to list
                _     # negate each in list
                 J    # join


4

Mathematica、99バイト

a=FromDigits;b=IntegerDigits;NestWhileList[a[1-#~b~2,2]&,a[Join@@b[ToCharacterCode@#,2,8],2],#>0&]&

匿名関数。入力として文字列を受け取り、出力として数値のリストを返します。


4

ハスケル、109の 123 118 102 97バイト

5バイトを節約してくれた@nimiに感謝します!

c 0=0
c n=1-mod n 2+2*c(div n 2)
(++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum

使用法: (++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum $ "Infinity"

言語によって最大29ビットの数値で動作することが保証されており、通常は64ビットシステムで最大63ビットの数値で動作します。map(fromIntegral.fromEnum)代わりに(+14バイト)を使用して、任意の大きな数値をサポートします。

ユニコード範囲で動作し[0..255]ます。再帰的にビットを反転します。


1
あなたは置き換えることができtakeWhile(>0)fst.span(>0)。あなたがポイントフリーに行くなら、あなたは名前を落とすことができるfので、あなたの主な機能は(++[0]) ... map fromEnumです。
nimi

@nimiおかげで、名前を削除することで、型推論の問題が解決しましたf
アンズ

なんでfromIntegral?課題から:「サポートする必要があります...最大63ビット...またはあなたの言語の制限」、それでInt結構です。保持する場合は、に移動しmapます。つまり、foldl1andの古いバージョンですmap(fromIntegral.fromEnum)
nimi

@nimi OPは(削除されたため)ここにコメントを投稿し、これが63ビットをサポートしているかどうかを尋ねました。私を殴る。
アンス

4

PHP、132の 126 123 120 108 107バイト

foreach(unpack("C*",$argv[1])as$i)$n=$n*256+$i;for(print$n;$n;)echo _.$n=bindec(strtr(decbin($n),"01",10));
  • ループの前に初期値の代わりに0を出力すると、ループは6バイトを節約します。
  • unpack代わりには、str_splitレンダリングord()廃止- > -3バイト
  • _セパレーターとしての下線を使用すると3。
  • bindecltrim先行ゼロを削除する代わりに:-12
  • echoループ本体ではprint、ループヘッドで1バイトを節約します。

$n=$n*256+$i;for(print$n;$n;)と書くことはできませんfor(print$n=$n*256+$i;$n;)か?割り当て部分は1回実行されるため、これは機能するはずです。の代わりにecho _.$n=[...]、代わりに 使用する必要がありますecho _,$n=[...]。これはバイトを保存しませんが、コードを非常に小さな小さな小さなビットに高速化し、ステートメントを分離します。これは、たとえば、のecho _,$a?5:6;代わりに記述できることを意味しecho _.($a?5:6);ます。これは将来役に立つかもしれません。
イスマエルミゲル

@IsmaelMiguel割り当て部分はループです。ドットが不要な場合は、実際にコンマを使用します。printこの場合の残党です。編集する価値はありません。しかし、ありがとう。
タイタス

ああ、そうです...それは中にありforeach(unpack("C*",$argv[1])as$i)ます...愚かな私...そして、はい、同じ効果を得るためにコンマのピリオドを変更するのは面倒の価値がありません。
イスマエルミゲル

4

Perl、65バイト

53バイトのコード+ -Mbigint -p

13バイト節約してくれた@ Dadaに感謝します!

$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0

かなり単純なアプローチですが、これらのほとんどと異なるのは、数値がバイナリとして格納され、10進数で出力されることです。おそらくアレイに詳細を保存することで改善できると確信しています。-Mbigint少し不便ですが必要です。

使用法

echo -n 'Inf' | perl -Mbigint -pE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
4812390
3576217
618086
430489
93798
37273
28262
4505
3686
409
102
25
6
1
0
echo -n 'Infinity' | perl -Mbigint -pE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
5291279215216915577
3932092821637860230
679593196789527673
473328307817319302
103132444486104185
40982743589751686
31074850448176249
4953946570787718
4053252683953273
450346943417222
112603010004089
28134478351238
7049893737593
1746199284614
452823970937
96931842950
40507110521
28212366214
6147372153
2442562438
1852404857
295078790
241792121
26643334
6911097
1477510
619641
428934
95353
35718
29817
2950
1145
902
121
6
1
0

1
友達を開梱して、開梱してください!perl -Mbigint -lpE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'(通常、アンパックの使用方法がわからない。文字列をバイナリに変換する方法をグーグルで調べたときに幸運になった;
ダダ

ああ、私はいつもunpack構文がいつも心を打つことを忘れます!更新します、ありがとう!
ドムヘイスティングス

ありperlpacktutそれが役立つはずです...私は、時間の最初の10行の数十を読んだが、私は本当に残りを読むために時間を取る必要があります!
ダダ

@Dada私は何度も読んだことがあると確信しています、それは決してとどまることはありません...再びありがとう。-13は小さな偉業ではありません!私が切り替えなければならなかったのecho -nは、他の唯一の変更です。
ドムヘイスティングス

4

Pyth、12バイト

.usi!MjN2 2C

引用符で囲まれた文字列の入力を受け取り、結果を整数のリストとして出力するプログラム。

すべてのテストケースを検証する

使い方

.usi!MjN2 2C  Program. Input: Q
           C  Convert Q to an integer by code-points using base-256 (implicit input)
.u            Apply the following function A(N) until a repeat occurs, storing the results
              in a list:
      jN2       Convert to binary as a list
    !M          Map negation over the above
   i      2     Convert from binary to integer
  s             Integer (Converts final False to 0)
              Implicitly print

3

Python 3、99 95バイト

x=int.from_bytes(bytes(input(),'utf-8'),'big')
while x:print(x);x^=2**x.bit_length()-1
print(0)

主なアイデアは、文字列をバイトから数値に変換することです。各反復は、出力とXORをすべて1で出力し、ゼロに向かって進みます。


かっこは必要ありません2**x.bit_length()-1。べき乗と減算の演算順序はxorよりも高くなっています。また、それwhileは単一の行にすることができます。
mbomb007

whileループを1行で
記述し

で、プログラムを起動してみP=printた後、使用してP()の代わりにprint()
Cyoce

3

Python 2、117 115バイト

Cyoceのおかげで2バイト節約できます。

引用符で囲まれた入力を想定します。例えば "Inf"

s=input()
n=sum(ord(s[-i-1])<<i*8for i in range(len(s)))
while n:
 print n;k,m=n,1
 while k:k/=2;m*=2
 n^=m-1
print 0

m最大桁までカウントされるm-1ため、目的の操作を実行するためのXORマスクもカウントされます。最も長い部分は、入力を初期ビットシーケンスに変換します。

例:

"Inf"
4812390
3576217
618086
430489
93798
37273
28262
4505
3686
409
102
25
6
1
0

"Infinity"
5291279215216915577
3932092821637860230
679593196789527673
473328307817319302
103132444486104185
40982743589751686
31074850448176249
4953946570787718
4053252683953273
450346943417222
112603010004089
28134478351238
7049893737593
1746199284614
452823970937
96931842950
40507110521
28212366214
6147372153
2442562438
1852404857
295078790
241792121
26643334
6911097
1477510
619641
428934
95353
35718
29817
2950
1145
902
121
6
1
0

あなたは置き換えることができ-i-1~i
Cyoce

3

ルビー、104の 101 100 81 80 65バイト

@WayneConradのおかげで19バイトが節約されました!
@philomoryのおかげで15バイトが節約されました!
@LeeWのおかげで1バイトが節約されました!

p n=$*[0].unpack('B*')[0].to_i(2)
p n^=2**n.bit_length-1while n>0

コマンドライン引数を介して入力を受け取ります。

@JimmyJohnsonのPythonの答えに触発された


あなたは置き換えることによって、いくつかの文字を保存することができるかもしれi.to_s(2).rjust 8,'0'"%08b"%i
ウェインコンラッド

また、私inject(:+)はに置き換えることができると思うjoin
ウェインコンラッド

@WayneConrad助けてくれてありがとう!私がそれらをどのように忘れたかわからない
チョイス

お役に立てて嬉しいです!知らなかった#bit_lengthメソッドを教えてくれてありがとう。
ウェインコンラッド

1
を混乱unpackさせるの[0]ではなく、その後に切り替えるgsubと、11バイト節約されます。(コンソール入力の代わりにコマンドライン引数を使用する)の$*[0]代わりに切り替えるgets.chopと、さらに9が保存され、最初の行がになりp n=$*[0].unpack('B*')[0].to_i(2)ます。
哲学

3

ラビリンス104の 103バイト

'  )25 }_';:_';_2/;{
''', 6 2 1   1   { (
 ' | / _ _   _}*2_ $
 * _ :!\ }2_\     !:
 652       @'''''''

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

説明:

ソースコードの色分けされた画像

命令ポインタは、左上で最も壁以外の文字から始まります(壁にはスペースとを除く任意の文字が含まれますv)。

オレンジ:

このループは、入力を一度に1文字ずつASCIIコードとして取得し、それを現在の値に追加して、現在の値に256を掛けます。

  • ' ノーオペレーション
  • ,次の入力文字のASCIIコードをスタックの一番上にプッシュするか、EOFの場合は-1をプッシュします。この時点で、入力が受信された場合、スタックの上部が潜在的であるため、コードは右に曲がります(下に移動)。そうでない場合、スタックの上部が負であるため、左に曲がります。
  • | スタックから上位2つのアイテムをポップし、ビット単位のORの結果をプッシュします。
  • _ ゼロを押す
  • 256各桁はポップ見たxとプッシュをx*10+digit。したがって、これは、スタックの先頭へのプッシュゼロの前のプッシュ256と組み合わされます。
  • *ポップy、ポップx、プッシュx*y。この時点で、スタックの最上部が正であるため、コードは右に曲がり、ループの周りを継続します。

青:

  • )スタックの最上部をインクリメントします。入力の終わりに達すると、コードは左に曲がり、スタック上の-1でこのポイントに到達し、ゼロにインクリメントされます。
  • 256 スタックの先頭を0にすると、この256をプッシュできます。
  • /ポップy、ポップxプッシュx/y(整数除算)。入力に各ループを256で乗算したため、最後の乗算を元に戻す必要があります。
  • : スタックの最上部を複製して、後で使用できるように現在の値のコピーを作成します。
  • ! スタックの一番上をポップし、整数値をSTDOUTに出力します。
  • \ 新しい行を印刷します。
  • _2 2をスタックの一番上にプッシュします。
  • } スタックの上部を補助スタックの上部に移動します。

赤:

このループは、内部(緑)ループで計算された特定の値とXORによって現在の値のビットを反転します。次に、現在の値を出力し、現在の値がゼロの場合はプログラムを終了します。

  • _ ゼロを押します(制御フロー)。
  • ; スタックの最上部を破棄します(制御フロー)。
  • :現在の値を複製します。コピーはXORの計算に使用されます。
  • _ ゼロを押します(制御フロー)。
  • (緑のループ)
  • $ポップy、ポップx、プッシュx XOR y
  • :! 現在の値を複製し、整数表現を出力します。
  • 現在の値が0の場合、そのまま続行して@終了します。
  • \ 新しい行を印刷します。
  • _2} 2を押して、補助スタックに移動します。
  • _1 プッシュ1(制御フロー)。

緑:

このループは、現在の値をXORするために必要な値を計算します。これは、メインスタックの停止時に現在の値のコピーを0に達するまで半分にしながら、補助スタックの最上部を繰り返し2倍にすることで行われます。

  • _ ゼロを押します(制御フロー)。
  • ; 制御フローを実施するためにのみ使用される現在の値を破棄します。
  • _2 現在の値を半分にするには、2を押します。
  • / 割る
  • { Auxスタックの上部をメインスタックの上部に移動します。
  • _2* スタックの上部を2倍に
  • } メインスタックの上部を補助スタックに戻します。
  • _1 制御フローのためにプッシュします。
  • ループを終了した後:
  • ; XORの計算からゼロ上の左を破棄します。
  • { 計算されたXORをメインスタックに移動します。
  • ( XOR値から1を引きます。

2

PowerShell v2 +、158バイト

for($a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)});$a){[convert]::ToInt64($a,2);$a=$a.TrimStart('0')-split0-replace1,0-join1}

ええ、だから、PowerShell ベースを変換するのは本当に面倒です。そして、私たちはここで2回それをすることができます。

OK、これは単なるforループです。$aつまり、$a存在する限りループします。最終的に空の文字列(false)に到達するので、これで終了します。

ループのセットアップ$a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)})は、入力を受け取り$args[0]、それをchar-array としてキャストし、各文字をループします。.NETを使用して、[convert]::ToString(int,base)それぞれをバイナリ文字列に変換します。ただし、先行ゼロは含まれないため、その文字列をanとして再キャストし、ゼロとしてマスクを使用してそのメソッドを[int]呼び出す必要があります。次に、これらの文字列は括弧にカプセル化されて一緒に編集され、に保存されます。 .ToString()8-join$a

ループ内で、[convert]::ToInt64(string,base)2進数を10進数に変換します。これはパイプラインに残り、ループがリセットされるとフラッシュされます(したがって、暗黙的に出力されます)。次の節を行い、計算-私たちは.TrimStart()、先頭の0を除去するために-split0ゼロに分割すると、GET A string-arrayの1S、-replaceゼロでそれらのもの、そして最後に-join、アレイバックと一緒に1S。その後、ループが再び開始されます。

PS C:\Tools\Scripts\golfing> .\count-down-from-infinity.ps1 'PPCG'
1347437383
800046264
273695559
263175352
5260103
3128504
1065799
1031352
17223
15544
839
184
71
56
7
0

2

CJam17 16 18バイト

q256b0{_p2b:!2bj}j

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

q256b   e# read printable ascii to integer
0       e# value for terminal case
{       e# recursive function
  _p    e#   print current number
  2b    e#   create binary representation with no leading zeros
  :!    e#   flip bits
  2b    e#   convert binary back to integer
  j     e#   recursive call
}j      e# end

注:古い16バイトバージョンは、空の文字列では正しく動作しませんでした。

q256b{_p2b:!2b}h

また、改行をスタックに入れることで1バイト節約できることを提案してくれたDennisに感謝します。pN\


_p2b:!2bバイトを保存します。また、使用する必要がありますlr入力にスペースが含まれていると失敗します。
デニス

@Dennisありがとう、空の文字列が問題になるかどうか心配になりました。
ライナス

右。q空の文字列でも正常に機能します。
デニス


1

網膜、116バイト

バイトカウントはISO 8859-1エンコードを前提としています。行5には、印刷できないバイトが含まれています。ですT`\x00-\xFF

-2`
±
s{`±(.)
$&$1
}T`-`_o`±.
[^±]+
$.&
±

\d+
$*
+`(1+)\1
${1}0
01
1


{*(`1
01
+`10
011
^0+

)M`1
^0+

T`01`10

オンラインで試す

2文字より長い入力でこれを試さないでください。(オンラインインタプリタを使用するとタイムアウトします。)10進数の前にバイナリを単項に変換する必要があります。:D

残念ながら、末尾のゼロとラインフィードがありますが、出力がまだ正しいため、これで問題ないと判断することにしました。

説明

-2`         # Convert ASCII to decimal (ord)
±
s{`±(.)
$&$1
}T`-`_o`±.
[^±]+
$.&
±

\d+         # Decimal to binary
$*
+`(1+)\1
${1}0
01
1


{*(`1       # Loop; Loop print and undo; Convert binary to unary
01
+`10
011
^0+

)M`1        # Unary to decimal; End print and undo
^0+         # Remove leading zeros

T`01`10     # Flip bits; (implicit loop end)

1

ルビー-70バイト

λ cat inf.rb
n,=$*[0].unpack 'B*';loop{p n.to_i(2);n.tr!('10','01').sub!(/^0*/,'')}
λ ruby inf.rb Hello
310939249775
788572378000
310939249775
238816564112
36061342831
32658133904
1701604463
445879184
90991727
43226000
23882863
9671568
7105647
1282960
814191
234384
27759
5008
3183
912
111
16
15
0
inf.rb:1:in `block in <main>': undefined method `sub!' for nil:NilClass (NoMethodError)
        from inf.rb:1:in `loop'
        from inf.rb:1:in `<main>'

プログラムは完了後に例外で終了しますが、エラー出力がSTDOUTではなくSTDERRに到達する限り(これは実行されます)、私の理解では問題ありません。


1

C、147 135 133 125 122 121 117 115 103バイト

@Cyoceのおかげで5バイト節約できました!

@Cyoceと@cleblancのおかげで2バイト節約できました!

@ceilingcatのおかげで12バイト節約

i,n;main(p,v)char**v;{while(*v[1])i=i*256+*v[1]++;for(;printf("%d\n",n=i),i;i^=p-1)for(p=2;n/=2;)p*=2;}

ゴルフをしていない:

int i;
int main (c,v) {
    char**v;
    while (*v[1]) /* put first command line argument into i as binary */
        i = i*256 + *v[1]++;
    while (i != 0) { 
        printf("%d\n",i);
        int p = 2,n = i;
        while (n /= 2) /* calculate smallest power of 2 > i */
            p *= 2;
        i ^= p - 1; /* flip bits */
    }
}

あなたはint宣言を
省く

最後のwhileループをループに変換することでバイトを保存することもできforます
-Cyoce

そして、あなたは変更することができますwhile(1)for(;;)
Cyoce

@Cyoce int宣言をどこでも削除しようとしてgcc -std=89エラーが発生しました。しかし、for(;;)ヒントをありがとう。私はint宣言を削除しようとし続けます:)))
Noodle9

すみません、私はそれをテストしませんでした。上に移動するとうまくいくと思います(i;main(c,v)char**v;{...})。今は携帯電話で確認できないので、
Cyoce

0

C、129 120 117 110 107 105のバイト

long long i,m,n;f(char*v){for(;*v;i<<=8,i+=*v++);for(;printf("%llu,",i),n=i;i^=m-1)for(m=2;n>>=1;m<<=1);}

でテスト済み

main (int c, char**v) {
    f(v[1]);
}

出力

5291279215216915577,3932092821637860230,679593196789527673,473328307817319302,103132444486104185,40982743589751686,31074850448176249,4953946570787718,4053252683953273,450346943417222,112603010004089,28134478351238,7049893737593,1746199284614,452823970937,96931842950,40507110521,28212366214,6147372153,2442562438,1852404857,295078790,241792121,26643334,6911097,1477510,619641,428934,95353,35718,29817,2950,1145,902,121,6,1,0,

ループの初期化セクションのi=0宣言に移動し、空白のままにできると思いますifor
-Cyoce

@Cyoce関数は呼び出されるたびに機能する必要があり、i暗黙のグローバルintであるため、f(...)が呼び出されるたびに初期化する必要があります。
cleblanc

@Cyoceあなたは結局のところ正しかった。この関数はi再びゼロになるまで終了しないため、引き続き再利用できます。
-cleblanc


0

C#、360 359バイト

using w=System.Console;using q=System.Convert;s={System.Func<int,int,string>S=q.ToString;string t="",f="";for(int i=0;i<s.Length;i++)t+=i>0?S(s[i],2).PadLeft(8,'0'):S(s[i],2);w.WriteLine(q.ToInt64(t,2).ToString());while(t!="0"){f="";foreach(var n in t)f+=n=='0'?'1':'0';t=f.TrimStart(new char[]{'0'});t+=t==""?"0":"";w.WriteLine(q.ToInt64(t,2).ToString());}};

完全なプログラム:

using w = System.Console;
using q = System.Convert;

class a
{
    static void Main()
    {
        System.Action<string> b = s =>
        {
            System.Func<int,int,string> S = q.ToString;
            string t = "", f = ""; // Var does not work here
            for(int i = 0; i < s.Length; i++)
                t += i > 0 ? S(s[i], 2).PadLeft(8, '0') : S(s[i], 2);
            w.WriteLine(q.ToInt64(t, 2).ToString());
            while(t != "0")
            {
                f = "";
                foreach (var n in t) f += n== '0' ? '1' : '0';
                t = f.TrimStart(new char[] { '0' });
                t += t == "" ? "0" : "";
                w.WriteLine(q.ToInt64(t, 2).ToString());
            }
        };

        b("Inf");
        b("Infinity");
        w.Read(); // prevent close in VS
    }
}

私はC#をしませんがvar t="";var f="";var t="",f=""代わりにできますか?5バイト節約します。
corsiKa

@corsiKaええ、私はそれを試してみましたが、エラーが発生しました。原因は文字列ではなくvarであると思います。
Yodle

実際、文字列は1バイトを節約するので、そのようにすると思います。
ヨドル

また、これらの厄介な引用を保存するために、ゼロのz変数を作成できますか?
corsiKa

試したところ、文字列「0」と文字「0」の両方を置き換えることができないため、実際にバイトカウントが増加します:(
Yodle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.