Terbalik dan persegi

19

Dalam tantangan ini, Anda akan menghitung angka dari urutan yang aneh.

Input Anda adalah bilangan bulat non-negatif desimal tunggal. Membalikkan bit dalam integer ini dan kemudian kuadratkan angka untuk mendapatkan output yang diperlukan.

Saat membalikkan bit Anda tidak harus menggunakan nol terkemuka di input. Sebagai contoh:

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

25 input / output pertama dari urutan ini:

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

Solusi Anda harus bekerja untuk bilangan bulat berukuran sewenang-wenang. Jika bahasa Anda tidak memiliki metode bawaan yang praktis untuk menggunakannya, implementasikan jawaban Anda seolah-olah itu. Anda kemudian dimaafkan jika jawaban Anda terlalu banyak. Namun, jangan gunakan trik / batasan yang hanya berfungsi untuk domain terbatas (seperti tabel pencarian).


Skor Anda adalah jumlah byte kode sumber.

-50% bonus jika Anda tidak pernah mengkonversi nomor ke / dari biner. Ini tidak terbatas pada builtin, jika Anda mengulangi angka sedikit demi sedikit (baik dengan menggeser atau menutupi atau metode lainnya), itu juga akan dihitung sebagai konversi. Saya tidak tahu apakah ini benar-benar mungkin, tetapi memberi insentif untuk menemukan pola dalam urutan.

Kemenangan skor terkecil.

orlp
sumber
6
Begitu dekat
Conor O'Brien
1
Jika kode memanggil metode yang menghasilkan string karakter yang mewakili bit, apakah itu memenuhi syarat untuk bonus?
Brad Gilbert b2gills
2
@ BradGilbertb2gills No.
orlp
Saya menduga bahwa menggunakan matematika untuk mengekstrak bit juga dianggap sebagai konversi biner?
lirtosiast
2
Relevan dan relevan
Mego

Jawaban:

5

Par , 5 byte

✶Σ⌐Σ²

Itu baca-biner-terbalik-biner-persegi.

Lynn
sumber
Saya hitung 12
Conor O'Brien
@CᴏɴᴏʀO'Bʀɪᴇɴ Penghitung byte itu mengasumsikan UTF-8. Saya percaya Mauris menggunakan beberapa pengkodean yang bukan UTF-8 untuk menghitung byte-nya, tetapi ia tidak menentukan pengkodean ini.
orlp
Par menggunakan penyandian anehnya sendiri. Representasi kanoniknya adalah subset tertentu dari <256 karakter Unicode. Saya tidak yakin apakah itu memiliki nama; Saya harus menunggu @Ypnypn untuk berbunyi.
Lynn
Oh begitu. @orlp
Conor O'Brien
Mungkinkah ia memiliki SBC sendiri?
HyperNeutrino
19

Mathematica, 42 21 byte

Terima kasih kepada alephalpha untuk mengurangi separuh skor.

#~IntegerReverse~2^2&

Alasan sebenarnya saya melakukan ini di Mathematica adalah karena saya ingin melihat plot ... itu pasti terlihat lucu:

masukkan deskripsi gambar di sini

Martin Ender
sumber
11
Tapi saya suka nilainya! XD
Conor O'Brien
1
mengapa jawaban ini memiliki lebih banyak suara daripada jawaban dengan byte terkecil? o_O
Seadrus
27
@Seadrus Anda tahu apa yang mereka katakan. Gambar bernilai 7 byte.
Martin Ender
5
jadi skor kamu adalah 42 + 7 = 49 byte: P
Seadrus
3
Maaf, @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Martin Ender
8

Minkolang 0,14 , 43 byte

Terima kasih kepada Mego untuk menginspirasi ini.

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

Uji kode di sini dan periksa semua kotak uji di sini .

Penjelasan

Ini menggunakan relasi perulangan ini:

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

