Phân tích cú pháp số nguyên C ++ 14


27

Theo http://en.cppreference.com/w/cpp/lingu/integer_literal , các số nguyên bao gồm một chữ số thập phân / hex / bát phân / nhị phân và một hậu tố số nguyên tùy chọn, rõ ràng là không cần thiết, lãng phí các byte quý giá và không được sử dụng trong thử thách này.

Một chữ thập phân là 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).

Một chữ bát phân là the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7).

Một chữ thập lục phân là 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)(lưu ý trường hợp không nhạy cảm abcdefx).

Một chữ nhị phân là the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1).

Ngoài ra, có thể có một số tùy chọn là 'dấu phân cách chữ số. Chúng không có ý nghĩa và có thể bỏ qua.

Đầu vào

Một chuỗi đại diện cho một số nguyên C ++ 14 hoặc một mảng các mã của nó.

Đầu ra

Số được biểu thị bằng chuỗi đầu vào trong cơ sở 10, với một dòng mới tùy chọn. Đầu ra chính xác sẽ không bao giờ vượt quá 2 * 10 ^ 9

Tiêu chí chiến thắng

Những người đóng góp GCC cần hơn 500 dòng mã để làm điều này, do đó mã của chúng tôi phải càng ngắn càng tốt!

Các trường hợp thử nghiệm:

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 Không; Làm thế nào mà bạn mong đợi được phân tích cú pháp?
đại từ của tôi là monicareinstate

1
Tôi giả sử chỉ đơn giản là viết một hàm trong C ++ 14 sẽ là gian lận, phải không? Vì trình biên dịch đã tự động thực hiện (ngay cả khi bên trong nó có hơn 500 dòng mã ...)
Darrel Hoffman

5
@DarrelHoffman Bạn không thể chỉ làm điều đó với "một chức năng trong C ++ 14", vì điều đó sẽ không có đầu vào chuỗi. Có thể với một số tập lệnh gọi trình biên dịch C ++.
aschepler

2
Chuỗi 0có thể là một trường hợp thử nghiệm tốt để thêm (nó đã tiết lộ một lỗi trong một trong những sửa đổi gần đây của tôi).
Daniel Schepler

Câu trả lời:



22

mã máy x86 (32-bit), 59 57 byte

