একটি সি ++ 14 পূর্ণসংখ্যার আক্ষরিক পার্স করুন


27

Http://en.cppreferences.com/w/cpp/language/integer_literal এর মতে , পূর্ণসংখ্যার অক্ষরে দশমিক / হেক্স / অক্টাল / বাইনারি আক্ষরিক এবং একটি alচ্ছিক পূর্ণসংখ্যার প্রত্যয় থাকে যা স্পষ্টতই সম্পূর্ণ অপ্রয়োজনীয়, মূল্যবান বাইটগুলি অপচয় করে এবং হয় এই চ্যালেঞ্জ ব্যবহৃত হয় না।

একটি দশমিক আক্ষরিক হয় 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)

অতিরিক্তভাবে, 'ডিজিটাল বিভাজক হিসাবে কিছু বিকল্প থাকতে পারে । তাদের কোনও অর্থ নেই এবং এড়ানো যায়।

ইনপুট

একটি স্ট্রিং যা একটি C ++ 14 পূর্ণসংখ্যার আক্ষরিক বা এর চারকোডগুলির একটি অ্যারে উপস্থাপন করে।

আউটপুট

বেস 10 টি ইনপুট স্ট্রিং দ্বারা representedচ্ছিক ট্রেলিং নিউলাইন সহ প্রতিনিধিত্ব করে। সঠিক আউটপুট কখনই 2 * 10 ^ 9 এর বেশি হবে না

জয়ের মানদণ্ড

এটি করার জন্য জিসিসির অবদানকারীদের 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
@ লুইসেলিপডিজেসাস মুনোজ নং; আপনি কীভাবে পার্স হওয়ার আশা করেছিলেন?
আমার সর্বনাম

1
আমি ধরে নিচ্ছি যে কেবল C ++ 14 এ কোনও ফাংশন লিখলে প্রতারণা হবে, তাইনা? যেহেতু সংকলকটি ইতিমধ্যে এটি স্বয়ংক্রিয়ভাবে করে (যদিও তা অভ্যন্তরীণভাবে 500+ কোডের লাইন ...)
ড্যারেল হফম্যান

5
@ ড্যারেলহফম্যান আপনি যদিও এটি "সি ++ এ ফাংশন" দিয়ে করতে পারেননি, কারণ এটি স্ট্রিং ইনপুট গ্রহণ করবে না take হতে পারে এমন কিছু স্ক্রিপ্ট যা একটি সি ++ সংকলককে ডাকবে।
aschepler

2
স্ট্রিংটি যুক্ত 0করা ভাল পরীক্ষার ক্ষেত্রে হতে পারে (এটি আমার সাম্প্রতিক সংস্করণগুলির মধ্যে একটি বাগ প্রকাশ করেছে)।
ড্যানিয়েল শেপলার

উত্তর:


6

জাপট , 6 বাইট

OxUr"'

OxUr"'  Full Program. Implicit Input U
  Ur"'  Remove ' from U
Ox      Eval as javascript

এটি অনলাইন চেষ্টা করুন!


কিভাবে কাজ করে?
লিটারোসিয়াসট

@ লিরিটোসিস্ট মূলত আমার জেএস উত্তরের মতোই। আমি 'ইনপুট থেকে সরান এবং তারপরে এটিকে জে হিসাবে মূল্যায়ন করি
লুইস ফেলিপ দে জেসুস মুনোজ

22

x86 (32-বিট) মেশিন কোড, 59 57 বাইট

এই ফাংশনটি esiনাল-টার্মিনেটেড স্ট্রিংয়ের পয়েন্টার হিসাবে নেয় এবং মানটি ফেরত দেয় edx। (এটিএন্ডটি টি সিনট্যাক্সের নীচে তালিকাভুক্ত করা হচ্ছে জিএএস ইনপুট))

        .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

এবং বাইট গণনা সহ একটি বিচ্ছিন্নতা - এই সময় আপনি যদি এটিকে পছন্দ করেন তবে ইন্টেল ফর্ম্যাটে।

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    

