Sepertinya tugas yang mustahil kan? Sebenarnya tidak terlalu sulit. Jika kita menulis kata itu Infinity
sebagai kode ASCII biner 8-bit, kita akan mendapatkan:
01001001 01101110 01100110 01101001 01101110 01101001 01110100 01111001
Ini dapat digabungkan, dan dikonversi ke nilai desimal 5291279215216915577
. Nah, itu angka yang bisa kita kerjakan ...
Cara Anda menghitung mundur adalah:
- Keluarkan string asli sebagai angka desimal (seperti yang ditunjukkan di atas)
- Hapus awalan 0s dalam representasi binernya (jika ada)
- Beralih bit dalam representasi biner (1-> 0, 0-> 1)
- Keluarkan angka dalam desimal
- Ulangi langkah 2-4 hingga Anda mencapai 0.
Tantangan:
Buat program atau fungsi yang mengambil string sebagai input, dan output (pada format apa pun yang sesuai) angka yang akan Anda dapatkan ketika melakukan prosedur di atas.
Kasus cobaan:
Saya pikir tantangannya akan cukup mudah untuk dipahami, meskipun hanya satu test case. Saya akan menggunakan Inf
alih-alih Infinity
menjaga ini cukup singkat.
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
Kode Anda harus mendukung string yang dapat direpresentasikan sebagai angka biner hingga batas bahasa Anda. Semua string hanya akan berisi karakter ASCII yang dapat dicetak dari 32-126 (spasi hingga tilde).
Papan peringkat
var QUESTION_ID=98274,OVERRIDE_USER=31516;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Inf:-1:0
∞..0
Jawaban:
Jelly ,
1510 byte-5 bytes terima kasih kepada @Dennis (konversikan langsung dari basis 256 setelah pemain ordinal)
TryItOnline!
Bagaimana?
sumber
Oḅ⁹
.Python 2,
8982777675 byteUji di Ideone .
Bagaimana itu bekerja
Setelah menginisialisasi n ke 0 , baris kedua melakukan konversi string-ke-integer yang ditentukan dalam tantangan sebagai berikut.
Di setiap langkah, n digeser 8 unit ke kiri, lalu bitwise ATAU -ed dengan titik kode karakter berikutnya c . Untuk input Inf , ini sebagai berikut.
Sekarang kita siap untuk menghasilkan output. Untuk membalikkan bit n , kami melanjutkan sebagai berikut.
Pertama, kita menghitung bit dalam representasi biner n tanpa memimpin nol. Mari kita sebut hasilnya k . Kemudian, kita menghitung kekuatan k k dari 2 , yang memiliki k + 1 digit biner: 1 tunggal , diikuti oleh k 0 's. Kita kurangi 1 dari hasilnya, menghasilkan angka yang terdiri dari k , yang kemudian kita XOR dengan n untuk membalikkan bitnya. Untuk input inf ini berlaku sebagai berikut.
Pada rintangan tambahan dalam implementasi adalah bahwa kita harus mencetak n sebelum langkah pertama, setelah langkah terakhir, dan di semua langkah di antaranya. Python tidak memiliki loop do-while dan satu pernyataan cetak berharga 8 byte, jadi kami melakukan yang berikut.
Dalam implementasi langsung dari langkah pembaruan, yaitu,
kami mengganti loop dengan yang tak terbatas (
while 1
) dan menghitung1
dalam loop sebagain/n
. Ini sama dengan n> 0 .Sekali n = 0 , kita tetap di loop, mencetak status sekali lagi, lalu mencoba memperbaruinya. Namun,
0/0
memicu ZeroDivisionError , keluar dari loop dan keluar dengan kesalahan. Perhatikan bahwa ini menyebabkan output liar ke STDERR, yang diizinkan secara default .sumber
-n/n
trik itu :-)n/n
trik? Mungkin dijelaskan di jawaban lain di suatu tempat tetapi saya belum menemukannya. Apa fungsinya di sini?JavaScript, 82 byte
Menyimpan satu byte berkat @Arnuald
Salah satu dari beberapa kali ketika program penuh mengungguli fungsi (dan ES6 tidak mengungguli ES5) ...
Kata-kata di atas mendukung hingga 4 huruf. Tambahkan 4 byte untuk mendukung kata hingga 6 huruf:
sumber
g=a=>a[0]?a.pop().charCodeAt()+g(a)*256:0
(-1)n<<8|y.charCodeAt()
harus menyimpan byte.for(;n;)for(i=!alert(n);i<=n;i*=2)n^=i
akan menyimpan byte lain, tetapi Anda tidak akan menampilkan0
, yang mungkin diperlukan.n<<8
lebih awal tetapi memutuskan itu tidak akan berhasil karena akan rusak untuk n dengan lebih dari 31 bit. Saya kira itu tidak masalah sekarang karena saya sudah membaginya antara versi 31-bit dan versi 53-bit ... Dan sayangnya, saya tidak berpikir saya bisa menyimpan apa pun pada peringatan sementara mengingatkan kedua yang pertama iterasi dan yang terakhir.Sebenarnya , 14 byte
Cobalah online!
Penjelasan:
sumber
05AB1E , 18 byte
Menggunakan pengodean CP-1252 .
Cobalah online!
Penjelasan
sumber
MATL , 13 byte
Cobalah online!
Penjelasan
sumber
Mathematica, 99 byte
Fungsi anonim. Mengambil string sebagai input, dan mengembalikan daftar angka sebagai output.
sumber
Haskell,
109123118102 10297 byteTerima kasih kepada @nimi karena telah menghemat 5 byte!
Pemakaian:
(++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum $ "Infinity"
Dijamin untuk bekerja pada angka hingga 29 bit oleh bahasa, biasanya bekerja hingga angka 63-bit pada sistem 64-bit. Gunakan
map(fromIntegral.fromEnum)
sebagai gantinya (+14 byte) untuk mendukung jumlah besar yang sewenang-wenang.Bekerja untuk rentang unicode
[0..255]
. Membalik bit secara rekursif.sumber
takeWhile(>0)
denganfst.span(>0)
. Jika Anda menggunakan pointfree, Anda dapat menjatuhkan namaf
, jadi fungsi utama Anda adalah(++[0]) ... map fromEnum
.f
.fromIntegral
? Dari tantangan: "harus mendukung ... hingga 63 bit ... atau batas bahasa Anda", jadiInt
harus baik-baik saja. Jika Anda ingin menyimpannya, pindahkan kemap
, yaitu versi lamafoldl1
danmap(fromIntegral.fromEnum)
.PHP,
132126123120108107 byteunpack
bukannyastr_split
merenderord()
usang -> -3 byte_
saat pemisah menyelamatkan 3.bindec
alih-alihltrim
menghapus nol terkemuka: -12echo
di loop body menghemat 1 byteprint
di loop head.sumber
$n=$n*256+$i;for(print$n;$n;)
dapat ditulis sebagaifor(print$n=$n*256+$i;$n;)
? Karena bagian penugasan akan dieksekusi sekali, ini harusnya berhasil. Dan alih-alihecho _.$n=[...]
, Anda harus menggunakannyaecho _,$n=[...]
. Itu tidak akan menyimpan byte apa pun, tetapi akan mempercepat kode sedikit sangat kecil dan akan memisahkan pernyataan. Itu berarti bahwa, misalnya,echo _,$a?5:6;
dapat ditulis alih-alihecho _.($a?5:6);
. Ini mungkin membantu di masa depan.print
dalam kasus ini. Sendiri tidak layak diedit; tapi terima kasihforeach(unpack("C*",$argv[1])as$i)
... Konyol saya ... Dan ya, mengubah periode untuk koma untuk memiliki efek yang sama tidak sepadan dengan masalahnya.Perl, 65 byte
53 byte kode + 12 untuk
-Mbigint -p
.Terima kasih kepada @ Dada karena telah menyelamatkan saya 13 byte!
Pendekatan yang cukup mudah, hanya berbeda dengan sebagian besar dari ini adalah bahwa angka disimpan sebagai biner dan dicetak dalam desimal. Saya yakin ini bisa diperbaiki, mungkin dengan menyimpan detail dalam sebuah array.
-Mbigint
agak tidak nyaman tetapi perlu.Pemakaian
sumber
perl -Mbigint -lpE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
(Saya tidak tahu cara menggunakan unpack biasanya, saya hanya beruntung ketika googling cara mengkonversi string ke biner ;-))unpack
sintaks yang selalu meledakkan pikiranku! Saya akan memperbarui, terima kasih!echo -n
satu-satunya perubahan lain.Pyth, 12 byte
Program yang mengambil input dari string yang dikutip dan mencetak hasilnya sebagai daftar bilangan bulat.
Verifikasi semua kasus uji
Bagaimana itu bekerja
sumber
Python 3,
9995 byteGagasan utamanya adalah mengubah string menjadi byte ke angka. Setiap iterasi mencetak output dan XOR dengan semua 1s untuk maju ke nol.
sumber
2**x.bit_length()-1
. Urutan operasi untuk daya dan pengurangan lebih tinggi dari xor. Juga, ituwhile
bisa dalam satu baris.P=print
dan kemudian gunakanP()
sebagai gantinyaprint()
Python 2,
117115 byteMenyimpan 2 byte berkat Cyoce.
Asumsikan input terlampir dalam tanda kutip, mis
"Inf"
m
menghitung hingga digit tertinggi, demikianm-1
juga topeng XOR untuk melakukan operasi yang diinginkan. Bagian terpanjang adalah mengubah input menjadi urutan bit awal.Contoh:
sumber
-i-1
dengan~i
Ruby,
104101100818065 byte19 byte disimpan berkat @WayneConrad!
15 Bytes disimpan berkat @philomory!
1 byte disimpan berkat @LeeW!
Mengambil input melalui argumen baris perintah.
Terinspirasi oleh jawaban Python @ Jimmy Johnson
sumber
i.to_s(2).rjust 8,'0'
dengan"%08b"%i
inject(:+)
dapat digantikan denganjoin
unpack
diikuti oleh[0]
daripada mengacaukangsub
akan menghemat 11 byte. Beralih ke$*[0]
alih-alihgets.chop
(menggunakan argumen baris perintah alih-alih input konsol) akan menyimpan 9 lainnya, baris pertama menjadip n=$*[0].unpack('B*')[0].to_i(2)
.Labirin ,
104103 byteCobalah secara Online!
Penjelasan:
Instruksi penunjuk dimulai pada karakter paling non-dinding paling kiri atas (dinding menyertakan spasi dan huruf apa pun kecuali
v
).Jeruk:
Loop ini mendapatkan input satu karakter sekaligus sebagai kode ASCII, menambahkannya ke nilai saat ini dan mengalikan nilai saat ini dengan 256.
'
Tanpa op,
Dorong kode ascii dari input char berikutnya ke atas stack atau -1 jika EOF. Pada titik ini jika input diterima, kode akan berbelok ke kanan (bergerak ke bawah) karena bagian atas tumpukan adalah potive. Kalau tidak, ia akan berbelok ke kiri karena bagian atas tumpukan negatif.|
Keluarkan dua item teratas dari tumpukan dan dorong hasil bitwise OR._
Tekan nol256
Setiap digit terlihat munculx
dan didorongx*10+digit
. Jadi ini dikombinasikan dengan push nol sebelumnya push 256 ke atas tumpukan.*
Popy
, popx
, pushx*y
. Pada titik ini karena bagian atas tumpukan positif, kode akan berbelok ke kanan untuk melanjutkan di sekitar loop.Biru:
)
Tambahkan bagian atas tumpukan. Ketika akhir input tercapai, kode akan berbelok ke kiri untuk sampai ke titik ini dengan -1 pada stack yang akan bertambah menjadi nol.256
Memiliki bagian atas tumpukan 0 memungkinkan kita untuk mendorong 256 ini./
Popy
, popx
pushx/y
(pembagian integer). Karena kita mengalikan input dengan 256 setiap loop, kita perlu mengembalikan perkalian terakhir.:
Gandakan bagian atas tumpukan sehingga kami memiliki salinan nilai saat ini untuk nanti.!
Pop bagian atas tumpukan dan cetak nilai integer ke STDOUT.\
Cetak baris baru._2
Dorong dua ke atas tumpukan.}
Pindahkan bagian atas tumpukan ke bagian atas tumpukan tambahan.Merah:
Loop ini membalik bit dari nilai saat ini dengan XOR dengan nilai tertentu yang dihitung dalam loop (hijau). Kemudian output nilai saat ini dan keluar dari program jika nilai saat ini adalah nol.
_
Tekan nol (aliran kontrol).;
Buang bagian atas tumpukan (aliran kontrol).:
Gandakan nilai saat ini. Salinan akan digunakan untuk menghitung XOR._
Tekan nol (aliran kontrol).$
Popy
, popx
, Pushx XOR y
.:!
Gandakan nilai saat ini dan cetak representasi integer.@
dan berakhir.\
Cetak baris baru._2}
Tekan 2 dan pindah ke tumpukan aux._1
Tekan 1 (aliran kontrol).Hijau:
Loop ini menghitung nilai yang kita perlukan untuk XOR nilai saat ini. Hal ini dilakukan dengan berulang kali menggandakan bagian atas tumpukan pembantu sambil membagi dua salinan nilai saat ini pada pemberhentian tumpukan utama hingga mencapai 0.
_
Tekan nol (aliran kontrol).;
Buang nilai saat ini yang hanya digunakan untuk menegakkan aliran kontrol._2
Tekan 2 untuk membagi dua nilai saat ini./
Membagi{
Pindahkan bagian atas tumpukan aux ke bagian atas tumpukan utama._2*
Gandakan bagian atas tumpukan}
Pindahkan bagian atas tumpukan utama kembali ke tumpukan aux._1
Dorong satu untuk aliran kontrol.;
Buang yang tersisa dari nol dari menghitung XOR.{
Pindahkan XOR yang dihitung ke tumpukan utama.(
Kurangi satu dari nilai XOR.sumber
PowerShell v2 +, 158 byte
Ya, jadi, mengonversi pangkalan di PowerShell benar-benar sial . Dan kita bisa melakukannya dua kali di sini.
OK, jadi ini hanya
for
loop on$a
- yaitu, kita loop selama$a
ada. Kami akhirnya akan mencapai string kosong (yang merupakan falsey), jadi itulah cara kami akan mengakhiri.Pengaturan loop,,
$a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)})
mengambil input$args[0]
, melemparkannya sebagaichar
-array, dan loop melalui masing-masing karakter. Kami menggunakan .NET[convert]::ToString(int,base)
untuk mengonversi masing-masing menjadi string biner. Namun, itu tidak termasuk angka nol terkemuka, jadi kita perlu re-cast string sebagai[int]
dan memanggil nya.ToString()
metode dengan8
nol sebagai masker. Kemudian string tersebut dienkapsulasi dalam parens dan diedit-join
bersama, lalu disimpan ke dalam$a
.Di dalam loop, kita
[convert]::ToInt64(string,base)
mengkonversi angka biner ke angka desimal. Yang tersisa di pipa dan kemudian memerah ketika loop ulang (dan karena itu dicetak secara implisit). Bagian selanjutnya melakukan perhitungan - kita.TrimStart()
menghapus nol di depan,-split0
untuk membagi nol dan mendapatkanstring
-array1
s,-replace
yang dengan nol, dan akhirnya-join
array kembali bersama dengan1
s. Kemudian, loop dimulai lagi.sumber
CJam ,
171618 byteCobalah online!
CATATAN: Versi 16 byte yang lama tidak berperilaku benar dengan string kosong:
Juga, terima kasih kepada Dennis untuk menyarankan
p
yang menghemat 1 byte dariN\
menempatkan baris baru ke dalam tumpukan.sumber
_p2b:!2b
menghemat satu byte. Anda juga harus menggunakanl
;r
akan gagal jika input berisi spasi.q
akan bekerja dengan benar dengan string kosong.J, 24 byte
Penjelasan akan datang nanti!
sumber
Retina, 116 byte
Hitungan byte mengasumsikan penyandian ISO 8859-1. Baris 5 berisi byte yang tidak dapat dicetak. Ini
T`\x00-\xFF
.Cobalah online
Jangan coba ini dengan input lebih dari dua karakter. (Ini habis menggunakan penerjemah online.) Kita harus mengonversi biner menjadi unary sebelum desimal. : D
Sayangnya, ada nol di belakang dan linefeed, tapi saya memutuskan untuk menganggap itu baik-baik saja karena output masih benar.
Penjelasan
sumber
Ruby - 70 byte
Program keluar dengan pengecualian setelah selesai, tetapi pemahaman saya adalah bahwa itu baik-baik saja selama output kesalahan pergi ke STDERR daripada STDOUT (yang memang).
sumber
C,
147135133125122121117115103 byteDisimpan 5 byte berkat @Cyoce!
Disimpan 2 byte berkat @Cyoce dan @cleblanc!
Disimpan 12 byte berkat @ceilingcat
Tidak Disatukan:
sumber
int
deklarasiwhile
loop terakhir menjadifor
loopwhile(1)
kefor(;;)
int
deklarasi di mana-mana dan mendapatgcc -std=89
kesalahan. Tapi terima kasih atasfor(;;)
tipnya. Saya akan terus berusaha menghapusint
deklarasi :)))i;main(c,v)char**v;{...}
). Di ponsel sekarang juga, jadi saya tidak yakinC,
129120117110107105 BytesDiuji dengan
keluaran
sumber
i=0
ke deklarasii
dan biarkan bagian inisialisasifor
loop kosongi
global int implisit, ia perlu diinisialisasi setiap kali f (...) dipanggil.i
nol lagi sehingga masih dapat digunakan kembali.C #,
360359 byteProgram lengkap:
sumber
var t="";var f="";
menjadivar t="",f=""
sebaliknya? Menghemat 5 byte.