Hàm này lấy esinhư một con trỏ tới một chuỗi kết thúc null và trả về giá trị trong edx. (Liệt kê bên dưới là đầu vào GAS theo cú pháp 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

Và một sự phân tách với số byte - trong định dạng Intel lần này, trong trường hợp bạn thích cái đó.

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    

Và trong trường hợp bạn muốn dùng thử, đây là mã trình điều khiển thử nghiệm C ++ mà tôi đã liên kết với nó (bao gồm cả đặc tả quy ước gọi trong cú pháp asm GCC):

#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 do nhận xét của Peter Cordes

-1 byte từ việc cập nhật để sử dụng hai lần giảm để thay đổi 10 thành 8


1
Chỉ bạn đang thiếu các bài kiểm tra cho tràn ... Số lượng quá lớn được trình biên dịch báo cáo.
Alexis Wilke

2
Bạn có thể trao đổi sử dụng đăng ký của bạn cho rdxvà rbx ? Then you can use 1-byte cdq` thành không rdxtừ eax.
Peter Cordes

1
Đây phải là danh sách số byte của tổ hợp của bạn hoặc được gắn nhãn là 59 byte của mã máy x86.
Khoai tây44

2
@PeterCordes Cảm ơn, không biết về điều đó. (Ngoài ra, khi nhìn lại, tôi nhận thấy rằng việc thay đổi cơ sở từ 10 thành 8 có thể là 2 byte - từ hai hướng dẫn giảm dần - thay vì 3 byte.)
Daniel Schepler

3
@AlexisWilke Nó cũng không kiểm tra định dạng không hợp lệ (ví dụ: các chữ số nằm ngoài phạm vi của cơ sở đã cho) mà trình biên dịch cũng sẽ làm. Nhưng theo báo cáo vấn đề, đầu vào được đảm bảo là hợp lệ và không vượt quá số nguyên có chữ ký 32 bit.
Daniel Schepler

12

JavaScript (Nút Babel) , 26 byte

lol x2

_=>eval(_.split`'`.join``)

Hãy thử trực tuyến!


4
Đây không phải là độc quyền của BabelJS, nó hoạt động từ ES6 trở đi
Bassdrop Cumberwubwubwub

1
@BassdropCumberwubwubwub, tiêu đề có thể được sao chép từ TIO.
Xù xì

Thật tuyệt, lần đầu tiên tôi đã thử sử dụng Numbervì nó xử lý nhị phân và hex, nhưng dường như không phải là bát phânNumber("010") === 10
Carl Walsh

7

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

Đây là một hàm lấy một mảng các ký tự (được chỉ định là một cặp con trỏ đến đầu và cuối - sử dụng cặp thành ngữ lặp) và trả về số. Lưu ý rằng hàm làm thay đổi mảng đầu vào.

(Điều này không phụ thuộc vào hành vi của gcc / libstdc ++, #include<cstdlib>cũng đặt các hàm trong phạm vi toàn cầu. Đối với mã tuân thủ tiêu chuẩn nghiêm ngặt, thay thế bằng #include<stdlib.h>chi phí thêm một ký tự.)

Mô tả ngắn gọn: Mã đầu tiên sử dụng std::removeđể lọc các 'ký tự (ASCII 39). Sau đó, strtolvới cơ sở 0 sẽ xử lý các trường hợp thập phân, bát phân và thập lục phân, do đó, trường hợp khác để kiểm tra là dẫn đầu 0bhoặc 0Bvà nếu vậy, đặt cơ sở strtolthành 2 và bắt đầu phân tích cú pháp sau 2 ký tự đầu.

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

Hãy thử trực tuyến.


Đã lưu 3 byte do đề xuất của trần nhà và một số môn đánh gôn tiếp theo.

Đã lưu 4 byte do đề xuất của grastropner.

-2 byte bởi Lucas

-12 byte bằng l4m2



Kết hợp, cảm ơn.
Daniel Schepler


Nếu đầu vào không hợp lệ là hành vi không xác định, không cần kiểm tra nếu char thứ 1 0dành cho cơ sở 2
l4m2

so 124
l4m2



4

R , 79 71 69 byte

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

Hãy thử trực tuyến!

strtoithực hiện mọi thứ ngoại trừ chuyển đổi cơ sở 2 và bỏ qua ', vì vậy có khá nhiều byte chỉ để sửa những thứ đó.

Cảm ơn Aaron Hayman cho -6 byte và truyền cảm hứng cho -4 byte nữa (và còn hơn thế nữa!)

Xác minh tất cả các trường hợp thử nghiệm (phiên bản cũ)


có thể lưu một byte thay thế sub("0b|B"bằng sub("b|B", vì "0" hàng đầu sẽ không ảnh hưởng đến giá trị. Có thể lấy cái khác bằng cách đổi tênstrtoi
Aaron Hayman


1
@AaronHayman wow, tôi chưa từng thấy na.omittrước đây. Siêu tiện dụng ở đây, và tôi đã chơi gôn thêm một chút :-)
Giuseppe

1
Nếu chúng tôi cho rằng mọi thất bại của lần đầu tiên strtoilà nhị phân, bạn có thể sử dụng substringthay vì sublưu một byte khác: Hãy thử trực tuyến!
Aaron Hayman

1
@AaronHayman chúng ta có thể loại bỏ 2 ký tự đầu tiên ssử dụng subthay vào sub('..','',s)đó là một byte khác ngắn hơn!
Giuseppe

4

05AB1E , 16 14 byte

Đã lưu 2 byte nhờ Grimy

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

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

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


Và đây là số 13 giả (vượt qua tất cả các trường hợp thử nghiệm, nhưng không thành công, ví dụ 0010).
Grimmy

@Grimy: Cảm ơn! Sử dụng tuyệt vời ï!
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))

Nhập từ A1, đầu ra đến bất cứ nơi nào bạn đặt công thức này. Công thức mảng, vì vậy sử dụng Ctrl+ Shift+ Enterđể nhập nó.

Tôi đã thêm một vài trường hợp thử nghiệm mà bạn có thể nhìn thấy trong hình ảnh - một số lần thử đầu tiên đã xử lý chính xác tất cả các trường hợp thử nghiệm đã đưa ra nhưng có hàng 16 và / hoặc 17 sai.

nhập mô tả hình ảnh ở đây


Có phải là trái với quy tắc bỏ qua hai dấu ngoặc đơn đóng cuối cùng và lợi dụng thực tế là trình biên dịch mã hóa ((trả về hoặc tab) sẽ sửa lỗi cho bạn không?
Lucas

Theo ý kiến ​​cá nhân của tôi, vâng. Tôi không nghĩ rằng có một sự đồng thuận trang web. Excel thêm dấu ngoặc đơn có cảm giác tương đương với tính năng hoàn tất mã trong IDE của ngôn ngữ khác, nên bỏ qua việc đếm byte. (Nhưng, tôi nghĩ "?" Nên được tính là 1 byte trong BASIC mặc dù nó sẽ được mở rộng âm thầm thành "IN" để có thể tôi không hoàn toàn nhất quán ở đây).
Sophia Lechner

3

mã máy x86-64, 44 byte

(Mã máy tương tự cũng hoạt động ở chế độ 32 bit.)

Câu trả lời của @Daniel Schepler là điểm khởi đầu cho điều này, nhưng điều này có ít nhất một ý tưởng thuật toán mới (không chỉ là chơi golf tốt hơn cùng ý tưởng): Mã ASCII cho 'B'( 1000010) và 'X'( 1011000) đưa ra 16 và 2 sau khi che dấu0b0010010 .

Vì vậy, sau khi loại trừ số thập phân (chữ số hàng đầu khác không) và số bát phân (char sau '0'nhỏ hơn 'B'), chúng ta chỉ có thể đặt cơ sở =c & 0b0010010 và nhảy vào vòng lặp chữ số.

Có thể gọi với x86-64 System V dưới dạng unsigned __int128 parse_cxx14_int(int dummy, const char*rsi); Trích xuất giá trị trả về EDX từ nửa cao của unsigned __int128kết quả với 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

Các khối thay đổi so với phiên bản của Daniel (hầu hết) được thụt lề ít hơn so với hướng dẫn khác. Ngoài ra vòng lặp chính có nhánh có điều kiện ở phía dưới. Điều này hóa ra là một sự thay đổi trung lập vì không con đường nào có thể rơi vào đỉnh của nó, vàdec ecx / loop .Lentry ý tưởng để vào vòng lặp hóa ra không phải là một chiến thắng sau khi xử lý bát phân khác nhau. Nhưng nó có ít hướng dẫn hơn trong vòng lặp với vòng lặp ở dạng thành ngữ làm {} trong khi cấu trúc, vì vậy tôi đã giữ nó.

Khai thác kiểm tra C ++ của Daniel hoạt động không thay đổi trong chế độ 64 bit với mã này, sử dụng quy ước gọi tương tự như câu trả lời 32 bit của anh ta.

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

Tháo gỡ, bao gồm các byte mã máy là câu trả lời thực tế

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   

Các thay đổi khác từ phiên bản của Daniel bao gồm lưu sub $16, %altừ bên trong vòng lặp số, bằng cách sử dụng nhiều hơn subthay vìtest là một phần của việc phát hiện dấu phân cách và chữ số so với các ký tự chữ cái.

Không giống như Daniel, mọi nhân vật dưới đây '0'đều được coi là một dấu tách, không chỉ '\''. (Ngoại trừ ' ': and $~32, %al/ jnztrong cả hai vòng lặp của chúng tôi coi không gian là dấu kết thúc, có thể thuận tiện cho việc kiểm tra với một số nguyên ở đầu dòng.)

Mỗi hoạt động sửa đổi %albên trong vòng lặp đều có một cờ tiêu thụ nhánh được đặt theo kết quả và mỗi nhánh đi (hoặc rơi qua) đến một vị trí khác nhau.


Bạn thậm chí có cần khởi tạo eaxcho AIUI ở chế độ 64 bit opcodes với đích nhỏ sẽ đặt lại các bit cao hơn về 0 không?
Daniel Schepler

@Daniel: viết một thanh ghi 32 bit zero - mở rộng thành 64 bit . Viết một thanh ghi 8 hoặc 16 bit giữ cho hành vi từ các chế độ khác: hợp nhất vào giá trị hiện có. AMD64 đã không sửa lỗi phụ thuộc sai cho các thanh ghi 8 và 16 bit và không thay đổi setcc r/m8thành setcc r/m32, vì vậy chúng tôi vẫn cần một xorcờ 2 -zero / set cờ / setcc %alchuỗi ngu ngốc để tạo ra 32/64-bit 0 hoặc 1 biến và nó cần thanh ghi zeroed trước khi cài đặt cờ. (Hoặc sử dụng mov $0, %eaxthay thế, hoặc sử dụng movzxtrên đường dẫn quan trọng).
Peter Cordes

1

Võng mạc , 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*
.+;

Hãy thử trực tuyến! Liên kết bao gồm bộ kiểm tra. Giải trình:

T`'L`_l

Xóa 's và chuyển đổi mọi thứ thành chữ thường.

\B
:

Tách các chữ số, vì bất kỳ chữ số hex nào cũng cần được chuyển đổi thành số thập phân.

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

Xác định cơ sở của số.

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

Chuyển đổi các ký tự a-gthành số 10-16.

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

Thực hiện chuyển đổi cơ sở trên danh sách các chữ số. $.($`*$1*_*$2*là viết tắt của $.($`*$1*_*$2*_)bội số $`$1cùng nhau và thêm $2. ( $`là một phần của chuỗi trước ;nghĩa là cơ sở.)

.+;

Xóa cơ sở.


Tôi đánh giá cao cách tiếp cận lập trình theo nghĩa đen mà bạn đã thực hiện để giải thích mã :-)
grooveplex