এবং আপনি যদি এটি চেষ্টা করতে চান তবে, এখানে সি ++ টেস্ট ড্রাইভার কোড যা আমি এটির সাথে সংযুক্ত করেছি (জিসিসি এসএম সিনট্যাক্সে কলিং কনভেনশন স্পেসিফিকেশন সহ):

#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 পিটার কর্ডেসের মন্তব্যের কারণে বাইট

10 থেকে 8 টি পরিবর্তন করতে দুটি হ্রাস ব্যবহার করতে আপডেট করা থেকে বাইট


1
কেবলমাত্র আপনি ওভারফ্লোগুলির জন্য পরীক্ষা নিখোঁজ রয়েছেন ... সংকলক দ্বারা খুব বেশি সংখ্যক প্রতিবেদন করা হয়েছে reported
অ্যালেক্সিস উইলকে

2
আপনার জন্য আপনার রেজিস্টার ব্যবহার অদলবদল করতে পারেন rdxএবং rbx ? Then you can use 1-byte শুন্যতে cdq` rdxথেকে eax
পিটার কর্ডেস

1
এটি হয় আপনার সমাবেশের বাইট গণনা তালিকাভুক্ত করা উচিত, অথবা x86 মেশিন কোডের 59 বাইট হিসাবে লেবেলযুক্ত হওয়া উচিত।
আলু 44

2
@ পিটারকর্ডস ধন্যবাদ, সেই সম্পর্কে জানতাম না। (এছাড়াও, আবার এটি দেখার জন্য, আমি লক্ষ্য করেছি যে 10 থেকে 8 থেকে বেস পরিবর্তন করা 2 বাইট হতে পারে - দুটি বর্ধনের নির্দেশ থেকে - 3 বাইটের পরিবর্তে))
ড্যানিয়েল শেপলার

3
@ অ্যালেক্সিসওয়ালক এটিও অবৈধ বিন্যাসের জন্য পরীক্ষা করে না (যেমন প্রদত্ত বেসের সীমা ছাড়াই অঙ্কগুলি) যা সংকলকরাও করবে। তবে সমস্যার বিবৃতি অনুসারে, ইনপুটটি বৈধ হওয়ার জন্য এবং 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার উপচে না যাওয়ার গ্যারান্টিযুক্ত।
ড্যানিয়েল শেপলার

12

4
এটি বাবেলজেএস একচেটিয়া নয়, এটি ES6 থেকে পরবর্তীকালে কাজ করে
বাসড্রপ কম্বারবুবউবউব

1
@ বাসড্রপকম্বারউবউবউবউব, শিরোনামটি সম্ভবত টিআইও থেকে অনুলিপি করা হয়েছিল।
শেগি

চমৎকার, আমি প্রথমে ব্যবহারের চেষ্টা করেছি Numberকারণ এটি বাইনারি এবং হেক্স পরিচালনা করে, তবে দৃশ্যত অষ্টাল নয়Number("010") === 10
কার্ল ওয়ালশ

7

সি ++ (জিসিসি), 141 138 134 120 বাইট

এটি এমন একটি ফাংশন যা অক্ষরের একটি অ্যারে নেয় (শুরু এবং শেষের দিকে পয়েন্টারগুলির জুড়ি হিসাবে নির্দিষ্ট করা হয় - পুনরাবৃত্তি আইডিয়মের জুড়ি ব্যবহার করে) এবং নম্বরটি দেয়। নোট করুন যে ফাংশন ইনপুট অ্যারেটিকে পরিবর্তন করে।

(এই আচরণকে উপর নির্ভর করে জিসিসি / আগে থেকে libstdc ++ যে #include<cstdlib>বিশ্ব সুযোগ ফাংশন স্থাপন করা হয়। কঠোরভাবে মান সঙ্গতিশীল কোড, সঙ্গে প্রতিস্থাপন #include<stdlib.h>আরও একটি চরিত্রের খরচ জন্য।)

সংক্ষিপ্ত বিবরণ: কোডটি প্রথমে অক্ষরগুলি ছাঁটাই std::removeকরতে ব্যবহার করে '(ASCII 39)। তারপরে, strtol0 এর বেসের সাথে ইতিমধ্যে দশমিক, অষ্টাল এবং হেক্সাডেসিমাল কেসগুলি পরিচালনা করবে, সুতরাং কেবলমাত্র অন্য কেসের জন্য যাচাই করা উচিত একটি শীর্ষস্থানীয় 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 বাইট সংরক্ষণ করা হয়েছে।

-২ বাইট বাই লুকাস

-12 বাইট দ্বারা l4m2



অন্তর্ভুক্ত, ধন্যবাদ।
ড্যানিয়েল শেপলার


যদি অবৈধ ইনপুটটি সংজ্ঞায়িত আচরণ হয়, তবে 1 ম 0
চরটি

সুতরাং 124
l4m2

5

পাইথন 2 , 32 বাইট

lambda a:eval(a.replace("'",""))

এটি অনলাইন চেষ্টা করুন!

হাঃ হাঃ হাঃ

(পাইথন 2 দরকার কারণ পাইথন 3 এর জন্য অষ্টাল আক্ষরিক পরিবর্তিত হয় 0o(...))।


3
আমরা এই মুহুর্তে সত্যই পুরো বৃত্তটি
পেরিয়েছি


4

আর , 79 71 69 বাইট

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

এটি অনলাইন চেষ্টা করুন!

strtoiবেস 2 রূপান্তর এবং উপেক্ষা ছাড়া সবকিছু করে ', তাই কেবলমাত্র এই জিনিসগুলি ঠিক করার জন্য যথেষ্ট বাইট রয়েছে।

ধন্যবাদ হারুন Hayman -6 বাইট জন্য, এবং দীপক -4 আরো বাইট (এবং বেড়ে চলেছে!)

সমস্ত পরীক্ষার কেস যাচাই করুন (পুরানো সংস্করণ)


একটি বাইট প্রতিস্থাপন সংরক্ষণ করতে পারবেন sub("0b|B"সঙ্গে sub("b|B"নেতৃস্থানীয় "0" প্রভাবিত করবে না মান সাল থেকে। নাম পরিবর্তন করে আরেকটি পেতে পারেনstrtoi
অ্যারন হেইম্যান


1
অ্যারোন হাইমন বাহ, আমি এর na.omitআগে কখনও দেখিনি । এখানে সুপার হ্যান্ডি, এবং আমি আরও কিছুটা গল্ফ করেছি :-)
জিউসেপ

1
যদি আমরা ধরে নিই যে প্রতিটি প্রথম ব্যর্থতা strtoiবাইনারি হয় তবে আপনি অন্য বাইট সংরক্ষণের substringপরিবর্তে ব্যবহার করতে পারেন sub: অনলাইনে চেষ্টা করে দেখুন!
অ্যারন হেইম্যান

1
অ্যারোন হাইম্যানকে sব্যবহারের subপরিবর্তে আমরা প্রথম 2 টি অক্ষর বাদ দিতে পারি sub('..','',s)যার পরিবর্তে অন্য একটি বাইট সংক্ষিপ্ত!
জিউসেপ

4

05 এ বি 1 ই , 16 14 বাইট

গ্রিমে ধন্যবাদ 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)।
গ্রিমি

@ গ্রিমি: ধন্যবাদ! এর দুর্দান্ত ব্যবহার ï!
এমিগানা

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

এ 1 থেকে ইনপুট, যেখানে আপনি এই সূত্র রেখেছেন সেখানে আউটপুট। বিন্যাস সূত্র, তাই ব্যবহার Ctrl+ + Shift+ + Enterএটি লিখতে।

আমি ছবিতে দেখতে পারেন এমন কয়েকটি দম্পতির পরীক্ষার কেস যুক্ত করেছি - কিছু প্রাথমিক প্রচেষ্টা সমস্ত প্রদত্ত পরীক্ষার কেস সঠিকভাবে পরিচালনা করেছে তবে সারি 16 এবং / অথবা 17 টি ভুল পেয়েছে।

এখানে চিত্র বর্ণনা লিখুন


চূড়ান্ত দুটি বন্ধ হওয়া বন্ধনী বাদ দেওয়া এবং "সংকলক" (রিটার্ন বা ট্যাব টিপতে টিপুন) আপনার জন্য ত্রুটি-সংশোধন করবে এই সুবিধাটি গ্রহণ করা কি বিধিবিরোধী?
লুকাস

আমার ব্যক্তিগত মতামত, হ্যাঁ। আমি মনে করি না যে কোনও সাইটের sensকমত্য আছে। এক্সেল যুক্ত করা প্রথম বন্ধনী অন্য ভাষার আইডিই-তে কোড-সমাপ্তি বৈশিষ্ট্যের সমতুল্য বলে মনে হয়, যা বাইট গণনার জন্য উপেক্ষা করা উচিত। (তবে, আমি মনে করি "?" বেসিকের 1 বাইট হিসাবে গণ্য করা উচিত যদিও এটি নিঃশব্দে "PRINT" তে প্রসারিত হবে তাই সম্ভবত আমি এখানে সম্পূর্ণ সামঞ্জস্যপূর্ণ নই))।
সোফিয়া ল্যাটারের

3

x86-64 মেশিন কোড, 44 বাইট

(একই মেশিন কোডটি 32-বিট মোডেও কাজ করে))

@Daniel Schepler এর উত্তর এই জন্য একটি শুরুর স্থান ছিল, কিন্তু এই অন্তত একটি নতুন আলগোরিদিমিক ধারণা (ঠিক ভাল একই ধারণা golfing নয়) আছে: জন্য ASCII কোড 'B'( 1000010) এবং 'X'( 1011000) সঙ্গে মাস্কিং পর 16 এবং 2 দিতে0b0010010

সুতরাং দশমিক (অ-শূন্য নেতৃস্থানীয় অঙ্ক) এবং অষ্টাল বাদে (অক্ষরের পরে এর '0'চেয়ে কম হয় 'B') বাদ দিয়ে আমরা কেবল বেস = সেট করতে পারি c & 0b0010010এবং অঙ্কের লুপে ঝাঁপিয়ে দিতে পারি।

X86-64 সিস্টেম ভি দিয়ে কলযোগ্য হিসাবে ফলাফলের 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

ড্যানিয়েলের সংস্করণ পরিবর্তিত ব্লকগুলি (বেশিরভাগ) অন্যান্য নির্দেশাবলীর তুলনায় কম ইন্ডেন্ট করা হয়। এছাড়াও মূল লুপটির নীচের অংশে শর্তযুক্ত শাখা রয়েছে। এটি একটি নিরপেক্ষ পরিবর্তন হিসাবে প্রমাণিত হয়েছিল কারণ কোনও পথই এর শীর্ষে পড়তে পারে না এবং dec ecx / loop .Lentryলুপে প্রবেশের ধারণাটি অষ্টালকে অন্যভাবে পরিচালনা করার পরে জয়ের মতো নয়। কাঠামোর সময় লুপের সাথে ইডিয়োমেটিক আকারে লুপের সাথে এর কম নির্দেশ রয়েছে তবে এটি আমি রেখেছি।

ড্যানিয়েলের সি ++ পরীক্ষার জোতা এই কোডটি দিয়ে -৪-বিট মোডে অপরিবর্তিত কাজ করে, যা তার 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দিয়েছিলেন যে ছোট গন্তব্য সহ -৪-বিট মোড অপকডগুলিতে এআইইউআই উচ্চ বিটগুলিকে ০ এ পুনরায় সেট করবে?
ড্যানিয়েল শেপলার

@ ড্যানিয়েল: 32-বিট রেজিস্টার লিখতে শূন্য থেকে 64-বিট পর্যন্ত প্রসারিত । 8 বা 16-বিট রেজিস্টার লেখার ফলে অন্য পদ্ধতিগুলি থেকে আচরণটি রাখা যায়: বিদ্যমান মানটিতে একীভূত হয়। AMD64 8 এবং 16-বিট নিবন্ধগুলির জন্য মিথ্যা নির্ভরতা ঠিক করে নি, এবং এতে setcc r/m8রূপান্তরিত হয়নি setcc r/m32, তাই আমাদের এখনও একটি 32/64-বিট 0 বা 1 তৈরি করার জন্য একটি বোকা 2-নির্দেশ- xorজেরো / সেট পতাকা / setcc %alক্রম প্রয়োজন পরিবর্তনশীল, এবং এটি পতাকা-সেটিং আগে শূন্য রেজিস্টার প্রয়োজন। (অথবা 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

'গুলি মুছুন এবং সবকিছুকে ছোট আকারে রূপান্তর করুন।

\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। ( মানে বেসের $`আগে স্ট্রিংয়ের অংশ ;

