C ++ 14 정수 리터럴 구문 분석


27

http://en.cppreference.com/w/cpp/language/integer_literal 에 따르면 정수 리터럴은 decimal / hex / octal / binary 리터럴과 선택적 정수 접미사로 구성됩니다. 이 도전에 사용되지 않습니다.

십진 리터럴은 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) 입니다.

8 진 리터럴은 the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7)입니다.

16 진 리터럴은입니다 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)(대소 문자 구분 안함 abcdefx).

이진 리터럴은 the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1)입니다.

또한 '숫자 구분 기호로 선택적으로 s 가있을 수 있습니다 . 그들은 의미가 없으며 무시할 수 있습니다.

입력

C ++ 14 정수 리터럴 또는 해당 문자 코드의 배열을 나타내는 문자열입니다.

산출

선택적인 후행 줄 바꿈과 함께 밑 10의 입력 문자열로 표시되는 숫자입니다. 올바른 출력은 2 * 10 ^ 9를 초과하지 않습니다

우승 기준

GCC 기고자들은이를 위해 500 줄 이상의 코드가 필요 하므로 코드는 가능한 짧아야합니다!

테스트 사례 :

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 아니요; 어떻게 파싱을 기대 했습니까?
내 대명사는

1
C ++ 14로 함수를 작성하는 것이 부정적이라고 가정합니다. 컴파일러는 이미 자동으로 (내부적으로 500 줄 이상의 코드라도 ...)
Darrel Hoffman

5
@DarrelHoffman "C ++ 14의 함수"로는 문자열 입력을받지 않기 때문에 "C ++ 14의 함수"로는 할 수 없었습니다. C ++ 컴파일러를 호출하는 스크립트가있을 수 있습니다.
aschepler

2
문자열 0은 추가하기에 좋은 테스트 사례 일 수 있습니다 (최근 개정판 중 하나에 버그가 있음).
다니엘 셰플러

답변:



22

x86 (32 비트) 머신 코드 59 57 바이트

이 함수는 esinull로 끝나는 문자열을 가리키는 포인터로 값을 반환합니다 edx. (아래는 AT & T 구문의 GAS 입력입니다.)

        .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

그리고 바이트 수를 가진 디스 어셈블리-이번에는 Intel 형식을 선호합니다.

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    

그리고 당신이 그것을 시도하고 싶다면, 여기에 내가 연결 한 C ++ 테스트 드라이버 코드 (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;
}

Peter Cordes의 설명으로 인해 -1 바이트

10에서 8로 변경하기 위해 두 감소를 사용하도록 업데이트에서 -1 바이트


1
오버플로에 대한 테스트가 누락되었습니다 ... 너무 많은 숫자가 컴파일러에 의해보고됩니다.
Alexis Wilke

