Проаналізуйте цілочислове значення C ++ 14


27

Згідно з http://en.cppreference.com/w/cpp/language/integer_literal , цілі літерали складаються з десяткових / шестигранних / восьмеричних / двійкових літералів та необов'язкового цілого суфікса, що, очевидно, зовсім непотрібно, витрачає дорогоцінні байти і є не використовується в цьому виклику.

Десяткова буквальна є 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).

Вісімковий буквал - це the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7).

Шістнадцятковий буквал є 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 Ні; як ви очікували, що це буде розібрано?
мій займенник monicareinstate

1
Я припускаю, що просто написання функції на C ++ 14 було б обманом, правда? Оскільки компілятор вже робить це автоматично (навіть якщо це внутрішньо 500+ рядків коду ...)
Даррел Гофман

5
@DarrelHoffman Ти не можеш просто зробити це з "функцією в C ++ 14", оскільки це не буде приймати рядок. Можливо, з якимсь сценарієм, який викликає компілятор C ++.
асчеплер

2
Рядок 0може бути хорошим тестовим випадком (він виявив помилку в одній з моїх останніх версій).
Даніель Шеплер

Відповіді:



22

x86 (32-бітний) код машини, 59 57 байт

Ця функція приймає esiвказівник на рядок з нульовим завершенням і повертає значення в edx. (Перелік нижче - введення GAS у синтаксисі 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

І розбирання з кількістю байтів - цього разу у форматі 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 ++, який я пов’язав з ним (включаючи специфікацію виклику конвенції у синтаксисі 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 байт через коментар Пітера Кордеса

-1 байт від оновлення, щоб використовувати два декрети для зміни 10 на 8


1
Тільки вам не вистачає тестів на переповнення ... Занадто велика кількість повідомляється компіляторами.
Алексіс Вільке

2
Чи можете ви поміняти використання свого реєстру на rdxrbx ? Then you can use 1-byte cdq` на нуль rdxз eax.
Пітер Кордес

1
Це має бути або перелічити кількість байтів вашої збірки, або бути позначено як 59 байт машинного коду x86.
Картопля44

2
@PeterCordes Спасибі, не знав про це. (Також, переглянувши його ще раз, я помітив, що зміна бази з 10 на 8 може бути на 2 байти - з двох інструкцій декременту - замість 3 байт.)
Даніель Шеплер

3
@AlexisWilke Він також не перевіряє недійсний формат (наприклад, цифри поза діапазоном даної бази), що також роблять компілятори. Але згідно з постановкою проблеми, вхід гарантовано є дійсним і не переповнює 32-бітове ціле число, підписане.
Даніель Шеплер

12

JavaScript (Babel Node) , 26 байт

lol x2

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

Спробуйте в Інтернеті!


4
Це не ексклюзивний BabelJS, він працює від ES6 і далі
Bassdrop Cumberwubwubwub

1
@BassdropCumberwubwwwub, заголовок, ймовірно, скопійовано з TIO.
Кудлатий

Приємно, я спершу спробував використати, Numberоскільки він обробляє двійкові та шістнадцяткові, але, мабуть, не вісімковийNumber("010") === 10
Карл Уолш

7

C ++ (gcc), 141 138 134 120 байт

Це функція, яка приймає масив символів (вказаний як пара покажчиків на початок і кінець - за допомогою ідіоми пари ітераторів) і повертає число. Зауважте, що функція мутує вхідний масив.

(Це покладається на поведінку gcc / libstdc ++, що #include<cstdlib>також розміщує функції в глобальному масштабі. Для суворо стандартного коду, замініть #include<stdlib.h>на вартість ще одного символу.)

Короткий опис: Код спочатку використовується std::removeдля фільтрації 'символів (ASCII 39). Тоді strtolз базою 0 вже буде оброблятися десятковий, вісімковий і шістнадцятковий випадки, тому єдиний інший випадок, який потрібно перевірити, - це провідний 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);}

Спробуйте в Інтернеті.


Збережено 3 байти за рахунок пропозицій стельової кішки та ще декількох гольфів, які послідували за цим.

Збережено 4 байти завдяки пропозиціям грастропнера.

-2 байти від Лукаса

-12 байт на l4м2



Включено, дякую.
Даніель Шеплер


Якщо недійсне введення не визначено, не потрібно перевіряти, чи є 0
перша таблиця

так 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
Аарон Гейман


1
@AaronHayman Нічого цього не бачив na.omit. Тут дуже зручно, і я гольфу трохи більше :-)
Джузеппе

1
Якщо ми припускаємо, що кожен помилка першого strtoiє двійковим, ви можете використовувати substringзамість того, subщоб зберегти ще один байт: Спробуйте це в Інтернеті!
Аарон Гейман

1
@AaronHayman ми можемо здирати перші 2 символи , sвикористовуючи subзамість цьогоsub('..','',s) що інший байт коротше!
Джузеппе

4

05AB1E , 16 14 байт

Збережено 2 байти завдяки Grimy

''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).
Гримі

@Grimy: Дякую! Класне використання ï!
Емінья

4

Excel, 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 неправильно.

введіть тут опис зображення


Чи суперечить правилам опускати дві заключні дужки та скористатися тим, що "компілятор" (натискання клавіші return або вкладка) для вас виправить помилки?
Лукас

На мою особисту думку, так. Я не думаю, що існує консенсус щодо сайту. Додавання дужок у Excel вважається еквівалентом функції заповнення коду в IDE іншої мови, яку слід ігнорувати для підрахунку байтів. (Але я думаю, що "?" Слід вважати 1 байтом у BASIC, хоча це буде мовчки розширено до "PRINT", тож, можливо, я тут не зовсім послідовний).
Софія Лехнер

3

машинний код x86-64, 44 байти

(Цей же машинний код працює і в 32-бітному режимі.)

Відповідь Даніеля Шеплера стала відправною точкою для цього, але в цьому є принаймні одна нова алгоритмічна ідея (не просто краща гольф однакової ідеї): коди ASCII для 'B'( 1000010) і 'X'( 1011000) дають 16 і 2 після маскування0b0010010 .

Отже, виключаючи десятковий (ненульовий провідний розряд) і восьмеричний (char після '0'- менше 'B'), ми можемо просто встановити base = c & 0b0010010і перейти в цикл цифр.

Викликається з системою x86-64 як V unsigned __int128 parse_cxx14_int(int dummy, const char*rsi); Витягувати значення повернення EDX з високої половини unsigned __int128результату 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

Змінені блоки проти версії Даніеля (здебільшого) з відступом менше, ніж інші інструкції. Також основна петля має внизу свою умовну гілку. Це виявилося нейтральною зміною, тому що жодна стежка не могла потрапити у верхню частину її, іdec ecx / loop .Lentry ідея ввести цикл виявилась не виграшною, якщо по-іншому поправляти восьмери. Але в ньому є менша кількість інструкцій всередині циклу з циклом в ідіоматичній формі do {} в той час як структура, тому я зберігав її.

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   

Інші зміни у версії Даніеля включають в себе збереження sub $16, %alвнутрішньої цифри, використовуючи більше, subа неtest як частину виявлення роздільників та цифр проти буквених символів.

На відміну від Даніеля, кожен персонаж нижче '0'розглядається як роздільник, а не просто '\''. (За винятком ' ': and $~32, %al/ jnzв обох наших циклах трактується простір як термінатор, що, можливо, зручно для тестування з цілим числом на початку рядка.)

Кожна операція, яка змінюється %alвсередині циклу, має прапори, що споживають гілки, встановлені результатом, і кожна гілка переходить (або провалюється) у інше місце.


Вам навіть потрібна ініціалізація, eaxвраховуючи, що AIUI в 64-бітовому режимі опкоди з малим призначенням скинуть більш високі біти до 0?
Даніель Шеплер

@Daniel: запис 32-розрядного регістра з нульовим розширенням до 64-бітного . Написання 8 або 16-бітного реєстру стримує поведінку в інших режимах: злиття з існуючим значенням. AMD64 не виправити помилкову залежність для 8 і 16-бітових регістрів, і не змінився setcc r/m8в setcc r/m32, так що ми по- , як і раніше потрібні тупі 2-інструкція xor-нуль / набір прапорів / setcc %alпослідовність для створення 32/64-біт 0 або 1 змінна, і їй потрібен нульовий регістр перед встановленням прапора. (Або використовувати mov $0, %eaxзамість цього, або використовувати movzxна критичному шляху).
Пітер Кордес

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

Видаліть 's і перетворіть все в малі регістри.

\B
:

Розділіть цифри, оскільки будь-які шістнадцяткові цифри потрібно перетворити на десяткові.

^
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

J , 48 байт

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

Спробуйте в Інтернеті!

Евал після підстановки рядків.

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

Здається, це не працює правильно з шістнадцятковими знаками, що містять 0b: tio.run/##FcwxCsIwFAbg/…
Гален Іванов,

1
@GalenIvanov приємна знахідка, виправлено
FrownyFrog

1

Perl 6 , 29 байт

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

Спробуйте в Інтернеті!

Perl 6 вимагає явного 0oпрефікса для восьмеричного і не підтримує великі префікси типу 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))

Спробуйте в Інтернеті!

-8 байт завдяки @TomCarpenter


Для 22 байтів:@(x)str2num(x(x~="'"))
Том Карпентер

Що стає на 21 байт:@(x)str2num(x(x~=39))
Том Карпентер

Октал, здається, не працює (принаймні, на TIO) ... наприклад, f=("077")повертається, ans = 77коли має бути 63. Або, як у тестовому випадку в ОП, f=("012345")слід повернути 5349, але замість цьогоans = 12345
brhfl

1

Баш, 33 байти

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

ТІО

Зш, 29 27 байт

-2 байти завдяки @GammaFunction

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

ТІО


Розумний! Я міг би подумати, setopt octalzeroesщо Зш буде необхідним.
GammaFunction

Ви можете зберегти 2 байти в Zsh, <<<$[...]а неecho $[...]
GammaFunction

дякую, я не знав, що пуста команда zsh з перенаправленням може відображати вихід, я не знаю багато про zsh, я знаю набагато краще баш
Nahuel Fouilleul

Я знав, що bash автоматично інтерпретує числа, що ведуть від нуля до восьмери, і його потрібно видалити, наприклад, у дату / час
Nahuel Fouilleul

0

Іди, 75

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

Схоже, це не працює ні для двійкових літералів, ні для розділових знаків з одноцитатами.
Нік Маттео

Ось лайно. Я скоро це виправлю. Повністю забув про розмежувачі
витявв

0

JavaScript (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

Java (JDK) , 101 байт

n->{n=n.replace("'","");return n.matches("0[bB].+")?Long.parseLong(n.substring(2),2):Long.decode(n);}

Спробуйте в Інтернеті!

Long.decode має справу з усіма літералами, крім двійкових.

Шаблон запозичений з відповіді Бенджаміна


Приємно. Мені потрібно більше подивитися на функції, які мають примітивні обгортки
Бенджамін Уркхарт




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.cpp, використовує GCC для його компіляції і дає файл, який виводить число




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

@someone, це неприємно, але мені це подобається!
Йохан дю Тойт

148 байт шляхом злиття popenтаsystem . G ++ має прапор, я думаю -x, читати з stdin. Це може бути коротше, ніж фопенд, але я не знаю, як викликати стдин у C.
Мій займенник monicareinstate

@someone, Тепер все об'єднано в popenкоманду
Йохан дю Тойт

printf-> echoздається, працює. Ви незабаром будете програмувати в баші.
мій займенник monicareinstate

0

Ява, 158 154 байти

Це лише чекання, коли він переможе. Просто намагається виконати регулярні вирази до тих пір, поки щось не працює і за замовчуванням буде встановлено шестигранну форму.
-4 байти завдяки @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);}

Спробуйте в Інтернеті

Використовуючи ScriptEngine, 92 87 байт

Поїзд Eval, що проходить. Технічно це передача факела JS, тому це не моє основне твердження.

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

ТІО


Використовуйте [bBxX]і 0[bB].+для швидкої оптимізації регексу.
Значення чорнила

@ValueInk дякую
Бенджамін

Отож, це не ціле це довге, заголовок чітко говорить про Integer, однакова або подвійна точність IEEE754 може стати невірною через метод, який використовується для збереження числа, коли через систему десяткових знаків в IEEE754 en.wikipedia.org/wiki/ IEEE_754 # Roundings_to_nevable , він також підтримує число, що перевищує 2 трлн ( 0x9999999999)
Мартін Баркер

@MartinBarker це дозволяється використовувати Longзамість Integerцілей для гольфу. Крім того, якщо ви маєте рацію, Python не може конкурувати, оскільки він має цілі числа з довільною точністю. Також longу Java є ціле число, представлене 64 бітами замість 32. Десяткових знаків немає.
Бенджамін Уркхарт

Довга річ полягала в тому, що ви довго використовуєте не ціле число, і ви помиляєтесь про цілі гри в гольф, The correct output never will exceed 2*10^9він цілком чітко стверджує, що означає, що довго не можна використовувати самостійно, тому що я можу дати це, 0x9999999999і він дасть число вище 2 * 10 ^ 9, тоді як C ++ це створить проблему переповнення пам'яті, оскільки ви використовуєте більше 32 біт пам'яті, коли ви виділили лише 32 біти пам'яті на це число
Мартін Баркер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.