.+;

বেস মুছুন।


আপনি কোডটি :-) ব্যাখ্যা করার জন্য আক্ষরিক প্রোগ্রামিং পদ্ধতির প্রশংসা করি
গ্রোভেলপ্লেক্স ১

1

জে , 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
@ গ্যালেন ইভানোভ সুন্দর সন্ধান করুন, ঠিক করেছেন
ফ্রেউনিফ্রোগ

1

পার্ল 6 , 29 বাইট

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

এটি অনলাইন চেষ্টা করুন!

পার্ল 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 বাইটস @ টমকার্পেন্টারকে ধন্যবাদ


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

Tio

Zsh, 29 27 বাইট

-২ বাইটস @ গ্যামা ফাংশনকে ধন্যবাদ

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

Tio


চতুর! আমি ভাবছিলাম setopt octalzeroesZsh এর জন্য প্রয়োজনীয় হবে।
গামা ফাংশন

আপনি <<<$[...]echo $[...]
Zsh এর

ধন্যবাদ, আমি জানতাম না যে রিডাইরেকশনের সাথে zsh ফাঁকা কমান্ড আউটপুট প্রদর্শন করতে পারে, আমি zsh সম্পর্কে খুব বেশি কিছু জানি না, আমি আরও অনেক ভাল বাশ জানি
নাহুয়েল ফৌইলুল