Jika ninput, maka a(n)nomor yang dihasilkan setelah urutan binernya dibalik. 0 dan 1 sudah jelas. Untuk a(2n) = a(n), pertimbangkan bahwa x0(di mana xurutan angka biner) dibalik adalah 0x, yang sama dengan x. Sebab a(2n+1), alasannya sedikit lebih rumit. x1membalik adalah 1x, yang sama dengan x + 2^kuntuk beberapak . Ini kadalah satu lebih dari jumlah digit x, yaitu floor(log_2(n))+1. Rumus lengkapnya mengikuti, kecuali itu sedikit dimodifikasi. Inilah yang sebenarnya saya kode:

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

Saat Mego dan saya berolahraga dalam obrolan floor(n/2) = (n - n%2)/2,. Jadi log_2(floor(n/2))+1 = log_2(n - n%2),. Lebih jauh lagi, mengalikan dengan (n%2)meruntuhkan bagian aneh dan genap menjadi satu ekspresi.

Akhirnya, tanpa basa-basi lagi, inilah kodenya, dijelaskan.

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.
El'endia Starman
sumber
1
Saya pikir pengulangan hanyalah reformulasi iterasi atas bit individu.
Martin Ender
3
Saya khawatir ini tidak masuk hitungan. Setiap kali Anda melihat 2ndan 2n+1dalam hubungan perulangan, Anda harus segera menganggapnya sebagai perulangan bit.
orlp
1
@ Atlp: Yah, itu mengecewakan. Saya agak yakin sekarang bahwa bonus Anda tidak mungkin.
El'endia Starman
@ El'endiaStarman Saya hampir mengerti, saya kira.
Conor O'Brien
8

Japt , 29 28 11 7 byte

(Anda dapat menyimpan program sebagai file 7-byte IEC_8859-1 yang disandikan, kemudian mengunggahnya ke penerjemah .)

Japt adalah JavaScript singkat yang dibuat oleh produk ETH .

¢w n2 ²

Cobalah online!

Penjelasan:

  1. ¢adalah jalan pintas ke Us2, yang dikompilasi ke U.s(2). Uadalah input (implisit), .s(2)dipanggil oleh angka, memanggil .toString(2)(mengkonversi ke biner, mem-parsing sebagai string).

  2. wmengkompilasi ke .w(), yang membalikkan string ( .split('').reverse().join('')).

  3. n2berfungsi sebagai parseInt(<number>,2), yaitu mengkonversi biner ke desimal.

  4. ²memanggil Math.pow(<number>,2), yaitu kuadrat nomornya.

nicael
sumber
1
Ada fungsi string untukNomor aktif n, jadi Anda bisa melakukannya Us2 a w a n2 p2. Kerja bagus!
Produksi ETH
1
Juga, wbekerja sama pada string seperti halnya pada array, sehingga Anda tidak perlu keduanya a:)
ETHproductions
1
Satu hal terakhir: Us2 = ¢, dan p2= ², membawanya ke 7 byte:¢w n2 ²
ETHproduksi
3
The penerjemah secara online sekarang menerima IEC_8859-1 dikodekan file. (Meskipun saya tidak yakin bagaimana melakukan UTF-8 dan UTF-16 juga ...)
ETHproduksi
2
@ ETHproductions - sekarang saya bisa memberi ini +1 :)
Digital Trauma
5

Python, 32 byte

lambda x:int(bin(x)[:1:-1],2)**2

Cobalah online.

Kode ini cukup mudah:, bin(6)misalnya, memberi 0b110, representasi biner dari 6. [:1:-1]membalikkan string dan menghapus 0b. intmengubah string menjadi integer dari biner, dan **2kuadratkan.

NinjaBearMonkey
sumber
5

Jolf , 7 byte

Jalankan saja. Input pada halaman tidak berfungsi.

^C_Bj22

Penjelasan

^C_Bj22
    j   numeric input
   B    convert to binary (str)
  _     reverse
 C   2  parse as binary integer to base 10