1

Perl 6 , 29 byte

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

Hãy thử trực tuyến!

Perl 6 yêu cầu một 0otiền tố rõ ràng cho bát phân và không hỗ trợ các tiền tố chữ hoa như 0X.

Giải trình

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

1

Tháng Mười , 29 21 20 byte

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

Hãy thử trực tuyến!

-8 byte nhờ @TomCarpenter


Đối với 22 byte:@(x)str2num(x(x~="'"))
Tom Carpenter

Mà trở thành 21 byte: @(x)str2num(x(x~=39))
Tom Carpenter

Octal dường như không hoạt động (ít nhất là trên TIO) ... ví dụ, f=("077")trả về ans = 77khi nó phải là 63. Hoặc, như trong trường hợp thử nghiệm trong OP f=("012345")sẽ trả lại 5349 nhưng thay vào đóans = 12345
brhfl

1

Bash, 33 byte

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

TIO

Zsh, 29 27 byte

-2 byte nhờ @GammaFunction

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

TIO


Tài giỏi! Tôi đã nghĩ setopt octalzeroessẽ cần thiết cho Zsh.
GammaFeft

Bạn có thể lưu 2 byte trong Zsh <<<$[...]thay vìecho $[...]
GammaFunction

cảm ơn, tôi không biết rằng lệnh trống zsh với chuyển hướng có thể hiển thị đầu ra, tôi không biết nhiều về zsh, tôi biết bash tốt hơn nhiều
Nahuel Fouilleul