আমি জানতাম যে ব্যাশ স্বয়ংক্রিয়ভাবে শূন্য থেকে
অষ্টালের

0

যাও, 75

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

এটি বাইনারি আক্ষরিকের জন্য, না একক-উদ্ধৃতি অঙ্কের ডিলিমেটরের পক্ষে কাজ করে বলে মনে হচ্ছে।
নিক মাত্তিও

ওহ বিষ্ঠা. আমি শীঘ্রই এটি ঠিক করব। ডিলিমিটারদের সম্পর্কে সম্পূর্ণরূপে ভুলে গেছি
সত্য

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

জাভা (জেডিকে) , 101 বাইট

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

এটি অনলাইন চেষ্টা করুন!

Long.decode বাইনারি বাদে সমস্ত ধরণের আক্ষরিক সাথে কাজ করে।

টেম্পলেট বেনিয়ামিনের উত্তর থেকে ধার করা হয়েছে


খুশী হলাম। আদিম মোড়কগুলি সম্পর্কে আমার আরও ফাংশনগুলি দেখতে হবে
বেনিয়ামিন উরখার্ট




0

সি ++, জি ++, 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++সি ++ 14 সমর্থন সহ ইনস্টলেশন প্রয়োজন

এখন, ব্যাখ্যা:

এটি নামক একটি ফাইল লিখেছে a.cpp, এটি সংকলন করতে জিসিসি ব্যবহার করে এবং একটি ফাইল দেয় যা সংখ্যাটি আউটপুট দেয়