2
당신은 당신의 등록에 대한 사용 교환 수 rdx와 RBX ? Then you can use 1-byte 제로로 cdq`을 rdx에서 eax.
Peter Cordes

1
이것은 어셈블리의 바이트 수를 나열하거나 59 바이트의 x86 기계 코드로 레이블이 지정되어야합니다.
감자 44

2
@PeterCordes 감사합니다, 그것에 대해 몰랐습니다. (또한 다시 살펴보면 10에서 8로 기본을 변경하면 2 바이트 감소 명령에서 3 바이트 대신 2 바이트가 될 수 있음을
알았습니다

3
@AlexisWilke 또한 컴파일러가 수행 할 잘못된 형식 (예 : 지정된 기준 범위를 벗어난 숫자)도 테스트하지 않습니다. 그러나 문제 설명에 따르면, 입력은 유효하며 32 비트 부호있는 정수를 오버플로하지 않아야합니다.
Daniel Schepler

12

자바 스크립트 (Babel Node) , 26 바이트

lol x2

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

온라인으로 사용해보십시오!


4
이것은 이후 ES6에서 작동 BabelJS 독점하지 않습니다
Bassdrop Cumberwubwubwub

1
@BassdropCumberwubwubwub, 헤더는 아마도 TIO에서 복사되었습니다.
얽히고 설킨

니스, 나는 Number바이너리와 16 진수를 처리 하기 때문에 처음 사용하려고 했지만 분명히 8 진하지는 않았습니다Number("010") === 10
Carl Walsh

7

C ++ (gcc), 141 138 134 120 바이트

이것은 문자 배열 (반복자 이디엄 쌍을 사용하여 시작 및 끝에 대한 포인터 쌍으로 지정됨)을 가져 와서 숫자를 반환하는 함수입니다. 이 함수는 입력 배열을 변경합니다.

(이것은 #include<cstdlib>전역 범위에 함수를 배치하는 gcc / libstdc ++의 동작에 의존합니다 . 엄격하게 표준 호환 코드 #include<stdlib.h>의 경우 한 문자 이상의 비용으로 대체하십시오 .)

간단한 설명 :이 코드는 먼저 문자 std::remove를 필터링하는 데 사용 합니다 '(ASCII 39). 그런 다음 strtol밑이 0 인 10 진수, 8 진수 및 16 진수 경우를 이미 처리하므로 검사 할 다른 경우는 선행 0b또는0B 그렇지 않은 경우 밑 strtol을 2로 설정 하고 선행 2 문자 뒤에서 구문 분석을 시작하십시오.

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

온라인으로 사용해보십시오.


ceilingcat의 제안으로 인해 3 바이트를 절약하고 그에 따른 골프를 더했습니다.

grastropner의 제안으로 4 바이트를 절약했습니다.

Lucas가 -2 바이트

l4m2에 의해 -12 바이트



감사합니다.
Daniel Schepler


유효하지 않은 입력이 정의되지 않은 동작 인 경우, 첫 번째 문자가 0기본 2
l4m2에

그래서 124
l4m2



4

R , 79 71 69 바이트

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

온라인으로 사용해보십시오!

strtoi기본 2 변환을 제외한 모든 작업을 수행하고을 무시 '하므로 해당 항목을 수정하는 데 많은 바이트가 있습니다.

덕분에 아론 헤이 -6 바이트, 그리고 영감 -4 바이트 이상 (및 계산!)

모든 테스트 사례 확인 (이전 버전)


교체 바이트 저장할 수 있습니다 sub("0b|B"로를 sub("b|B"선도 "0"에 영향을주지 않습니다 값 때문에. 이름 strtoi
Aaron Hayman


1
@AaronHayman 와우, 나는 na.omit전에 본 적이 없다 . 여기에 매우 편리하고, 나는 조금 더 골프를 쳤다 :-)
주세페

1
첫 번째의 모든 실패가 strtoi바이너리 라고 가정 하면 다른 바이트를 저장 하는 substring대신 사용할 수 있습니다 sub. 온라인으로 시도하십시오!
Aaron Hayman

1
@AaronHayman 대신 다른 2 바이트 를 s사용하는 sub대신 처음 두 문자를 제거 할 수 있습니다 sub('..','',s)!
주세페

4

05AB1E , 16 14 바이트

Grimy 덕분에 2 바이트 절약

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

온라인으로 사용해보십시오! 또는 테스트 스위트

설명

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


그리고 여기 가짜 13이 있습니다 (모든 테스트 사례를 통과하지만 실패합니다 0010).
그리미

@ 그림 : 감사합니다! 의 멋진 사용 ï!
Emigna

4

엑셀, 115 바이트

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

A1에서 입력하고이 공식을 넣은 위치로 출력합니다. 배열 수식이므로 Ctrl+ Shift+ Enter를 사용 하여 입력하십시오.

이미지에서 볼 수있는 몇 가지 테스트 사례를 추가했습니다. 일부 초기 시도는 주어진 모든 테스트 사례를 올바르게 처리했지만 16 및 17 행이 잘못되었습니다.

여기에 이미지 설명을 입력하십시오


마지막 두 닫는 괄호를 생략하고 "컴파일러"(리턴 또는 탭 누름)가 오류를 정정한다는 사실을 이용하는 것이 규칙에 위배됩니까?
루카스

제 개인적으로는 그렇습니다. 사이트 합의가 있다고 생각하지 않습니다. 괄호를 추가하는 Excel은 다른 언어의 IDE에서 코드 완성 기능과 같은 느낌을 주므로 바이트 수를 무시해야합니다. (하지만 "?"는 BASIC에서 1 바이트로 계산해야한다고 생각하지만 "PRINT"로 자동 확장되므로 여기서는 완전히 일관성이 없을 수 있습니다.)
소피아 레크 너

3

x86-64 머신 코드, 44 바이트

동일한 머신 코드는 32 비트 모드에서도 작동합니다.

@Daniel Schepler의 대답 은 이것의 출발점이지만, 적어도 하나의 새로운 알고리즘 아이디어가 있습니다 (동일한 아이디어의 더 나은 골프뿐만 아니라) : ( ) 및 ( )에 대한 ASCII 코드는'B'1000010'X'10110000b0010010 .

따라서 10 진수 (0이 아닌 선행 자릿수)와 8 진수 (char after '0'is less than 'B')를 제외한 후 base =c & 0b0010010 하고 숫자 루프로 건너 뛸 .

x86-64 시스템 V를 사용하여 호출 가능 결과 unsigned __int128 parse_cxx14_int(int dummy, const char*rsi); 의 상위 절반에서 EDX 반환 값을 추출합니다 .unsigned __int128tmp>>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의 버전은 (대부분) 다른 명령보다 들여 쓰기가 적습니다. 또한 메인 루프는 하단에 조건부 분기가 있습니다. 어느 경로도 그것의 꼭대기에 빠질 수 없기 때문에 이것은 중립적 인 변화로 판명되었습니다.dec ecx / loop .Lentry 판명되었으며 루프에 들어가는 아이디어는 8 진수를 다르게 처리 한 후에 승리하지 않는 것으로 나타났습니다. 그러나 구조 중에는 관용적 형태의 루프가 {{} 인 루프를 사용하는 루프 내부에 명령이 적으므로 계속 유지했습니다.

Daniel의 C ++ 테스트 하니스는 64 비트 모드에서 32 비트 응답과 동일한 호출 규칙을 사용하는이 코드를 사용하여 변경없이 작동합니다.

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

실제 답변 인 머신 코드 바이트를 포함하여 분해

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 버전의 다른 변경 사항은 대신에 sub $16, %al더 많이 사용하여 숫자 루프 내부에서 저장하는 것을 포함합니다.subtest 구분 기호를 감지하는 문자 것과 알파벳 대 문자를 포함합니다.

다니엘과 달리 아래 의 모든 문자 '0'는 단지 구분 기호로 취급되지 않습니다 '\''. (제외 ' ': and $~32, %al/ jnz. 라인의 시작 정수와 테스트 가능성이 편리한 종결 등 모두 우리의 루프 취급 공간에서)

%al루프 내부 를 수정하는 모든 작업 에는 결과에 의해 설정된 분기 소비 플래그가 있으며 각 분기는 다른 위치로 이동합니다.


eax대상이 작은 64 비트 모드 opcode의 AIUI가 더 높은 비트를 0으로 재설정한다는 점에서 초기화가 필요 합니까?
Daniel Schepler

@Daniel : 32 비트 레지스터를 0으로 확장하면 64 비트로 확장됩니다 . 8 비트 또는 16 비트 레지스터를 작성하면 다른 모드에서 동작이 유지됩니다. 기존 값으로 병합합니다. AMD64 8, 16 비트 레지스터에 대한 거짓 의존성을 해결되지 않았고, 변하지 않았다 setcc r/m8setcc r/m32우리는 아직도 바보 2 명령어가 필요하므로 xor/ -zero / 세트 플래그 setcc %al32 / 64 비트 만드는 순서는 0 또는 1 변수를 설정하고 플래그 설정 전에 0으로 된 레지스터가 필요합니다. 또는 mov $0, %eax대신 사용 하거나 movzx중요 경로에서 사용 하십시오.
Peter Cordes

1

레티 나 , 96 바이트

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

온라인으로 사용해보십시오! 링크에는 테스트 스위트가 포함되어 있습니다. 설명:

T`'L`_l