tôi biết rằng bash tự động giải thích các số có từ 0 đến bát phân, và phải được xóa ví dụ theo ngày / giờ
Nahuel Fouilleul

0

Đi, 75

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

Điều này dường như không hoạt động đối với các chữ nhị phân, cũng không cho các dấu phân cách chữ số đơn.
Nick Matteo

Chết tiệt. Tôi sẽ sửa nó sớm thôi. Hoàn toàn quên về các dấu phân cách
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 byte

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

Không cần xét nghiệm

Yêu cầu cài đặt g++với hỗ trợ C ++ 14

Bây giờ, giải thích:

Nó viết một tệp có tên a.cpp, sử dụng GCC để biên dịch nó và đưa ra một tệp xuất ra số




0

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

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

Hãy thử trực tuyến!


Tôi đã đánh golf một số mã. Sau đó tôi đã nhận ra không có lý do nào để nó hoạt động, nhưng nó dường như hoạt động; 158 byte .
đại từ của tôi là monicareinstate

@someone, thật khó chịu, nhưng tôi thích nó!
Johan du Toit

148 byte bằng cách hợp nhất popensystem . G ++ có một lá cờ, tôi nghĩ -x, để đọc từ stdin. Nó có thể ngắn hơn công cụ fopen, nhưng tôi không biết cách gọi với stdin trong C.
đại từ của tôi là monicareinstate

