C ++ 14 tamsayı değişmezini ayrıştırma


27

Göre http://en.cppreference.com/w/cpp/language/integer_literal tamsayı sabitleri oluşur ondalık / heks / sekizli / ikili değişmez ve isteğe bağlı bir tamsayıdır eki, tabii ki tamamen gereksiz olduğundan, atık değerli bayt ve bir bu mücadelede kullanılmaz.

Ondalık bir değişmezdir 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).

Sekizlik bir değişmezdir the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7).

Onaltılık bir değişmezdir 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)(büyük-küçük harf duyarlılığına dikkat edin abcdefx).

Bir ikili değişmezdir the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1).

Ek olarak, isteğe bağlı 'olarak bir rakam ayırıcı olarak bazılar olabilir. Hiçbir anlamı yoktur ve göz ardı edilebilir.

Giriş

Bir C ++ 14 tamsayı değişmezini veya karakter kodlarını içeren bir dize.

Çıktı

İsteğe bağlı bir izleyen yeni satır ile, 10 tabanındaki giriş dizesi tarafından temsil edilen sayı. Doğru çıktı asla 2 * 10 ^ 9'u geçmez

Kazanan kriterler

GCC katılımcılarının bunu yapmak için 500'den fazla kod satırına ihtiyaçları vardır, bu nedenle kodumuz mümkün olduğu kadar kısa olmalıdır!

Test durumları:

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 Hayır; Bunun nasıl çözümlenmesini beklediniz?
zamirim

1
C ++ 14'te bir fonksiyon yazmanın hile yapacağını farz ediyorum, değil mi? Derleyici zaten otomatik olarak yaptığı için (dahili olarak 500+ kod satırı olsa bile ...)
Darrel Hoffman

5
@DarrelHoffman Sadece "C ++ 14'te bir fonksiyon" ile yapamazsınız, çünkü bu bir string girişi yapmaz. Belki bir C ++ derleyicisini çağıran bir komut dosyası ile.
aschepler,

2
Dize 0eklemek için iyi bir sınama durumu olabilir (son revizyonlarımdan birinde bir hata olduğunu gösterdi).
Daniel Schepler

Yanıtlar:



22

x86 (32 bit) makine kodu, 59 57 bayt

Bu işlev, esiboş sonlandırılmış bir dizeye bir işaretçi olarak alır ve değerini döndürür edx. (Aşağıdaki liste AT&T sözdiziminde GAS girişidir.)

        .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

Ve bayt sayılarıyla sökme - bu kez Intel formatta, tercih ederseniz diye.

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    

Ve denemek istemeniz durumunda, ilintili olarak bağladığım C ++ test sürücüsü kodu (GCC asm sözdiziminde arama kuralları belirtimi dahil):

#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;
}

Peter Cordes tarafından yapılan yorum nedeniyle -1 bayt

-1 ila 10 arasında değiştirmek için iki azalış kullanmak için güncelleme bayt


1
Sadece taşma testleri eksiktir ... Derleyiciler tarafından çok fazla sayıda rapor bildirilir.
Alexis Wilke,