를 삭제 '하고 모든 것을 소문자로 변환하십시오.

\B
:

16 진수는 10 진수로 변환해야하므로 숫자를 구분하십시오.

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

숫자의 밑을 식별하십시오.

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

문자 a-g를 숫자로 변환하십시오 10-16.

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

자릿수 목록에서 기본 변환을 수행하십시오. 곱하기 와 함께 더하기에 $.($`*$1*_*$2*짧습니다 . ( 즉, 밑줄 앞의 문자열 부분입니다 .)$.($`*$1*_*$2*_)$`$1$2$`;

.+;

베이스를 삭제하십시오.


코드를 설명하기 위해 사용한 리터럴 프로그래밍 방식에 감사드립니다. :-)
grooveplex


1

펄 6 , 29 바이트

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

온라인으로 사용해보십시오!

Perl 6에는 0o8 진에 대한 명시적인 접두사 가 필요하며 와 같은 대문자 접두사는 지원하지 않습니다 0X.

설명

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

1

옥타브 , 29 21 20 바이트

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

온라인으로 사용해보십시오!

@TomCarpenter 덕분에 -8 바이트


22 바이트 :@(x)str2num(x(x~="'"))
Tom Carpenter

21 바이트가됩니다 :@(x)str2num(x(x~=39))
Tom Carpenter