@someone, Mọi thứ giờ đã được hợp nhất vào popenlệnh
Johan du Toit

printf-> echodường như làm việc. Bạn sẽ sớm lập trình trong bash.
đại từ của tôi là monicareinstate

0

Java, 158 154 byte

Điều này chỉ chờ đợi để được vượt qua. Chỉ cần thử regexes cho đến khi một cái gì đó hoạt động và mặc định là hex.
-4 byte nhờ @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);}

Dùng thử trực tuyến

Sử dụng ScriptEngine, 92 87 byte

Tàu Eval đi qua. Về mặt kỹ thuật, điều này đang truyền ngọn đuốc cho JS, vì vậy đây không phải là bài nộp chính của tôi.

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

TIO


Sử dụng [bBxX]0[bB].+cho một số tối ưu hóa regex nhanh chóng.
Giá trị mực

@ValueInk cảm ơn
Benjamin Urquhart

Đó không phải là Số nguyên mà là Dài, tiêu đề nói rõ Integer, độ chính xác một hoặc hai lần có thể trở thành không chính xác do phương pháp được sử dụng để lưu số khi do hệ thống vị trí thập phân trong IEEE754 en.wikipedia.org/wiki/ IEEE_754 # Roundings_to_nearest , nó cũng hỗ trợ một con số cao hơn 2 nghìn tỷ ( 0x9999999999)
Martin Barker

@MartinBarker nó được phép sử dụng Longthay vì Integercho mục đích chơi gôn. Ngoài ra, nếu bạn đúng, Python không thể cạnh tranh vì nó có các số nguyên chính xác tùy ý. Ngoài ra, a longtrong Java là một số nguyên được biểu thị bằng 64 bit thay vì 32. Không có vị trí thập phân.
Benjamin Urquhart

Điều dài là bạn đang sử dụng lâu không phải là số nguyên và bạn đã sai về mục đích chơi gôn, The correct output never will exceed 2*10^9nó nói rõ rằng điều đó có nghĩa là không thể tự mình sử dụng lâu vì tôi có thể cung cấp cho nó 0x9999999999và nó sẽ tạo ra một số cao hơn 2 * 10 ^ 9 trong khi C ++, nó sẽ tạo ra sự cố tràn bộ nhớ vì bạn sử dụng hơn 32 bit trên bộ nhớ khi bạn chỉ cấp 32 bit bộ nhớ cho số này
Martin Barker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.