2
Eğer kayıt için kullanımını takas edebilir rdxve rbx ? Then you can use 1-byte sıfıra cdq` rdxdan eax.
Peter Cordes

1
Bu, derlemenizin bayt sayısını listelemeli veya 59 bayt x86 makine kodu olarak etiketlenmelidir.
Patates44

2
@PeterCordes Teşekkürler, bunu bilmiyordum. (Ayrıca, tekrar baktığımda, tabanın 10'dan 8'e değiştirilmesinin 2 bayt olabileceğini - iki azaltma talimatından - 3 bayt yerine.)
Daniel Schepler

3
@AlexisWilke Ayrıca derleyicilerin de yapacağı geçersiz formatı (örneğin, verilen tabanın dışındaki rakamlar) test etmez. Ancak sorun bildirgesine göre, girişin geçerli olduğu ve 32 bit işaretli bir tamsayı taşmadığı garanti edilir.
Daniel Schepler


7

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

Bu, bir karakter dizisini (başlangıç ​​ve bitiş için bir çift işaretçi olarak belirtilen - yinelemeler çiftini kullanarak) gösteren ve sayıyı döndüren bir işlevdir. İşlevin giriş dizisini değiştirdiğini unutmayın.

(Bu #include<cstdlib>, işlevleri genel kapsamda da barındıran gcc / libstdc ++ davranışına dayanır . Kesinlikle standart uyumlu kod #include<stdlib.h>için, bir karakter daha kullanın).

Kısa açıklama: Kod önce karakterleri std::removefiltrelemek için kullanır '(ASCII 39). Daha sonra, strtol0 tabanıyla ondalık, sekizli ve onaltılık büyük harfleri zaten işleyecektir, bu nedenle denetlenecek diğer tek örnek bir satır başıdır 0bveya 0Böyleyse tabanı strtol2 olarak ayarlayın ve satır 2 karakterinden sonra ayrıştırmaya başlayın.

#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);}

Çevrimiçi deneyin.


Ceilingcat tarafından öneri ve ardından bazı golf daha 3 bayt kaydedildi.

Grastropner'ın önerileri nedeniyle 4 bayt kaydedildi.

Lucas'dan -2 bayt

-12 byte2m2



Incorporated, teşekkürler.
Daniel Schepler


Eğer geçersiz girdi tanımsız davranış ise, 1. karakterin 0taban 2 için olup olmadığını kontrol etmenize gerek yoktur
l4m2

yani 124
l4m2



4

R , 79 71 69 bayt

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

Çevrimiçi deneyin!

strtoitemel 2 dönüşümleri dışında kalan her şeyi yapar ve yok sayar ', bu yüzden sadece bunları düzeltmek için oldukça fazla bayt vardır.

-6 bayt için Aaron Hayman'a ve ilham verici -4 bayt için teşekkürler (ve sayılıyor!)

Tüm test durumlarını doğrulayın (eski sürüm)


baştaki "0" değeri etkilemeyeceğinden, sub("0b|B"ile değiştirerek bir bayt kaydedebilirsiniz sub("b|B". Yeniden adlandırarak başka bir tane alabilir miyimstrtoi
Aaron Hayman


1
@AaronHayman vay, daha önce hiç görmedim na.omit. Burada süper kullanışlı, ve ben biraz daha kapalı golf :-)
Giuseppe

1
Birincinin her başarısızlığının strtoibir ikili olduğunu varsayarsak , başka bir bayt kaydetmek substringyerine kullanabilirsiniz sub: Çevrimiçi deneyin!
Aaron Hayman

1
Biz ilk 2 karakter kapalı şerit olabilir @AaronHayman skullanarak subile yerine sub('..','',s)hangi başka bayt kısadır!
Giuseppe

4

05AB1E , 16 14 bayt

Grimy sayesinde 2 bayt kaydedildi

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

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

''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


Ve işte sahte 13 (tüm test vakalarını geçiyor, ancak başarısız oluyor 0010)
Grimmy

@Grimy: Teşekkürler! Soğuk kullanımı ï!
Emigna

4

Excel, 115 bayt

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

A1'den giriş yapın, bu formülü koyduğunuz her yere çıkış yapın. Dizi formülü, bu yüzden girmek için Ctrl+ Shift+ Enterkullanın.

Resimde görebileceğiniz birkaç test durumu ekledim - bazı erken girişimler, verilen tüm test durumlarını doğru bir şekilde ele aldı ancak satırlar 16 ve / veya 17 yanlış oldu.

görüntü tanımını buraya girin


Son iki kapanış parantezinin çıkarılması kurallarına aykırı mı ve “derleyici” nin (return veya tab'a basılması) sizin için hata düzeltmesi gerçeğinden faydalanın mı?
Lucas

Benim düşünceme göre, evet. Site görüş birliği olduğunu sanmıyorum. Parantezleri ekleyen Excel, başka bir dilin IDE'sindeki kod tamamlama özelliğinin eşdeğeri gibi geliyor ve bayt sayımı için göz ardı edilmesi gerekiyor. (Ancak, BASIC'de sessizce "YAZDIR" a genişletilse de "?" 1 bayt olarak sayılmalıdır, bu yüzden belki de tamamen tutarlı değilim.)
Sophia Lechner

3

x86-64 makine kodu, 44 bayt

(Aynı makine kodu, 32 bit modunda da çalışır.)

@Daniel Schepler'in cevabı bunun için bir başlangıç ​​noktasıydı, ancak bunun en az bir yeni algoritmik fikri var (sadece aynı fikrin daha iyi kullanılması değil): ASCII 'B'( 1000010) ve 'X'( 1011000) kodları, maskelemeden sonra 16 ve 2'yi veriyor0b0010010 .

Ondalık (sıfır olmayan baştaki haneyi) ve sekizli (sonradan '0'küçük olan 'B') dışladıktan sonra , yalnızca base = ayarlayabilir c & 0b0010010ve sayı döngüsüne atlayabiliriz.

X86-64 System V as ile Calble ile unsigned __int128 parse_cxx14_int(int dummy, const char*rsi); EDX dönüş değerini unsigned __int128sonucun yüksek yarısından çıkarın 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

Daniel'in versiyonuna göre değişen bloklar (çoğunlukla) diğer talimatlardan daha az girintilidir. Ayrıca ana döngünün alt kısmında koşullu dalı vardır. Bu, nötr bir değişim olarak ortaya çıktı çünkü hiçbir yol bunun üstüne dec ecx / loop .Lentrydüşemedi ve döngüye girme fikri, sekizlik oklusu farklı bir şekilde kullandıktan sonra bir kazanç olmadığı ortaya çıktı. Ama döngü içinde deyimsel formda döngü ile daha az talimat var, yapıdayken {} yapıyorum, o yüzden sakladım.

Daniel'in C ++ test donanımı, 32 bitlik yanıtıyla aynı çağrı kuralını kullanan bu kodla 64 bit modunda değişmeden çalışıyor.

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

Gerçek cevap olan makine kodu baytları da dahil olmak üzere sökme

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   

Daniel'in sürümündeki diğer değişiklikler arasında sub $16, %al, ayırıcıları algılamanın bir parçası olarak kullanmak subyerine rakam döngüsünün içinden tasarruf testetmek ve rakamlara karşılık alfabetik karakterleri kullanmak sayılabilir .

Daniel'in aksine , aşağıdaki her karakter '0'sadece bir ayırıcı olarak değerlendirilir '\''. (Hariç ' ': and $~32, %al/ jnzher iki döngüde de boşluğu bir satırın başında bir tamsayı ile test etmek için uygun olan bir sonlandırıcı olarak görür.)

%alDöngünün içinde değişiklik yapan her işlem , sonuç tarafından ayarlanmış dal alıcı bayraklara sahiptir ve her dal farklı bir yere gider (veya aşağıya düşer).


eax64 bitlik modda AIUI'nin küçük bir hedefi olan opcod'ların daha yüksek bitleri 0'a getireceği göz önüne alındığında bile ihtiyacınız var mı?
Daniel Schepler

@Daniel: 32-bitlik bir yazmaç yazma sıfıra 64-bit . 8 veya 16 bitlik bir kayıt defteri yazmak, davranışı diğer modlardan tutar: varolan değerde birleşir. AMD64 8 ve 16 bit kayıtları için sahte bağımlılığını gidermek yoktu ve değişmedi setcc r/m8içine setcc r/m32biz hala bir aptal 2-öğretim gerekir böylece, xor/ -Zero / set bayrakları setcc %al32/64-bit oluşturmak için sekans 0 veya 1 değişkeni, bayrak ayarından önce sıfırlanmış kaydı gerektirir. (Veya mov $0, %eaxbunun yerine kullanın veya movzxkritik yolda kullanın ).
Peter Cordes

1

Retina , 96 bayt

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*
.+;

Çevrimiçi deneyin! Bağlantı test paketi içerir. Açıklama:

T`'L`_l

