リバースとスクエア


19

このチャレンジでは、奇妙なシーケンスから数値を計算します。

入力は、単一の10進数の非負整数です。この整数のビットを逆にしてから、数値を2乗して必要な出力を取得します。

ビットを反転する場合、入力に先行ゼロを使用しないでください。例えば:

26 (base 10) = 11010 (base 2) -> 01011 (base 2) = 11 -> 11*11 = 121

このシーケンスの最初の25の入力/出力:

0: 0
1: 1
2: 1
3: 9
4: 1
5: 25
6: 9
7: 49
8: 1
9: 81
10: 25
11: 169
12: 9
13: 121
14: 49
15: 225
16: 1
17: 289
18: 81
19: 625
20: 25
21: 441
22: 169
23: 841
24: 9

ソリューションは、任意のサイズの整数で機能するはずです。あなたの言語がそれらを使用する便利な組み込みメソッドを持っていない場合、あたかもそれがそうであるかのようにあなたの答えを実装します。その後、回答が多数の場合に中断された場合は免除されます。ただし、制限されたドメイン(ルックアップテーブルなど)でのみ機能するトリック/バウンドを使用しないでください。


スコアは、ソースコードのバイト数です。

数値をバイナリに変換したり、バイナリから変換したりしない場合、-50%のボーナス。これはビルトインに限定されず、ビットごとに(シフト、マスキング、またはその他の方法で)数をループする場合、変換としてもカウントされます。これが実際に可能かどうかはわかりませんが、シーケンス内のパターンを見つけるインセンティブを与えます。

最小スコアが勝ちます。



1
コードがビットを表す文字列を生成するメソッドを呼び出す場合、ボーナスの対象になりますか?
ブラッドギルバートb2gills

2
@ BradGilbertb2gills番号
orlp

ビットを抽出するために数学を使用すると、バイナリ変換としてもカウントされると思いますか?
リトシアスト

回答:


5

Par、5バイト

✶Σ⌐Σ²

それは読み取りバイナリ逆バイナリ平方です。



@CᴏɴᴏʀO'BʀɪᴇɴそのバイトカウンターはUTF-8を想定しています。MaurisはバイトをカウントするためにUTF-8ではないエンコーディングを使用していると思いますが、このエンコーディングは指定していません。
orlp

Parは独自の奇妙なエンコーディングを使用します。その正規表現は、<256 Unicode文字の特定のサブセットです。名前があるかどうかわかりません。私は中にチャイムに@Ypnypnを待つ必要があります。
リン・

ああなるほど。@orlp
コナーオブライエン

おそらく独自のSBCSがありますか?
ハイパーニュートリノ

19

Mathematica、42 21バイト

スコアを半分にしてくれたalephalphaに感謝します。

#~IntegerReverse~2^2&

Mathematicaでこれを行った実際の理由は、プロットを見たかったからです。

ここに画像の説明を入力してください


11
しかし、私はスコアが好きです!XD
コナー・オブライエン

1
この回答のバイト数が最も少ない回答よりも多くの票があるのはなぜですか?o_O
シードラス

27
@Seadrusあなたは彼らが言うことを知っています。画像は7バイトの価値があります。
マーティンエンダー

5
あなたのスコアは42 + 7 = 49バイトです:P
Seadrus

3
すみません、@CᴏɴᴏʀO'Bʀɪᴇɴ。
マーティンエンダー

8

Minkolang 0.14、43バイト

これを刺激してくれたMegoに感謝します。

n1{d1`,2$3*&$z2zd2%-2l$Md1%-;z2%*z2:{+}2;N.

ここコードをテストし、ここすべてのテストケース確認します

説明

これは、次の再帰関係を使用します。

a(0) = 0
a(1) = 1
a(2n) = a(n)
a(2n+1) = a(n) + 2^(floor(log_2(n))+1)

n入力がの場合a(n)、バイナリシーケンスが反転された後の結果の数値です。0と1は明らかです。のためにa(2n) = a(n)x0(ここでx、2進数のシーケンスは)フリップされていると考えてください。0xこれはと同じxです。のためa(2n+1)に、推論はもう少し複雑です。x1ひっくり返されます1x、それはx + 2^kいくつかのために等しいkです。これkは、の桁数より1つ多く、xですfloor(log_2(n))+1。完全な式が続きますが、少し変更されています。これは私が実際にコーディングしたものです:

a(0) = 0
a(1) = 1
a(n) = a(n//2) + (n%2) * 2^(floor(log_2(n - n%2)))

Megoと私がチャットでうまくいったので、floor(n/2) = (n - n%2)/2。このように、log_2(floor(n/2))+1 = log_2(n - n%2)。さらに、乗算によって(n%2)、奇数部分と偶数部分の両方が1つの式に折りたたまれます。

最後に、これ以上苦労することなく、コードを説明します。

n                                              Take number from input
 1{                                            Start recursion that takes only one element
   d1`,                                        1 if top of stack 0 or 1, 0 otherwise
       2$3*                                    26
           &                                   Jump if top of stack is not zero
            $z                                 Store top of stack in register (z)

               zd2%-                           n - n%2
                    2l$M                       log_2(n - n%2)
                        d1%-                   floor(log_2(n - n%2))
              2             ;                  2^floor(log_2(n - n%2))
                             z2%               n%2
                                *              Multiply
                                 z2:           n//2
                                    {          Recurse
                                     +         Add
                                      }        Return
                                       2;N.    Square it, output as number, and stop.

1
再発は、個々のビットを繰り返し処理するだけの再定式化だと思います。
マーティンエンダー

3
これは重要ではないのではないかと心配しています。あなたは見るたびに2n2n+1再発の関係ですぐにビットを超えるループと考えるべきです。
orlp

1
@orlp:まあ、それは残念です。あなたのボーナスは不可能だと今確信しています。
エレンディアスターマン

@ El'endiaStarmanほぼ手に入れたと思う。
コナーオブライエン

8

Japt29 28 11 7 バイト

(プログラムを7バイトのIEC_8859-1エンコードファイルとして保存し、インタープリターにアップロードできます。)

JaptはETHproductionsによって作成された短縮JavaScript です

¢w n2 ²

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

説明:

  1. ¢はのショートカットでUs2、にコンパイルされU.s(2)ます。U入力(暗黙)であり.s(2)、数値によって呼び出され、呼び出します.toString(2)(バイナリに変換し、文字列として解析します)。

  2. wにコンパイルし.w()、文字列(.split('').reverse().join(''))を逆にします。

  3. n2として機能parseInt(<number>,2)します。つまり、バイナリを10進数に変換します。

  4. ²を呼び出しますMath.pow(<number>,2)。つまり、数値を二乗します。


1
文字列関数toNumber on nがあるので、できますUs2 a w a n2 p2。いい仕事だ!
-ETHproductions

1
また、w文字列でも配列と同じように機能するため、2つは必要ありませんa:)
ETHproductions