진수는 예를 들어 (TIO에 적어도), 작동 표시되지 않습니다 f=("077")반환 ans = 77OP의 테스트 케이스의대로, 63 일 또는시기를 f=("012345")대신 5349을 반환해야하지만ans = 12345
brhfl

1

배쉬, 33 바이트

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

TIO

Zsh, 29 27 바이트

@GammaFunction 덕분에 -2 바이트

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

TIO


영리한! setopt octalzeroesZsh에 필요 하다고 생각했을 것입니다.
GammaFunction

<<<$[...]echo $[...]
GammaFunction

덕분에, 나는 훨씬 더 떠들썩한 파티를 알고, 출력을 표시 할 수 리디렉션이 zsh을 빈 명령은, 내가 많이 zsh을 모르는 몰랐어요
나우 Fouilleul

나는 bash가 자동으로 0에서 8 진수로 숫자를 해석하고 날짜 / 시간에서 제거해야한다는 것을 알고 있었다
Nahuel Fouilleul

0

간다, 75

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

이진 리터럴이나 작은 따옴표 숫자 구분 기호에는 작동하지 않는 것 같습니다.
Nick Matteo

젠장. 곧 고칠 게요. 분리 문자를 완전히 잊어 버렸습니다
vityavv

0

자바 스크립트 (ES6), 112 바이트

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 바이트

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

테스트 불필요

g++C ++ 14 지원 설치 필요

이제 설명 :

이라는 파일을 작성하고 a.cppGCC를 사용하여 컴파일하고 숫자를 출력하는 파일을 제공합니다.




0

C (gcc) / Bash / C ++, 118 바이트

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

온라인으로 사용해보십시오!


나는 몇 가지 코드를 골프했다. 그런 다음 나는 그것이 작동 할 이유가 전혀 없다는 것을 깨달았습니다. 158 바이트 .
내 대명사는 monicareinstate

@ 누군가, 그것은 불쾌하지만, 나는 그것을 좋아합니다!
Johan du Toit

병합하여 148 바이트 popensystem . G ++에는 -xstdin에서 읽을 플래그가 있습니다. 즉, fopen을 물건보다 짧은 수 있습니다,하지만 난 C에서 stdin을 함께 호출하는 방법을 모른다
내 대명사 monicareinstate은

@someone, 이제 모든 것이 popen명령 으로 병합되었습니다
Johan du Toit

printf-> echo작동하는 것 같습니다. 곧 bash로 프로그래밍 할 것입니다.
내 대명사는 monicareinstate

0

자바, 158 바이트

이것은 단지 outgolfed 기다리고 있습니다. 무언가가 작동하고 기본적으로 16 진수가 될 때까지 정규 표현식을 시도하십시오.
@ValueInk 덕분에 -4 바이트

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

온라인으로 사용해보십시오

ScriptEngine 사용, 92 87 바이트

Eval 열차가 통과합니다. 기술적으로 이것은 횃불을 JS로 전달하므로 내 주요 제출물이 아닙니다.

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

TIO


사용 [bBxX]0[bB].+몇 가지 빠른 정규식 최적화합니다.
밸류 잉크

@ValueInk 감사
Benjamin Urquhart

즉, 정수가 아니라 정수입니다. 제목에 따르면 정수 또는 배정 밀도 IEEE754는 IEEE754의 소수점 이하 자릿수 시스템으로 인해 숫자를 저장하는 방법으로 인해 잘못 될 수 있다고 Integer는 명확하게 말합니다. en.wikipedia.org/wiki/ IEEE_754 # Roundings_to_nearest , 2 조 ( 0x9999999999) 보다 큰 숫자도 지원
Martin Barker

@MartinBarker 골프 목적 Long대신에 사용할 수 있습니다 Integer. 또한, 만약 당신이 맞다면, 파이썬은 효과적으로 임의의 정수를 가지고 있기 때문에 경쟁 할 수 없습니다. 또한 longJava 에서 a 는 32 대신 64 비트로 표시되는 정수입니다. 소수점 이하 자릿수가 없습니다.
벤자민 Urquhart

Long은 정수가 아닌 long을 사용하고 있었고 골프 목적에 대해 틀렸다는 The correct output never will exceed 2*10^9것을 분명히 나타냅니다. 내가 줄 수 있기 때문에 long을 자체적으로 사용할 수 없으며 0x9999999999숫자를 생성합니다. 2 * 10 ^ 9보다 높지만 C ++에서는이 숫자에 32 비트의 메모리 만 할당했을 때 메모리에서 32 비트 이상을 사용하기 때문에 메모리 오버 플로우 문제가 발생합니다
Martin Barker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.