S'yi silin 've her şeyi küçük harfe dönüştürün.

\B
:

Onaltılık basamaklara dönüştürülmesi gereken herhangi bir onaltılık basamak olduğundan, basamakları ayırın.

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

Sayının tabanını tanımlayın.

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

Karakterleri a-gsayılara dönüştürün 10-16.

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

Rakam listesinde baz dönüşüm yapın. $.($`*$1*_*$2*kısaltmasıdır $.($`*$1*_*$2*_)hangi çarpar $`ve $1birlikte ve ekler $2. ( $`dizginin ;yani tabandan önceki bölümüdür .)

.+;

Üssü silin.


Kodu açıklamak için
uyguladığınız


1

Perl 6 , 29 bayt

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

Çevrimiçi deneyin!

Perl 6, 0osekizlik için açık bir ön ek gerektirir ve benzeri büyük ön ekleri desteklemez 0X.

açıklama

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


1

Bash, 33 bayt

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

TIO

Zsh, 29 27 bayt

@GammaFunction sayesinde -2 bayt

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

TIO


Zeki! Ben düşünce olurdu setopt octalzeroesZsh için gerekli olacaktır.
GammaFunction

Sen ile Zsh 2 bayt kaydedebilirsiniz <<<$[...]yerineecho $[...]
GammaFunction

