Analizzare un intero C ++ 14 letterale


27

Secondo http://en.cppreference.com/w/cpp/language/integer_literal , i valori letterali interi sono costituiti da un valore decimale / esadecimale / ottale / binario e un suffisso intero facoltativo, che è ovviamente del tutto superfluo, spreca byte preziosi ed è non utilizzato in questa sfida.

Un letterale decimale è 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) .

Un letterale ottale è the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7).

Un letterale esadecimale è 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)(notare l'insensibilità al maiuscolo / minuscolo di abcdefx).

Un letterale binario è the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1).

Inoltre, ci possono essere opzionalmente alcuni 's come separatore di cifre. Non hanno significato e possono essere ignorati.

Ingresso

Una stringa che rappresenta un valore letterale intero C ++ 14 o una matrice dei suoi codici caratteri.

Produzione

Il numero rappresentato dalla stringa di input in base 10, con una nuova riga finale facoltativa. L'output corretto non supererà mai 2 * 10 ^ 9

Criteri vincenti

I collaboratori di GCC hanno bisogno di oltre 500 righe di codice per fare ciò, quindi il nostro codice deve essere il più corto possibile!

Casi test:

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


4
@LuisfelipeDejesusMunoz No; come ti aspettavi che fosse analizzato?
mio pronome è monicareinstate

1
Suppongo che scrivere semplicemente una funzione in C ++ 14 significhi barare, giusto? Poiché il compilatore lo fa già automaticamente (anche se è internamente più di 500 righe di codice ...)
Darrel Hoffman,

5
@DarrelHoffman Non puoi semplicemente farlo con "una funzione in C ++ 14", dal momento che non richiederebbe un input di stringa. Forse con qualche script che invoca un compilatore C ++.
aschepler,

2
La stringa 0potrebbe essere un buon caso di test da aggiungere (ha rivelato un bug in una delle mie recenti revisioni).
Daniel Schepler

Risposte:



22

codice macchina x86 (32 bit), 59 57 byte

Questa funzione utilizza esicome puntatore una stringa con terminazione null e restituisce il valore in edx. (L'elenco seguente è l'input GAS nella sintassi AT&T.)

        .globl parse_cxx14_int
        .text
parse_cxx14_int:
        push $10
        pop %ecx                # store 10 as base
        xor %eax,%eax           # initialize high bits of digit reader
        cdq                     # also initialize result accumulator edx to 0
        lodsb                   # fetch first character
        cmp $'0', %al
        jne .Lparseloop2
        lodsb
        and $~32, %al           # uppercase letters (and as side effect,
                                # digits are translated to N+16)
        jz .Lend                # "0" string
        cmp $'B', %al           # after '0' have either digit, apostrophe,
                                # 'b'/'B' or 'x'/'X'
        je .Lbin
        jg .Lhex
        dec %ecx
        dec %ecx                # update base to 8
        jmp .Lprocessdigit      # process octal digit that we just read (or
                                # skip ' if that is what we just read)   
.Lbin:
        sub $14, %ecx           # with below will update base to 2
.Lhex:
        add $6, %ecx            # update base to 16
.Lparseloop:
        lodsb                   # fetch next character
.Lparseloop2:
        and $~32, %al           # uppercase letters (and as side effect,
                                # digits are translated to N+16)
        jz .Lend
.Lprocessdigit:
        cmp $7, %al             # skip ' (ASCII 39 which would have been
                                # translated to 7 above)
        je .Lparseloop
        test $64, %al           # distinguish letters and numbers
        jz .Lnum
        sub $39, %al            # with below will subtract 55 so e.g. 'A'==65
                                # will become 10
.Lnum:
        sub $16, %al            # translate digits to numerical value
        imul %ecx, %edx
#        movzbl %al, %eax
        add %eax, %edx          # accum = accum * base + newdigit
        jmp .Lparseloop
.Lend:
        ret

E uno smontaggio con il conteggio dei byte - questa volta in formato Intel, nel caso lo preferissi.

Disassembly of section .text:

