Menurut http://en.cppreference.com/w/cpp/language/integer_literal , literer bilangan bulat terdiri dari desimal / hex / oktal / biner literal dan akhiran bilangan bulat opsional, yang jelas sama sekali tidak perlu, membuang byte yang berharga dan tidak digunakan dalam tantangan ini.
Literal desimal adalah a non-zero decimal digit (1, 2, 3, 4, 5, 6, 7, 8, 9), followed by zero or more decimal digits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
.
Huruf oktal adalah the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7)
.
Huruf heksadesimal adalah the character sequence 0x or the character sequence 0X followed by one or more hexadecimal digits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e, E, f, F)
(perhatikan case-insensitivity ofabcdefx
).
Huruf biner adalah the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1)
.
Selain itu, mungkin ada beberapa '
s sebagai pemisah digit. Mereka tidak memiliki makna dan dapat diabaikan.
Memasukkan
Sebuah string yang merepresentasikan integer C ++ 14 literal atau array dari kode-kodenya.
Keluaran
Angka yang diwakili oleh string input pada basis 10, dengan baris tambahan opsional. Output yang benar tidak akan melebihi 2 * 10 ^ 9
Kriteria menang
Para kontributor GCC membutuhkan lebih dari 500 baris kode untuk melakukan ini, oleh karena itu kode kami harus sesingkat mungkin!
Kasus uji:
0 -> 0
1 -> 1
12345 -> 12345
12345'67890 -> 1234567890
0xFF -> 255
0XfF -> 255
0xAbCdEf -> 11259375
0xa'bCd'eF -> 11259375
0b1111'0000 -> 240
0b0 -> 0
0B1'0 -> 2
0b1 -> 1
00 -> 0
01 -> 1
012345 -> 5349
0'123'4'5 -> 5349
0
mungkin merupakan test case yang baik untuk ditambahkan (itu mengungkapkan bug di salah satu revisi saya baru-baru ini).Jawaban:
Japt , 6 byte
Cobalah online!
sumber
'
dari input dan kemudian mengevaluasi sebagai Jskode mesin x86 (32-bit),
5957 byteFungsi ini digunakan
esi
sebagai penunjuk ke string yang diakhiri dengan nol dan mengembalikan nilai dalamedx
. (Daftar di bawah ini adalah input GAS dalam sintaks AT&T.)Dan pembongkaran dengan jumlah byte - dalam format Intel kali ini, jika Anda lebih suka yang itu.
Dan jika Anda ingin mencobanya, berikut ini adalah kode driver tes C ++ yang saya tautkan dengannya (termasuk spesifikasi konvensi pemanggilan dalam sintaks asm GCC):
-1 byte karena komentar dari Peter Cordes
-1 byte dari pemutakhiran untuk menggunakan dua pengurangan untuk mengubah 10 ke 8
sumber
rdx
dan rbx? Then you can use 1-byte
cdq` ke nolrdx
darieax
.JavaScript (Babel Node) , 26 byte
lol x2
Cobalah online!
sumber
Number
karena menangani biner dan hex, tetapi tampaknya tidak oktalNumber("010") === 10
C ++ (gcc),
141138134120 byteIni adalah fungsi yang mengambil array karakter (ditentukan sebagai sepasang pointer ke awal dan akhir - menggunakan pasangan idiom iterator) dan mengembalikan nomor. Perhatikan bahwa fungsi mem mutasi array input.
(Ini bergantung pada perilaku gcc / libstdc ++ yang
#include<cstdlib>
juga menempatkan fungsi dalam lingkup global. Untuk kode yang benar-benar sesuai standar, ganti dengan#include<stdlib.h>
untuk biaya satu karakter lagi.)Deskripsi singkat: Kode pertama kali digunakan
std::remove
untuk memfilter'
karakter (ASCII 39). Kemudian,strtol
dengan basis 0 sudah akan menangani case desimal, oktal, dan heksadesimal, jadi satu-satunya case lain yang perlu diperiksa adalah leading0b
atau0B
dan jika demikian, atur base untukstrtol
2 dan mulai parsing setelah 2 karakter utama.Cobalah online.
Disimpan 3 byte karena saran oleh ceilingcat dan beberapa lagi golf yang diikuti.
Disimpan 4 byte karena saran oleh grastropner.
-2 byte oleh Lucas
-12 byte oleh l4m2
sumber
#import
bukan#include
?0
untuk basis 2Python 2 , 32 byte
Cobalah online!
lol
(perlu Python 2 karena Python 3 mengubah literal oktal ke
0o(...)
).sumber
Perl 5 (-p), 14 byte
TIO
sumber
R ,
797169 byteCobalah online!
strtoi
melakukan segalanya kecuali untuk konversi basis 2 dan mengabaikan'
, jadi ada cukup banyak byte hanya untuk memperbaiki hal-hal itu.Terima kasih kepada Aaron Hayman untuk -6 byte, dan menginspirasi -4 lebih banyak byte (dan terus bertambah!)
Verifikasi semua kasus uji (versi lama)
sumber
sub("0b|B"
dengansub("b|B"
, karena awalan "0" tidak akan mempengaruhi nilai. Bisa mendapatkan yang lain dengan mengganti namastrtoi
na.omit
sebelumnya. Sangat berguna di sini, dan saya bermain golf lebih banyak :-)strtoi
adalah biner, Anda dapat menggunakansubstring
alih-alihsub
menyimpan byte lain: Coba online!s
penggunaansub
dengansub('..','',s)
byte lain yang lebih pendek!05AB1E ,
1614 byteDisimpan 2 byte berkat Grimy
Cobalah online! atau sebagai Test Suite
Penjelasan
sumber
0010
).ï
!Excel, 115 byte
Input dari A1, output ke mana pun Anda meletakkan formula ini. Array rumus, jadi gunakan Ctrl+ Shift+ Enteruntuk memasukkannya.
Saya menambahkan beberapa test case yang dapat Anda lihat dalam gambar - beberapa upaya awal menangani semua test case yang diberikan dengan benar tetapi mendapat baris 16 dan / atau 17 salah.
sumber
kode mesin x86-64, 44 byte
(Kode mesin yang sama juga berfungsi dalam mode 32-bit.)
Jawaban @Daniel Schepler adalah titik awal untuk ini, tetapi ini memiliki setidaknya satu ide algoritmik baru (bukan hanya bermain golf dengan ide yang sama): Kode ASCII untuk
'B'
(1000010
) dan'X'
(1011000
) memberi 16 dan 2 setelah masking dengan0b0010010
.Jadi setelah mengecualikan desimal (digit angka tidak nol) dan oktal (angka char
'0'
kurang dari'B'
), kita bisa mengatur base =c & 0b0010010
dan melompat ke loop digit.Callable dengan x86-64 System V sebagai
unsigned __int128 parse_cxx14_int(int dummy, const char*rsi);
Ekstrak nilai pengembalian EDX dari setengahunsigned __int128
hasil dengantmp>>64
.Blok yang diubah vs versi Daniel (sebagian besar) indentasi kurang dari instruksi lainnya. Juga loop utama memiliki cabang kondisional di bagian bawah. Ini ternyata menjadi perubahan netral karena tidak ada jalan yang bisa jatuh ke atasnya, dan
dec ecx / loop .Lentry
ide untuk memasuki loop ternyata bukan kemenangan setelah menangani oktal secara berbeda. Tetapi memiliki lebih sedikit instruksi di dalam loop dengan loop dalam bentuk idiomatis do {} while structure, jadi saya menyimpannya.Alat uji C ++ Daniel bekerja tidak berubah dalam mode 64-bit dengan kode ini, yang menggunakan konvensi panggilan yang sama dengan jawaban 32-bitnya.
Disassembly, termasuk byte kode mesin yang merupakan jawaban sebenarnya
Perubahan lain dari versi Daniel termasuk menyimpan
sub $16, %al
dari dalam digit-loop, dengan menggunakan lebih banyaksub
daripadatest
sebagai bagian dari mendeteksi pemisah, dan digit vs karakter alfabet.Berbeda dengan Daniel, setiap karakter di bawah
'0'
ini diperlakukan sebagai pemisah, bukan hanya'\''
. (Kecuali' '
:and $~32, %al
/jnz
di kedua loop kami memperlakukan ruang sebagai terminator, yang mungkin nyaman untuk pengujian dengan integer pada awal baris.)Setiap operasi yang memodifikasi
%al
di dalam loop memiliki flag mengkonsumsi cabang ditetapkan oleh hasilnya, dan setiap cabang pergi (atau jatuh melalui) ke lokasi yang berbeda.sumber
eax
mengingat AIUI dalam opcode mode 64-bit dengan tujuan kecil akan mengatur ulang bit yang lebih tinggi ke 0?setcc r/m8
menjadisetcc r/m32
, jadi kita masih membutuhkan 2-instruksi bodohxor
-sero / set flags /setcc %al
sequence untuk membuat 32/64-bit 0 atau 1 variabel, dan perlu register nol sebelum pengaturan bendera. (Atau gunakanmov $0, %eax
sebagai gantinya, atau gunakanmovzx
di jalur kritis).Retina , 96 byte
Cobalah online! Tautan termasuk test suite. Penjelasan:
Hapus
'
s dan konversikan semuanya menjadi huruf kecil.Pisahkan digit, karena setiap digit hex perlu dikonversi menjadi desimal.
Identifikasi basis nomor.
Ubah karakter
a-g
menjadi angka10-16
.Lakukan konversi basis pada daftar digit.
$.($`*$1*_*$2*
adalah singkatan$.($`*$1*_*$2*_)
yang mengalikan$`
dan$1
bersama-sama dan menambahkan$2
. ($`
adalah bagian dari string sebelum;
pangkalan yaitu.)Hapus basisnya.
sumber
J , 48 byte
Cobalah online!
Eval setelah pergantian string.
sumber
0b
: tio.run/##FcwxCsIwFAbg/…Perl 6 , 29 byte
Cobalah online!
Perl 6 membutuhkan
0o
awalan eksplisit untuk oktal dan tidak mendukung awalan huruf besar seperti0X
.Penjelasan
sumber
Oktaf ,
292120 byteCobalah online!
-8 byte terima kasih kepada @TomCarpenter
sumber
@(x)str2num(x(x~="'"))
@(x)str2num(x(x~=39))
f=("077")
kembalians = 77
ketika seharusnya 63. Atau, seperti dalam kasus uji dalam OPf=("012345")
harus mengembalikan 5349 tetapi sebaliknyaans = 12345
Bash, 33 byte
TIO
Zsh,
2927 byte-2 byte terima kasih kepada @GammaFunction
TIO
sumber
setopt octalzeroes
akan diperlukan untuk Zsh.<<<$[...]
bukannyaecho $[...]
Pergi, 75
sumber
JavaScript (ES6), 112 bytes
sumber
Jelly, 27 bytes
Try it online!
Almost all of this is handling octal. Feels like it could be better golfed.
sumber
Ruby with
-n
, 17 bytesJust jumping on the
eval
train, really.Try it online!
sumber
Java (JDK), 101 bytes
Try it online!
Long.decode
deals with all kinds of literals except the binary ones.Template borrowed from Benjamin's answer
sumber
C (gcc),
120118 bytes-1 byte thanks to ceilingcat
Try it online!
sumber
C (gcc),
1019783 bytesTry it online
sumber
PHP - 43 Byte
Same method as /codegolf//a/185644/45489
sumber
C++, G++, 189 bytes
No need for tests
Requires installation of
g++
with C++14 supportNow, explanations :
sumber
Pyth, 27 bytes
Try it online!
Unlike the previous (now deleted) Pyth answer, this one passes all test cases in the question, though it is 3 bytes longer.
sumber
C (gcc) / Bash / C++, 118 bytes
Try it online!
sumber
popen
andsystem
. G++ has a flag, I think-x
, to read from stdin. That might be shorter than fopen stuff, but I don't know how to invoke with stdin in C.popen
commandprintf
->echo
seems to work. You're going to be programming in bash soon.Java,
158154 bytesThis just waiting to be outgolfed. Just tries regexes until something works and default to hex.
-4 bytes thanks to @ValueInk
Try it online
Using ScriptEngine,
9287 bytesEval train coming through. Technically this is passing the torch to JS, so it's not my main submission.
TIO
sumber
[bBxX]
and0[bB].+
for some quick regex optimizations.0x9999999999
)Long
instead ofInteger
for golfing purposes. Also, if you are correct, Python can't compete because it has effectively arbitrary-precision integers. Also, along
in Java is an integer represented with 64 bits instead of 32. There are no decimal places.The correct output never will exceed 2*10^9
it quite clearly states that meaning that long can't be used on its own because I can give it0x9999999999
and it will produce a number higher than 2*10^9 whereas C++ it would create a memory overflow issue because your using more than 32 bits on memory when you have allocated only 32 bits of memory to this number