1
最後の1つ:Us2 = ¢、およびp2= ²、それを7バイトに¢w n2 ²
減らし

3
オンラインインタプリタは今IEC_8859-1エンコードされたファイルを受け付けます。(UTF-8とUTF-16の実行方法もわかりませんが...)
ETHproductions

2
@ETHproductions-これで+1できるようになりました:)
デジタルトラウマ




4

真剣に8 7バイト

2;,¡R¿ª

これらのような課題は真剣に最適です:)

オンラインで試す

説明:

2;,¡    get a string representing the (decimal) input in binary, with a 2 on the bottom of the stack
R      reverse the string
¿    convert binary string to decimal int (using that extra 2 from earlier)
ª      square it

ジョルフに合った素敵な仕事!
コナーオブライエン

インタープリターにCP437エンコード(または少なくとも16進表現)を受け入れてもらうための+1
Digital Trauma

4

J、10 9バイト

2^~|.&.#:

これは暗黙の単項動詞です。オンラインでお試しください!

1バイトのゴルフをしてくれた@randomraに感謝します!

使い方

2^~|.&.#:  Right argument: y

       #:  Convert y to binary.
   |.      Reverse the digits.
     &.    Dual; apply the inverse of #:, i.e., convert back to integer.
 ^~        Apply power (^) with reversed argument order (~)...
2          to 2 and the previous result.

リンクが機能しません。「要求されたURL /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.htmlがこのサーバーで見つかりませんでした。これがすべてです」というGoogleページで404エラーが表示されます。
ビジャン


2

JavaScript、64 63 56 53バイト

n=>parseInt([...n.toString(2)].reverse().join``,2)**2

私は余分に長いことを知っていますが、ちょっと、私はそれを行うことができます:P

デモ


parseInt(あなたができる代わりに+("0b"+
-Downgoat

@Downgoat hm、正しい結果が得られないようです。
ニカエル

[...n.toString(2)]および.join``
コナーオブライエン

1
ES7(49バイト)でさらに短く:n=>+("0b"+[...n.toString(2)].reverse().join``)**2。まだどのブラウザーでも動作しません
Downgoat

1
@CᴏɴᴏʀO'Bʀɪᴇɴありがとう、これはいくつかのバイトを節約します。
ニカエル

2

Perl 6、21バイト

{:2(.base(2).flip)²}

使用例:

say {:2(.base(2).flip)²}(26); # 121

say (0..24).map: {:2(.base(2).flip)²};
# (0 1 1 9 1 25 9 49 1 81 25 169 9 121 49 225 1 289 81 625 25 441 169 841 9)

my &code = {:2(.base(2).flip)²};
say code 3; # 9

say chars code 10¹⁰⁰; # 140


2

シェル、25

dc -e2o?p|rev|dc -e2i?d*p

STDIN / STDOUTを介した入出力:

$ echo 26|dc -e2o?p|rev|dc -e2i?d*p
121
$ 


1

Pyth、9バイト

^i_.BQ2 2

これは、Pythonに似た非常に単純なピスベースの回答です。


1

𝔼𝕊𝕄𝕚𝕟、12文字/ 21バイト

⦅`ᶀ`+ᴙ(ïß2)²

Try it here (Firefox only).

非競合的回答、9文字/ 18バイト

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).


1
このバイトカウンターを介し、15バイトを提供します(別のエンコードを使用します)。
ニカエル

UTF-8を使用して評価します(マインズエンコーディングを機能させるまで)。
ママファンロール

...言語の名前...は箱ですか?
corsiKa

それは二重のESMinです。Unicode文字は完全にはサポートされていません。
ママファンロール


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