00000000 <parse_cxx14_int>:
   0:   6a 0a                   push   0xa
   2:   59                      pop    ecx
   3:   31 c0                   xor    eax,eax
   5:   99                      cdq    
   6:   ac                      lods   al,BYTE PTR ds:[esi]
   7:   3c 30                   cmp    al,0x30
   9:   75 16                   jne    21 <parse_cxx14_int+0x21>
   b:   ac                      lods   al,BYTE PTR ds:[esi]
   c:   24 df                   and    al,0xdf
   e:   74 28                   je     38 <parse_cxx14_int+0x38>
  10:   3c 42                   cmp    al,0x42
  12:   74 06                   je     1a <parse_cxx14_int+0x1a>
  14:   7f 07                   jg     1d <parse_cxx14_int+0x1d>
  16:   49                      dec    ecx
  17:   49                      dec    ecx
  18:   eb 0b                   jmp    25 <parse_cxx14_int+0x25>
  1a:   83 e9 0e                sub    ecx,0xe
  1d:   83 c1 06                add    ecx,0x6
  20:   ac                      lods   al,BYTE PTR ds:[esi]
  21:   24 df                   and    al,0xdf
  23:   74 13                   je     38 <parse_cxx14_int+0x38>
  25:   3c 07                   cmp    al,0x7
  27:   74 f7                   je     20 <parse_cxx14_int+0x20>
  29:   a8 40                   test   al,0x40
  2b:   74 02                   je     2f <parse_cxx14_int+0x2f>
  2d:   2c 27                   sub    al,0x27
  2f:   2c 10                   sub    al,0x10
  31:   0f af d1                imul   edx,ecx
  34:   01 c2                   add    edx,eax
  36:   eb e8                   jmp    20 <parse_cxx14_int+0x20>
  38:   c3                      ret    

E se vuoi provarlo, ecco il codice del driver di test C ++ che ho collegato con esso (compresa la specifica della convenzione di chiamata nella sintassi GCC asm):

#include <cstdio>
#include <string>
#include <iostream>

inline int parse_cxx14_int_wrap(const char *s) {
    int result;
    const char* end;
    __asm__("call parse_cxx14_int" :
            "=d"(result), "=S"(end) :
            "1"(s) :
            "eax", "ecx", "cc");
    return result;
}

int main(int argc, char* argv[]) {
    std::string s;
    while (std::getline(std::cin, s))
        std::printf("%-16s -> %d\n", s.c_str(), parse_cxx14_int_wrap(s.c_str()));
    return 0;
}

-1 byte dovuto al commento di Peter Cordes

-1 byte dall'aggiornamento per utilizzare due decrementi per cambiare da 10 a 8


1
Solo che ti mancano i test per gli overflow ... Un numero troppo grande viene segnalato dai compilatori.
Alexis Wilke,

2
Puoi scambiare l'utilizzo del registro con rdxe rbx ? Then you can use 1-byte cdq` a zero rdxda eax.
Peter Cordes,

1
Dovrebbe essere elencare il numero di byte dell'assembly o essere etichettato come 59 byte di codice macchina x86.
Potato44

2
@PeterCordes Grazie, non lo sapevo. (Inoltre, guardando di nuovo, ho notato che cambiare la base da 10 a 8 potrebbe essere di 2 byte - da due istruzioni di decremento - invece di 3 byte.)
Daniel Schepler