0

পাইথ , 27 বাইট

Jscz\'?&qhJ\0}@J1r\0\7iJ8vJ

এটি অনলাইন চেষ্টা করুন!

পূর্ববর্তী (বর্তমানে মুছে ফেলা) পাইথ উত্তরের বিপরীতে, এটি 3 টি বাইট দীর্ঘ হলেও প্রশ্নটিতে সমস্ত পরীক্ষার কেস পাস করে।


সাইটে স্বাগতম!
গম উইজার্ড

0

সি (জিসিসি) / বাশ / সি ++, 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 বাইট
আমার সর্বনাম

@ সোমন, এটা খুব খারাপ, কিন্তু আমি এটি পছন্দ করি!
জোহান ডু টোইট

মার্জ করে 148 বাইট popenএবংsystem-xস্টিডিনের কাছ থেকে পড়ার জন্য জি ++ এর একটি পতাকা রয়েছে ।
এটি ফপেন স্টাফের

@ সোমন, সবকিছু এখন popenকমান্ডের সাথে একীভূত হয়ে গেছে
জোহান ডু টোইট

printf-> echoমনে হচ্ছে কাজ করে। আপনি শীঘ্রই বাশ মধ্যে প্রোগ্রামিং হতে চলেছেন।
আমার সর্বনাম