teşekkürler, yönlendirme ile zsh boş komutunun çıktısını gösterebileceğini bilmiyordum, zsh hakkında fazla bir şey bilmiyorum, çok daha iyi bash biliyorum
Nahuel Fouilleul


0

75

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

Bu ikili değişmezler için veya tek haneli rakam sınırlayıcıları için işe yaramaz görünmüyor.
Nick Matteo,

Kahretsin. Yakında düzelteceğim. Sınırlayıcılar hakkında tamamen unuttum
vityavv

0

JavaScript (ES6), 112 bayt

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 bayt

#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");}

Testlere gerek yok

g++C ++ 14 desteği ile kurulum gerektirir

Şimdi, açıklamalar:

Bir dosya yazar a.cpp, derlemek için GCC kullanır ve sayıyı veren bir dosya verir.




0

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

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"));}

Çevrimiçi deneyin!


Bazı kodlar yazdım. O zaman işe yaraması için hiçbir neden olmadığını farkettim, ama işe yarayacak gibi gözüküyor; 158 bayt .
zamirim monicareinstate

@someone, iğrenç, ama hoşuma gitti!
Johan du Toit

148 bayt birleştirerek popenvesystem . G ++ -x'ın stdin'den okumak için bir bayrağı var . Bu fopen olaylarından daha kısa olabilir, ama C'de stdin ile nasıl
çağırılacağını bilmiyorum

@someone, Her şey şimdi popenkomuta birleştirildi
Johan du Toit

printf-> echoiş gibi görünüyor. Yakında bash içinde programlama yapacaksın.
zamirim monicareinstate

0

Java, 158 154 bayt

Bu sadece aşılmayı bekliyor. Sadece bir şey çalışana kadar regexes çalışır ve varsayılan hex için
@ValueInk sayesinde -4 bayt

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);}

Çevrimiçi deneyin

ScriptEngine, 92 87 bayt kullanma

Değerlendirme treni geliyor. Teknik olarak bu meşaleyi JS'ye geçiriyor, bu yüzden benim ana sunumum değil.

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

TIO


Bazı hızlı regex optimizasyonları için [bBxX]ve düğmelerini kullanın 0[bB].+.
Value Ink 0

@ValueInk teşekkürler
Benjamin Urquhart

Yani en değil, bir tamsayı, bir Uzun, başlık açıkça Tamsayı, yöntem IEEE754 ondalık yer sistemine bağlı numarayı kaydetmek için kullanılan IEEE754 Yanlış haline gelebilir tek veya çift kesinlik söylüyor oluyor en.wikipedia.org/wiki/ IEEE_754 # Roundings_to_nearest , ayrıca 2 trilyondan daha yüksek bir sayıyı da destekler ( 0x9999999999)
Martin Barker

@MartinBarker'ın golf oynamak Longyerine kullanma izni var Integer. Ayrıca, haklıysanız, Python rekabet edemez, çünkü etkin bir şekilde isteğe bağlı hassas tam sayıları vardır. Ayrıca, bir longJava, 32 yerine 64 bit ile temsil edilen bir tamsayıdır. Ondalık basamak yoktur.
Benjamin Urquhart

Uzun olan, sadece bir tamsayı değil uzun süre kullanıyorsunuz ve golfün amaçları konusunda yanılıyorsunuz, The correct output never will exceed 2*10^9açıkça, uzun zamanın kendi başına kullanılamayacağı anlamına geliyor, çünkü bunu verebilirim 0x9999999999ve bir sayı üretecek 2'den yüksek * Bu numaraya belleğin sadece 32 bit tahsis etmişlerdir zaman senin bellek 32'den fazla bit kullanarak çünkü bir bellek taşması sorunu yaratacak C ++ oysa 10 ^ 9
Martin Barker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.