3
@AlexisWilke Inoltre non verifica la presenza di un formato non valido (ad es. Cifre al di fuori dell'intervallo della base specificata) come farebbero anche i compilatori. Ma secondo la dichiarazione del problema, l'ingresso è garantito per essere valido e non traboccare un intero con segno a 32 bit.
Daniel Schepler,


7

C ++ (gcc), 141 138 134 120 byte

Questa è una funzione che accetta una matrice di caratteri (specificata come una coppia di puntatori all'inizio e alla fine - usando la coppia di idiomi di iteratori) e restituisce il numero. Si noti che la funzione muta l'array di input.

(Questo si basa sul comportamento di gcc / libstdc ++ che #include<cstdlib>pone anche le funzioni in ambito globale. Per un codice conforme allo standard rigoroso, sostituirlo con #include<stdlib.h>un costo di un altro carattere.)

Breve descrizione: il codice utilizza innanzitutto std::removeper filtrare i 'caratteri (ASCII 39). Quindi, strtolcon una base di 0 gestirà già i casi decimali, ottali ed esadecimali, quindi l'unico altro caso da verificare è un lead 0bo 0B, in tal caso, impostare la base per strtol2 e iniziare l'analisi dopo i 2 caratteri iniziali.

#import<algorithm>
#import<cstdlib>
int f(char*s,char*e){e=s[*std::remove(s,e,39)=1]&31^2?s:s+2;return strtol(e,0,e-s);}

Provalo online.


Salvati 3 byte grazie al suggerimento di Ceilingcat e qualche altro golf che ne è seguito.

Salvato 4 byte grazie ai suggerimenti di grastropner.

-2 byte di Lucas

-12 byte per l4m2



Incorporato, grazie.
Daniel Schepler,


Se l'input non valido è un comportamento indefinito, non è necessario verificare se il 1 ° carattere è 0per base 2
l4m2

quindi 124
l4m2



4

R , 79 71 69 byte

`+`=strtoi;s=gsub("'","",scan(,""));na.omit(c(+s,sub("..",0,s)+2))[1]

Provalo online!

strtoi fa tutto tranne le conversioni di base 2 e ignorando il ' , quindi ci sono un sacco di byte solo per sistemare quelle cose.

Grazie ad Aaron Hayman per -6 byte e ispirando -4 byte in più (e contando!)

Verifica tutti i casi di test (versione precedente)


può salvare un byte sostituendolo sub("0b|B"con sub("b|B", poiché lo "0" iniziale non influirà sul valore. Puoi ottenerne un altro rinominandostrtoi
Aaron Hayman


1
@AaronHayman wow, non l'ho mai visto na.omitprima. Super utile qui, e ho giocato a golf un po 'di più :-)
Giuseppe

1
Se supponiamo che ogni errore del primo strtoisia binario, puoi utilizzare substringinvece di subsalvare un altro byte: provalo online!
Aaron Hayman,

1
@AaronHayman possiamo eliminare i primi 2 caratteri sdell'utilizzo subinvece con il sub('..','',s)quale è un altro byte più corto!
Giuseppe,

4

05AB1E , 16 14 byte

Salvato 2 byte grazie a Grimy

''KlÐïK>i8ö}.E

Provalo online! o come una suite di test

Spiegazione

''K                # remove "'" from input
   l               # and convert to lower-case
    Ð              # triplicate
     ï             # convert one copy to integer
      K            # and remove it from the second copy
       >i  }       # if the result is 0
         8ö        # convert from base-8 to base-10
            .E     # eval


Ed ecco un 13 falso (passa tutti i casi di test, ma fallisce ad es 0010.).
Grimmy,

@Grimy: grazie! Ottimo uso di ï!
Emigna

4

Excel, 115 byte

=DECIMAL(SUBSTITUTE(REPLACE(A1,2,1,IFERROR(VALUE(MID(A1,2,1)),)),"'",),VLOOKUP(A1,{"0",8;"0B",2;"0X",16;"1",10},2))

Input da A1, output ovunque tu abbia inserito questa formula. Formula di matrice, quindi usa Ctrl+ Shift+ Enterper inserirlo.

Ho aggiunto un paio di casi di test che puoi vedere nell'immagine - alcuni primi tentativi hanno gestito correttamente tutti i casi di test dati ma hanno sbagliato le righe 16 e / o 17.

enter image description here


È contro le regole omettere le ultime due parentesi finali e trarre vantaggio dal fatto che il "compilatore" (premendo return o tab) correggerà l'errore per te?
Lucas,

Secondo la mia opinione personale, sì. Non credo che ci sia consenso sul sito. Excel aggiungendo le parentesi sembra l'equivalente di una funzione di completamento del codice nell'IDE di un'altra lingua, che dovrebbe essere ignorata per il conteggio dei byte. (Ma, penso che "?" Dovrebbe essere conteggiato come 1 byte in BASIC anche se verrà silenziosamente espanso in "STAMPA", quindi forse non sono del tutto coerente qui).
Sophia Lechner,

3

codice macchina x86-64, 44 byte

(Lo stesso codice macchina funziona anche in modalità 32 bit.)

La risposta di @Daniel Schepler è stata un punto di partenza per questo, ma questa ha almeno una nuova idea algoritmica (non solo il golf migliore della stessa idea): i codici ASCII per 'B'( 1000010) e 'X'( 1011000) danno 16 e 2 dopo il mascheramento con0b0010010 .

Quindi dopo aver escluso decimale (cifra iniziale diversa da zero) e ottale (il carattere dopo '0'è inferiore a 'B'), possiamo semplicemente impostare base = c & 0b0010010e saltare nel ciclo delle cifre.

Callable con x86-64 System V as unsigned __int128 parse_cxx14_int(int dummy, const char*rsi); Estrai il valore di ritorno EDX dalla metà superiore del unsigned __int128risultato con tmp>>64.

        .globl parse_cxx14_int
## Input: pointer to 0-terminated string in RSI
## output: integer in EDX
## clobbers: RAX, RCX (base), RSI (points to terminator on return)
parse_cxx14_int:
        xor %eax,%eax           # initialize high bits of digit reader
        cdq                     # also initialize result accumulator edx to 0
        lea 10(%rax), %ecx      # base 10 default
        lodsb                   # fetch first character
        cmp $'0', %al
        jne .Lentry2
    # leading zero.  Legal 2nd characters are b/B (base 2), x/X (base 16)
    # Or NUL terminator = 0 in base 10
    # or any digit or ' separator (octal).  These have ASCII codes below the alphabetic ranges
    lodsb

    mov    $8, %cl              # after '0' have either digit, apostrophe, or terminator,
    cmp    $'B', %al            # or 'b'/'B' or 'x'/'X'  (set a new base)
    jb   .Lentry2               # enter the parse loop with base=8 and an already-loaded character
         # else hex or binary. The bit patterns for those letters are very convenient
    and    $0b0010010, %al      # b/B -> 2,   x/X -> 16
    xchg   %eax, %ecx
    jmp  .Lentry

.Lprocessdigit:
    sub  $'0' & (~32), %al
    jb   .Lentry                 # chars below '0' are treated as a separator, including '
    cmp  $10, %al
    jb  .Lnum
    add  $('0'&~32) - 'A' + 10, %al   # digit value = c-'A' + 10.  we have al = c - '0'&~32.
                                        # c = al + '0'&~32.  val = m+'0'&~32 - 'A' + 10
.Lnum:
        imul %ecx, %edx
        add %eax, %edx          # accum = accum * base + newdigit
.Lentry:
        lodsb                   # fetch next character
.Lentry2:
        and $~32, %al           # uppercase letters (and as side effect,
                                # digits are translated to N+16)
        jnz .Lprocessdigit      # space also counts as a terminator
.Lend:
        ret

I blocchi modificati rispetto alla versione di Daniel sono (per lo più) rientrati meno di altre istruzioni. Anche il ciclo principale ha il suo ramo condizionale in fondo. Questo si è rivelato essere un cambiamento neutrale perché nessuno dei due percorsi potrebbe cadere in cima ad esso, e ildec ecx / loop .Lentry idea di entrare nel ciclo si è rivelata non essere una vittoria dopo aver gestito l'ottale in modo diverso. Ma ha meno istruzioni all'interno del ciclo con il ciclo in forma idiomatica {} mentre struttura, quindi l'ho tenuto.

Il cablaggio di test C ++ di Daniel funziona invariato in modalità 64 bit con questo codice, che utilizza la stessa convenzione di chiamata della sua risposta a 32 bit.

g++ -Og parse-cxx14.cpp parse-cxx14.s &&
./a.out < tests | diff -u -w - tests.good

Disassemblaggio, inclusi i byte del codice macchina che rappresentano la risposta effettiva

0000000000000000 <parse_cxx14_int>:
   0:   31 c0                   xor    %eax,%eax
   2:   99                      cltd   
   3:   8d 48 0a                lea    0xa(%rax),%ecx
   6:   ac                      lods   %ds:(%rsi),%al
   7:   3c 30                   cmp    $0x30,%al
   9:   75 1c                   jne    27 <parse_cxx14_int+0x27>
   b:   ac                      lods   %ds:(%rsi),%al
   c:   b1 08                   mov    $0x8,%cl
   e:   3c 42                   cmp    $0x42,%al
  10:   72 15                   jb     27 <parse_cxx14_int+0x27>
  12:   24 12                   and    $0x12,%al
  14:   91                      xchg   %eax,%ecx
  15:   eb 0f                   jmp    26 <parse_cxx14_int+0x26>
  17:   2c 10                   sub    $0x10,%al
  19:   72 0b                   jb     26 <parse_cxx14_int+0x26>
  1b:   3c 0a                   cmp    $0xa,%al
  1d:   72 02                   jb     21 <parse_cxx14_int+0x21>
  1f:   04 d9                   add    $0xd9,%al
  21:   0f af d1                imul   %ecx,%edx
  24:   01 c2                   add    %eax,%edx
  26:   ac                      lods   %ds:(%rsi),%al
  27:   24 df                   and    $0xdf,%al
  29:   75 ec                   jne    17 <parse_cxx14_int+0x17>
  2b:   c3                      retq   

Altre modifiche rispetto alla versione di Daniel includono il salvataggio sub $16, %alall'interno del ciclo delle cifre, usando più subinvece che testcome parte del rilevamento di separatori e cifre rispetto a caratteri alfabetici.

A differenza di Daniel, ogni personaggio in basso '0'è trattato come un separatore, non solo '\''. (Tranne ' ': and $~32, %al/ jnzin entrambi i nostri loop considera lo spazio come un terminatore, che è probabilmente conveniente per il test con un numero intero all'inizio di una riga.)

Ogni operazione che si modifica %alall'interno del ciclo ha un flag che consuma un ramo impostato dal risultato e ogni ramo va (o cade) in una posizione diversa.


Hai anche bisogno dell'inizializzazione eaxdato che AIUI in modalità opcode a 64 bit con destinazione piccola reimposterà i bit più alti su 0?
Daniel Schepler,

@Daniel: la scrittura di un registro a 32 bit si estende da zero a 64 bit . La scrittura di un registro a 8 o 16 bit mantiene il comportamento di altre modalità: unire il valore esistente. AMD64 non ha corretto la falsa dipendenza per i registri a 8 e 16 bit e non è cambiata setcc r/m8in setcc r/m32, quindi abbiamo ancora bisogno di uno stupido xorzero -istruzioni / set flag / setcc %alsequenza per creare uno 0/1 a 32/64 bit variabile e necessita del registro azzerato prima dell'impostazione del flag. (Oppure usa mov $0, %eaxinvece, o usa movzxsul percorso critico).
Peter Cordes,

1

Retina , 96 byte

T`'L`_l
\B
:
^
a;
a;0:x:
g;
a;0:b:
2;
a;0:
8;
[a-g]
1$&
T`l`d
+`;(\d+):(\d+)
;$.($`*$1*_$2*
.+;

Provalo online! Il link include la suite di test. Spiegazione:

T`'L`_l

Elimina se 'converti tutto in minuscolo.

\B
:

Separare le cifre, poiché qualsiasi cifra esadecimale deve essere convertita in decimale.

^
a;
a;0:x:
g;
a;0:b:
2;
a;0:
8;

Identifica la base del numero.

[a-g]
1$&
T`l`d

Converti i caratteri a-gin numeri 10-16.

+`;(\d+):(\d+)
;$.($`*$1*_$2*

Esegui la conversione di base nell'elenco delle cifre. $.($`*$1*_*$2*è l'abbreviazione per $.($`*$1*_*$2*_)cui si moltiplica $`e $1insieme e aggiunge $2. ( $`è la parte della stringa prima di ;ie la base.)

.+;

Elimina la base.


Apprezzo l'approccio letterale alla programmazione che hai adottato per spiegare il codice :-)
grooveplex

1

J , 48 byte

cut@'0x 16b +0b 2b +0 8b0 '''do@rplc~'+',tolower

Provalo online!

Valutazione dopo sostituzione della stringa.

0XfF -> +16bff -> 255
0xa'bCd'eF -> +16babcdef -> 11259375
0B1'0 -> +2b10 -> 2
0 -> 8b0 -> 0
01 -> 8b01 -> 1
0'123'4'5 -> 8b012345 -> 5349

Non sembra funzionare correttamente con esadecimali contenenti 0b: tio.run/##FcwxCsIwFAbg/…
Galen Ivanov

1
@GalenIvanov nice find, fixed
FrownyFrog

1

Perl 6 , 29 byte

{+lc S/^0)>\d/0o/}o{S:g/\'//}

Provalo online!

Perl 6 richiede un esplicito 0o prefisso per ottale e non supporta prefissi maiuscoli come 0X.

Spiegazione

                   {S:g/\'//}  # remove apostrophes
{                }o  # combine with function
     S/^0)>\d/0o/    # 0o prefix for octal
  lc  # lowercase
 +    # convert to number

1

Ottava , 29 21 20 byte

@(x)str2num(x(x>39))

Provalo online!

-8 byte grazie a @TomCarpenter


Per 22 byte:@(x)str2num(x(x~="'"))
Tom Carpenter

Che diventa per 21 byte:@(x)str2num(x(x~=39))
Tom Carpenter

Octal non sembra funzionare (almeno su TIO) ... ad esempio, f=("077")ritorna ans = 77quando dovrebbe essere 63. Oppure, come nel caso di test in OP f=("012345")dovrebbe restituire 5349 ma inveceans = 12345
brhfl

1

Bash, 33 byte

x=${1//\'};echo $[${x/#0[Bb]/2#}]

TIO

Zsh, 29 27 byte

-2 byte grazie a @GammaFunction

<<<$[${${1//\'}/#0[Bb]/2#}]

TIO


Intelligente! Avrei pensato che setopt octalzeroessarebbe stato necessario per Zsh.
GammaFunction

Puoi salvare 2 byte in Zsh con <<<$[...]invece diecho $[...]
GammaFunction il

grazie, non sapevo che il comando zsh vuoto con reindirizzamento potesse visualizzare l'output, non so molto su zsh, conosco molto meglio bash
Nahuel Fouilleul,

sapevo che bash interpretava automaticamente i numeri con lo zero iniziale in ottale, e dovevo essere rimosso ad esempio in data / ora
Nahuel Fouilleul

0

Vai, 75

import "strconv"
func(i string)int64{n,_:=strconv.ParseInt(i,0,0);return n}

Ciò non sembra funzionare per i letterali binari, né per i delimitatori di cifre a virgoletta singola.
Nick Matteo,

Oh merda. Lo riparerò presto. Dimenticato completamente i delimitatori
vityavv

0

JavaScript (ES6), 112 byte

n=>+(n=n.toLowerCase().replace(/'/g,""))?n[1]=="b"?parseInt(n.substr(2),2):parseInt(n,+n[0]?10:n[1]=="x"?16:8):0







0

C++, G++, 189 bytes

#include<fstream>
#include<string>
void v(std::string s){{std::ofstream a("a.cpp");a<<"#include<iostream>\nint main(){std::cout<<"<<s<<";}";}system("g++ -std=c++14 a.cpp");system("a.exe");}

No need for tests

Requires installation of g++ with C++14 support

Now, explanations :

It writes a file called a.cpp, uses GCC to compile it and gives a file that output the number




0

C (gcc) / Bash / C++, 118 bytes

f(i){asprintf(&i,"echo \"#import<iostream>\nmain(){std::cout<<%s;}\">i.C;g++ i.C;./a.out",i);fgets(i,i,popen(i,"r"));}

Try it online!


I have golfed some code. Then I have realized there is no reason at all for it to work, but it seems to work; 158 bytes.
my pronoun is monicareinstate

@someone, it's nasty, but I like it!
Johan du Toit

148 bytes by merging popen and system. 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.
my pronoun is monicareinstate

@someone, Everything is now merged into the popen command
Johan du Toit

printf -> echo seems to work. You're going to be programming in bash soon.
my pronoun is monicareinstate

0

Java, 158 154 bytes

This just waiting to be outgolfed. Just tries regexes until something works and default to hex.
-4 bytes thanks to @ValueInk

n->{n=n.replace("'","");var s=n.split("[bBxX]");return Long.parseLong(s[s.length-1],n.matches("0[bB].+")?2:n.matches("0\\d+")?8:n.matches("\\d+")?10:16);}

Try it online

Using ScriptEngine, 92 87 bytes

Eval train coming through. Technically this is passing the torch to JS, so it's not my main submission.

n->new javax.script.ScriptEngineManager().getEngineByName("js").eval(n.replace("'",""))

TIO


Use [bBxX] and 0[bB].+ for some quick regex optimizations.
Value Ink

@ValueInk thanks
Benjamin Urquhart

That's, not an Integer it's a Long, the title clearly says Integer, a single or double precision IEEE754 could become incorrect due to the method used to save the number when due to the decimal place system in IEEE754 en.wikipedia.org/wiki/IEEE_754#Roundings_to_nearest, it also supports a number higher than 2 trillion (0x9999999999)
Martin Barker

@MartinBarker it's allowed to use Long instead of Integer for golfing purposes. Also, if you are correct, Python can't compete because it has effectively arbitrary-precision integers. Also, a long in Java is an integer represented with 64 bits instead of 32. There are no decimal places.
Benjamin Urquhart

The Long thing was just you're using long not an integer and you're wrong about the golfing purposes, 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 it 0x9999999999 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
Martin Barker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.