0

জাভা, 158 154 বাইট

এটি কেবল ছাড়িয়ে যাওয়ার অপেক্ষায়। কোনও কিছু কাজ না করা এবং হেক্সে ডিফল্ট হওয়া পর্যন্ত কেবল রেজিজেসগুলির চেষ্টা করে।
-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);}

এটি অনলাইনে চেষ্টা করুন

স্ক্রিপ্টইজাইন, 92 87 বাইট ব্যবহার করে

ইভাল ট্রেন দিয়ে আসছে। প্রযুক্তিগতভাবে এটি টর্চটি জেএসকে ছাড়ছে, সুতরাং এটি আমার মূল জমা নয়।

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

Tio


ব্যবহার করুন [bBxX]এবং 0[bB].+কিছু দ্রুত রেগেক্স অপ্টিমাইজেশনের জন্য।
মান কালি

@ ভ্যালিউইঙ্ক ধন্যবাদ
বেনিয়ামিন

যে, না একটি পূর্ণসংখ্যা এটি একটি দীর্ঘ, শিরোনাম পরিষ্কারভাবে পূর্ণসংখ্যা, একটি একক বা ডবল স্পষ্টতা IEEE754 ভুল কারণে হতে পারে জন্য পদ্ধতি IEEE754 যখন দশমিক স্থান সিস্টেম কারণে নম্বরটি সংরক্ষণ করতে ব্যবহৃত বলেছেন en.wikipedia.org/wiki/ IEEE_754 # রাউন্ডিং_ থেকে_ নিকটেস্ট , এটি 2 ট্রিলিয়ন ( 0x9999999999) -রও বেশি সংখ্যক সমর্থন করে
মার্টিন বার্কার

@ মার্টিন বার্কার এটি গল্ফ করার উদ্দেশ্যে ব্যবহারের Longপরিবর্তে মঞ্জুরিপ্রাপ্ত Integer। এছাড়াও, আপনি যদি সঠিক হন তবে পাইথন প্রতিযোগিতা করতে পারে না কারণ এটি কার্যকরভাবে স্বেচ্ছাসেবী-যথার্থ পূর্ণসংখ্যার কাজ করেছে। এছাড়াও, longজাভাতে একটি পূর্ণসংখ্যা 32 এর পরিবর্তে b৪ বিটের সাথে উপস্থাপিত হয়। দশমিক কোনও স্থান নেই।
বেনজামিন আরউখার্ট

লম্বা জিনিসটি ছিল আপনি দীর্ঘকাল কোনও পূর্ণসংখ্যক হিসাবে ব্যবহার করছেন না এবং আপনি গল্ফিংয়ের উদ্দেশ্যগুলি সম্পর্কে ভুল, The correct output never will exceed 2*10^9এটি বেশ স্পষ্টভাবে বলেছে যে দীর্ঘ অর্থ তার নিজের পক্ষে ব্যবহার করা যাবে না কারণ আমি এটি দিতে পারি 0x9999999999এবং এটি একটি সংখ্যা তৈরি করবে 2 * 10 ^ 9 এর চেয়ে বেশি যদিও সি ++ এটি একটি মেমরির ওভারফ্লো ইস্যু তৈরি করবে কারণ আপনি যখন এই সংখ্যাটিতে মাত্র 32 বিট মেমরি বরাদ্দ করেছেন তখন আপনার মেমরির 32 টিরও বেশি বিট ব্যবহার করা হবে
মার্টিন বার্কার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.