^     2 square
        implicit output

Saya menambahkan Qperintah, yang menghasilkan 6 byte:QC_Bj2

Conor O'Brien
sumber
4
Dicoret 7 masih terlihat seperti 7.
sebuah spaghetto
2
@ quartata Tidak seburuk dicoret 4.
orlp
4

Serius , 8 7 byte

2;,¡R¿ª

Tantangan seperti ini sempurna untuk Serius :)

Cobalah online

Penjelasan:

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
Mego
sumber
Pekerjaan yang bagus, cocok dengan Jolf!
Conor O'Brien
+1 karena juru bahasa Anda menerima pengkodean CP437 (atau setidaknya representasi hex)
Digital Trauma
4

J, 10 9 byte

2^~|.&.#:

Ini adalah kata kerja monadik diam-diam. Cobalah online!

Terima kasih kepada @randomra untuk bermain golf 1 byte!

Bagaimana itu bekerja

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.
Dennis
sumber
Tautan tidak berfungsi, saya mendapatkan kesalahan 404 pada halaman google yang mengatakan "URL yang diminta /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.html tidak ditemukan di server ini. Hanya itu yang kita ketahui."
Bijan
2

CJam, 10 byte

ri2bW%2b_*

Cobalah online

Reto Koradi
sumber
2

JavaScript, 64 63 56 53 byte

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

Saya sadar saya ekstra panjang, tapi hei, saya bisa melakukannya: P

Demo

nicael
sumber
alih-alih parseInt(yang dapat Anda lakukan+("0b"+
Downgoat
@Downgoat hm, sepertinya tidak memberikan hasil yang benar.
nicael
[...n.toString(2)]dan.join``
Conor O'Brien
1
Bahkan lebih pendek w / ES7 (49 bytes): n=>+("0b"+[...n.toString(2)].reverse().join``)**2. Belum berfungsi di peramban mana pun
Downgoat
1
@ CO'Bʀɪᴇɴ Terima kasih, ini menghemat beberapa byte.
nicael
2

Perl 6 , 21 byte

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

Contoh penggunaan:

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
Brad Gilbert b2gills
sumber
2

PHP, 45 byte

echo pow(bindec(strrev(decbin($argv[1]))),2);
tidak terdefinisi
sumber
2

Shell, 25

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

Input / output melalui STDIN / STDOUT:

$ echo 26|dc -e2o?p|rev|dc -e2i?d*p
121
$ 
Trauma Digital
sumber
1

Pyth - 9 byte

Konversi langsung. Saya benar-benar ditugaskan 2 ke var yang sangat aneh.

^i_jQK2KK

Test Suite .

Maltysen
sumber
1

Pyth, 9 byte

^i_.BQ2 2

Ini adalah jawaban berbasis pyth yang sangat sederhana mirip dengan yang Python

TanMath
sumber
1

𝔼𝕊𝕄𝕚𝕟, 12 karakter / 21 byte

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

Try it here (Firefox only).

Jawaban tidak kompetitif, 9 karakter / 18 byte

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).

Mama Fun Roll
sumber
1
Melalui penghitung byte ini , berikan 15 byte (menggunakan pengodean lain).
nicael
Saya kelas menggunakan UTF-8 (sampai saya bisa mendapatkan encoding Mines untuk bekerja).
Mama Fun Roll
... nama bahasanya ... adalah kotak?
corsiKa
Ini ESMin di doublestruck. Karakter Unicode tidak sepenuhnya didukung.
Mama Fun Roll
1

Ruby, 35 byte

->(x){x.to_s(2).reverse.to_i(2)**2}
Harsh Gupta
sumber
1

TI-Basic (TI-84 Plus CE), 42 byte

Prompt X
0→S
While X
2S→S
If X/2≠int(X/2
S+1→S
End
S2
pizzapants184
sumber