ลองทำเลขคณิตสถานที่กันเถอะ!


22

จากบทความ Wikipedia :

Location arithmetic (Latin arithmeticæ localis) เป็นระบบเลขฐานสองแบบเสริม (ไม่ใช่ตำแหน่ง) ซึ่ง John Napier สำรวจเป็นเทคนิคการคำนวณในตำราของเขา Rabdology (1617) ทั้งเป็นสัญลักษณ์และบนตารางคล้ายกระดานหมากรุก

อะไร?

ตัวเลขสถานที่ตั้งเป็นวิธีการเขียนตัวเลขโดยใช้ตัวอักษรของตัวอักษร

สัญกรณ์ไบนารียังไม่ได้มาตรฐานดังนั้นเนเปียร์จึงใช้สิ่งที่เขาเรียกว่าเลขที่ตั้งเพื่อแทนเลขฐานสอง ระบบของเนเปียร์ใช้สัญกรณ์ค่าสัญญาณเพื่อแสดงตัวเลข มันใช้ตัวอักษรต่อเนื่องจากตัวอักษรภาษาอังกฤษเพื่อเป็นตัวแทนของพลังต่อเนื่องของสอง: a = 2 ^ 0 = 1, b = 2 ^ 1 = 2, c = 2 ^ 2 = 4, d = 2 ^ 3 = 8, e = 2 ^ 4 = 16และอื่น ๆ

ตัวอย่าง

ab = 1 + 2 = 3 ในฐาน 10

aabb = 1 + 1 + 2 + 2 = 6 ในฐาน 10

โปรดทราบว่าaabbสามารถย่อให้สั้นลงได้bcโดยแทนที่ตัวอักษรใด ๆ 2 ตัวด้วยตัวอักษรที่สูงกว่า

การเพิ่ม

คุณแค่ต่อตัวเลขสองตัวเข้าด้วยกันแล้วทำให้มันง่ายขึ้น

acd+ bde= acdbde= abcdde= acebe= abcf= 39ในฐาน 10

การลบ

เพียงลบตัวเลขทั้งหมดที่ปรากฏอย่างเท่าเทียมกันในทั้งสองส่วนของการลบ อาจจำเป็นต้องขยาย (แปลงbเป็นaa)

abde- ad= be= 18 ในฐาน 10

การคูณ

มันยากกว่านี้อีกเล็กน้อย

ให้บอกว่าเราต้องการคูณacd(13) ด้วยdef(56) ก่อนอื่นให้คุณจัดเรียงacdแนวตั้ง:

a
c
d

จากนั้นคุณเพิ่มdefหลังจากแรกa:

a def
c
d

ตอนนี้ c คือ 2 ตำแหน่งต่อไปในตัวอักษรกว่าดังนั้นเราจึงเพิ่ม 2 ตำแหน่งในตัวอักษรเพื่อที่จะทำให้def fghที่ถูกเพิ่มเข้าไปในแถวที่สอง

a def
c fgh
d

สุดท้าย d เป็น 1 ตำแหน่งต่อมาในตัวอักษรกว่า C เพื่อให้เราเพิ่ม 1 ตำแหน่งในตัวอักษรเพื่อที่จะทำให้fgh ghiที่ถูกเพิ่มเข้าไปในแถวที่สาม

a def
c fgh
d ghi

จากนั้นคุณหาผลรวมของสิทธิ: def+ fgh+ ghi= deffgghhi= deggghhi= deghhhi= deghii= deghj(728)

อีกตัวอย่างของการคูณ

การป้อนข้อมูล:

bc * de

ครั้งแรก:

b
c

แล้วก็

b ef
c 

แล้วก็

b ef
c fg

โปรดทราบว่าเราเขียนลงefในบรรทัดแรก นั่นเป็นเพราะbcเริ่มต้นด้วยbและbเป็นจดหมายฉบับที่สองในตัวอักษรดังนั้นเราจึงจำเป็นที่จะเปลี่ยนdeจาก 1 efตัวอักษรดังนั้นมันจะกลายเป็น

แล้วก็

ef+fg

เอาท์พุท:

eh

แผนก

นี่ไม่ใช่ส่วนหนึ่งของความท้าทายนี้เพราะมันซับซ้อนมาก

ความท้าทายที่แท้จริงของคุณ

โปรแกรมหรือฟังก์ชั่นของคุณจะต้องป้อนข้อมูลเป็นสตริงที่มีลักษณะดังนี้:

a + b

และคุณจะต้องส่งออก:

ab

แน่นอนโปรแกรมหรือการทำงานของคุณจะต้องสนับสนุนตัวเลขของความยาวโดยพลการ (ถึงสตริงหรือการป้อนขีด จำกัด ของภาษาของคุณ) กับใด ๆ ของผู้ประกอบการ+, หรือ- *ตัวอย่างเพิ่มเติม:

การป้อนข้อมูล:

ab + bd

เอาท์พุท:

acd

การป้อนข้อมูล:

d - ab

เอาท์พุท:

ac

การป้อนข้อมูล:

ab * cd

เอาท์พุท:

cf

หมายเหตุ:

  • ลำดับของตัวอักษรในเอาต์พุตไม่สำคัญ แต่คุณสามารถสันนิษฐานได้ว่าลำดับของตัวอักษรในตัวเลขในอินพุตจะเพิ่มขึ้น (a before z)
  • คุณสามารถรับอินพุตด้วยการขึ้นบรรทัดใหม่และส่งออกด้วยการขึ้นบรรทัดใหม่
  • คุณอาจจะไม่ได้ใช้การป้อนข้อมูลเป็นรายการของab, *และสำหรับbdab * bd
  • ใช้ตัวอักษรภาษาอังกฤษ ( abcdefghijklmnopqrstuvwxyz)
  • ผลลัพธ์ของคุณจะต้องง่ายขึ้น ( aaไม่อนุญาตbเป็นสิ่งจำเป็น)
  • อินพุตจะถูกทำให้ง่ายขึ้น ( b+ c, ไม่ใช่aa+ bbหรือaa+ aaaa)
  • คุณอาจจะต้องใช้พื้นที่ก่อนและผู้ประกอบการ (ก+, -หรือ*) หรือคุณอาจจำเป็นต้องที่จะมีใคร
  • จะมีเพียงหนึ่งโอเปอเรเตอร์ต่อหนึ่งอินพุต
  • คุณอาจคิดว่าเอาต์พุตและอินพุตจะไม่เกิน 2 ^ 27-1 ( abcdefghijklmnopqrstuvwxyz)
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!

2
d is 2 positions later in the alphabet than cช่างนี่เหรอ? มันไม่ควรจะเป็น1? That is added to the second row.ในประโยคเดียวกันมันไม่ควรจะเป็นthird?
Felipe Nardi Batista

1
@FelipeNardiBatista ใช้ตัวอักษรภาษาอังกฤษที่นี่แก้ไขแล้ว
programmer5000

@ programmer5000 ยังคงbc*de==efghแต่efghเป็น240ไม่ได้144
เฟลิ Nardi บาติสตา

1
bc*deควรเป็นeh
Felipe Nardi Batista

@Dada จะมีเพียงหนึ่งโอเปอเรเตอร์ต่อหนึ่งอินพุต
programmer5000

คำตอบ:


3

เจลลี่ , 26 25 ไบต์

i@€Øað’2*S;ḟ.Ḣ
ḲÇ€VBṚTịØa

ใช้ประกอบการของเจลลี่ ( ×มากกว่า*และ_มากกว่า-) ในสายป้อนเป็นได้รับอนุญาตจากสหกรณ์

(ต้องใช้ช่องว่างรอบตัวดำเนินการ)

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

i@€Øað’2*S;ḟ.Ḣ - Link 1, transform from input sub-string to value or operator: sub-string
i@€            - 1st index of, for €ach (or 0 if not found) [reversed @rguments] in:
   Øa          -      lowercase alphabet (i.e. a->1, b->2, ..., non-alpha->0)
     ð         - dyadic chain separation i.e. f(result above, substring):
      ’        - decrement (i.e a->0, b->1, ..., non-alpha->-1)
       2*      - 2 raised to that power
         S     - sum
          ;    - concatenate with the substring
           ḟ   - filter out:
            .  -     0.5 (for an operator substring the evaluated 0.5 is removed)
             Ḣ - head (i.e. the evaluation for a location, and the operator otherwise)

ḲÇ€VBṚTịØa - Main link: string                        e.g. 'ab × cd'
Ḳ          - split on spaces                               [['a','b'],['×'],['c','d']]
 Ç€        - last link (1) as a monadic function for €ach  [3,'×',12]
   V       - evaluate as Jelly code                        36
    B      - convert to binary                             [1,0,0,1,0,0]
     Ṛ     - reverse                                       [0,0,1,0,0,1]
      T    - truthy indexes                                [3,6]
       ị   - index into:
        Øa -     lowercase alphabet                        ['c','f'] (i.e. "cf", which is implicitly printed when run as a full program)

7

Mathematica, 168 ไบต์

FixedPoint[StringReplace[x_~~x_:>FromCharacterCode[c@x+1]],Table["a",ToExpression@StringReplace[#,x:LetterCharacter..:>ToString@Tr[2^((c=ToCharacterCode)@x-97)]]]<>""]&

โซลูชันเริ่มต้นของฉัน (ก่อนโพสต์ได้รับการแก้ไขเพื่อชี้แจงว่าเอาต์พุตต้องง่ายขึ้น) 64สั้นลงเป็นไบต์:

Table["a",ToExpression@StringReplace[#,x:LetterCharacter..:>ToString@Tr[2^(ToCharacterCode@x-97)]]]<>""

นี่เพิ่งแก้ไขโซลูชันนั้นให้ทำงาน มันอาจจะสั้นกว่าที่จะใช้วิธีการที่อธิบายไว้ในความท้าทายจริง ๆ แต่ฉันต้องการที่จะนำมันต่อไป

คำอธิบาย:

แทนที่แต่ละลำดับของตัวอักษรด้วยจำนวนเต็มที่สอดคล้องกันด้วยเลขคณิตรหัสอักขระจากนั้นแปลงสตริงผลลัพธ์เป็นนิพจน์ (ซึ่งจะลดความซับซ้อนของจำนวนเต็มโดยอัตโนมัติ) จากนั้นสร้างสตริงaอักขระที่มีความยาวเท่ากับจำนวนเต็มนั้นและในที่สุด อักขระที่มีรหัสอักขระถัดไปจนถึงจุดคงที่


2
โอ้ไม่มี built-1 char หรือเปล่า ที่น่าแปลกใจ!
programmer5000

7

JavaScript (ES6), 136 134 133 ไบต์

บันทึก 1 ไบต์ขอบคุณ Luke

s=>[...a='abcdefghijklmnopqrstuvwxyz'].filter((c,i)=>eval(s.replace(/\w+/g,s=>[...s].reduce((p,c)=>p|1<<a.search(c),0)))&1<<i).join``

กรณีทดสอบ


ทำได้ดีมาก! คุณชนะฉันไป ...
programmer5000

สิ่งนี้แปลงเป็นทศนิยมและย้อนกลับหรือไม่ มันจะปรากฏขึ้น
programmer5000

1
@ programmer5000 ใช่แน่นอน ฉันสงสัยว่าจะมีคำตอบมากมาย (ยกเว้น Mathematica ซึ่งอาจมีอยู่แล้วในตัวสำหรับมัน ^^)
Arnauld

ดูเหมือนว่าความคิดเห็นของคุณไม่มีลิงก์ มีอะไรในตัว fot มันได้หรือไม่
programmer5000

@ programmer5000 (อันที่จริงแล้วมันขาดหายไปสักคำ)
Arnauld

5

Perl 5 , 95 ไบต์

รหัสไบต์ 94 + -pธง

s/\w/a x 2**(-97+ord$&)/ge;s/(.*)-\1|\+//;/\*/&&($_=$`x length$');1while s/(.)\1/chr 1+ord$1/e

ลองออนไลน์!

สามขั้นตอนที่นี่:
- s/\w/a x 2**(-97+ord$&)/ge;แปลงอินพุตเป็นสตริงaเท่านั้น
- s/(.*)-\1|+//;/*/&&($_=$`x length$')จะดำเนินการตัวดำเนินการ (ที่ง่ายมากในสายของa): +คือการต่อข้อมูล, -หมายถึงการลบออกจากส่วนแรกมากaที่สุดเท่าที่มีอยู่ในส่วนที่สองและ*หมายถึงการทำซ้ำส่วนแรกหลายครั้งเท่าที่มีอยู่aในที่สอง ส่วนหนึ่ง
- 1while s/(.)\1/chr 1+ord$1/eพับตัวอักษรเดียวกันตามลำดับเป็นตัวอักษรถัดไปในตัวอักษร


คำตอบเดียวที่ไม่แปลงเป็นทศนิยม! งานที่ดี!
programmer5000

1
@ programmer5000 จาก 2 คำตอบฉันจะไม่เรียกว่าประทับใจ!
Dada

5

05AB1E , 29 ไบต์

ð¡À¬U¦v0yvAyko+}}X.VbRvyiANèJ

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

ð¡                             # split input on string
  À                            # rotate left
   ¬U¦                         # get the operator, store it in X and remove it from list
      v                        # for each side of the equation
       0                       # push 0 as an accumulator
        yv                     # for each letter in each side of the equation
          Ayk                  # get its index in the alphabet
             o                 # raise 2 to this power
              +                # add to the accumulator
               }}              # end loops
                 X.V           # apply the operator to the 2 numbers now on the stack
                    bR         # convert to binary and reverse
                      v        # for each binary digit
                       yi      # if it is true
                         ANè   # get the letter at that index in the alphabet
                            J  # join stack to a single string

5

C & x86 asm, 340 ไบต์

คอมไพล์ด้วย -O0

#define G getchar()
g(){int c,a=0;for(;islower(c=G);)a+=1<<(c-97);return a;}
main(){short o[]={[43]=0x4403,[45]=0x442b,[42]=0x6cf7};
mprotect((long)&&l&~4095,4096,7);
for(;;){int c,b=0,a=g();*(short*)&&l=o[G];G;g();asm("xchg %%eax,%0":"+m"(a));
l:asm("addl %1,%%eax":"=a"(c):"m"(a));
for(;a=c>>b;b++)if(a&=1)putchar(97+b);putchar(10);}}

คำอธิบาย

เนื่องจาก C ไม่มีeval()ฉันจึงใช้ตารางคำสั่ง x86 แทน ฉันต้องเลือกคำแนะนำซึ่งมีความยาวเท่ากัน (หรือมีเบาะด้วย nops) และคาดว่า src และปลายทางของประเภทเดียวกันจะเป็นแบบใด สิ่งที่น่ารำคาญเป็นพิเศษคือ MUL สามารถเขียนลงทะเบียนได้เท่านั้นและ opcodes MUL ขนาด 1 ไบต์สามารถเขียนไปที่ EAX เท่านั้น นอกจากนี้ดูเหมือนว่าจะไม่มีคำสั่งย่อย SUB ที่เขียนลงทะเบียนซึ่งถูกลบออกจากหน่วยความจำแทนวิธีอื่น ๆ ดังนั้น XCHG

แก้ไข

เนื่องจากมันถูกถามในความคิดเห็นการประเมินแบบดั้งเดิมจะมีลักษณะเช่นนี้:

#define G getchar()
#define return r
#define int i
g(){i c,a=0;for(;islower(c=G);)a+=1<<(c-97);r a;}
a(i x,i y){r x+y;}s(i x,i y){r x-y;}m(i x,i y){r x*y;}
main(){i(*o[])(i,i)={[43]=a,[45]=s,[42]=m};
for(;;){i c,b,a=g();b=G;G;g();c=o[b](a,g());
for(b=0;a=c>>b;b++)if(a&=1)putchar(97+b);putchar(10);}}

จริง ๆ แล้วมันสั้นกว่าเล็กน้อยที่ 301 chars ด้วยเหตุผลบางประการ: 1. เนื่องจากจำเป็นต้องมีฟังก์ชั่นจำนวนมากค่าใช้จ่ายของแต่ละคนจึงสามารถถูกสับโดยใช้กฎ preprocessor 2. ลินุกซ์ที่ทันสมัยป้องกันจากการดำเนินการในสแต็คดังนั้นการเรียก mprotect () เพื่อปิดการใช้งานนี้เสียสละ 34 ไบต์ 3. การเรียก XCHG นั้นดีที่สุดในระดับต่ำมากคิดค่าใช้จ่ายอีก 30 ไบต์ หากไม่ใช่สำหรับสิ่งเหล่านั้นคอมโบ x86 จะชนะได้ประมาณ 10-20 ไบต์

สับทั้ง 2 ไบต์จากทั้งสองโดยปรับปรุงการเรียก islower () เป็น g


ฉันไม่สามารถบอกได้ว่ามันจะเปรียบเทียบกับวิธีการแบบคลาสสิกมากขึ้นในแง่ของขนาดรหัส แต่ฉันชอบวิธีการแก้ปัญหาของคุณ +1
Arnauld

5

GNU sed + coreutils, 329 ไบต์

ใช่ฉันไม่รู้ว่ามีอะไรเกิดขึ้นในตัวฉัน แต่อย่างน้อยฉันก็รู้ว่าการเขียนบทได้ดีขึ้นแล้ว โปรดทราบว่าการแก้ปัญหานี้ต้องใช้eส่วนขยายของ GNU sed ซึ่งใช้คำสั่งเชลล์

/\+/{s/\+//
b S}
/-/{:E
/a+-a+/{s/(a*)(a*)-\2/\1/
b S}
s/.*/echo &|tr b-z- A-Y-/
e
s/([A-Z])/\L\1\1/g
b E}
/\*/{h
:M
/^\*/{x
s/[^\n]*//
s/\n//g
b S}
s/(.).*\*(.*)/echo \2|tr a-z \1-za-z/
e
H
g
s/.(.*)/\1/
h
s/\n.*//
b M}
:S
s/^.*$/echo &|grep -o .|sort|tr -d '\n'/
e
:L
s/(.)\1/\u\1/g
/^[a-z]*$/ q
s/.*/echo &|tr A-Z b-za/;e
b L

ฉันคิดว่าจะไม่มีช่องว่างรอบตัวดำเนินการ จากสถานีของฉัน:

$ sed -rf golf.sed <<< a+b
ab
$ sed -rf golf.sed <<< ab+bd
acd
$ sed -rf golf.sed <<< abc+b
ad
$ sed -rf golf.sed <<< d-ab
ca
$ sed -rf golf.sed <<< ab*cd
cf
$ sed -rf golf.sed <<< bc*de
eh
$ sed -rf golf.sed <<< acd*def
deghj

และสำหรับผู้ที่มีสุขภาพดีกว่าฉัน: เวอร์ชันที่แสดงความคิดเห็น!

#!/bin/sed -rf

/\+/ {
    s/\+//
    b simplify
}

/-/ {
    # expand pattern space; everything will now be 'a's
    :E
    /a+-a+/{
        # Remove doubled 'a's on either side of the dash. For example,
        # for input d-ab, space is now 'aaaa-aaa'; substitute this to 'a'
        s/(a*)(a*)-\2/\1/
        b simplify
    }
    # shift letters that aren't 'a' down and double them
    s/.*/echo &|tr b-z- A-Y-/;e
    s/([A-Z])/\L\1\1/g
    b E
}

/\*/ {
    # Hold space: line 1 is pattern, other lines are output
    h
    :M

    # if space starts with *, we've eaten entire arg0; sum and simplify
    /^\*/ {
        x
        s/[^\n]*//      # remove first line, which is our pattern
        s/\n//g         # remove newlines to add results together
        b simplify
    }

    # convert pattern into shifting command
    s/(.).*\*(.*)/echo \2|tr a-z \1-za-z/

    # execute it, append result to hold space
    e
    H

    # restore pattern, with leading char and all output lines removed
    g
    s/.(.*)/\1/
    h
    s/\n.*//

    b M
}

:simplify
# reorder all letters so all 'a's are before all 'b's are before all 'c's
# are before ... etc    
# See /programming/2373874
s/^.*$/echo &|grep -o .|sort|tr -d '\n'/
e

:L
# Replace repeated characters with themselves upper-cased, then translate
# upper-cased characters to what they should be.
s/(.)\1/\u\1/g
/^[a-z]*$/ q
s/.*/echo &|tr A-Z b-za/;e
b L

+1 สำหรับรหัส sed และยินดีต้อนรับสู่ PPCG! การประชุมที่นี่เมื่อไม่ได้แก้ไขใน GNU sed บริสุทธิ์ (หรือในภาษาบริสุทธิ์อื่น ๆ ) คือการเพิ่มชื่อเรื่องคำสั่งระบบที่ใช้เช่น "GNU sed + coreutils" ตัวอย่างเช่นแม้ว่าคุณจะพูดถึงการเรียกคำสั่งเชลล์ในคำอธิบาย . สิ่งนี้ทำเพื่อสร้างความแตกต่างโดยเฉพาะในความท้าทายกับกระดานผู้นำจากคำตอบที่แท้จริงของ GNU
seshoumara

นอกจากนี้หากจำเป็นต้องตั้งค่าสถานะ 'f' ทุกครั้งธงอื่น ๆ จะต้องนับเป็น 1 ไบต์ ดังนั้นคะแนนของคุณคือ 329 คุณอาจต้องการพูดถึงในรายละเอียด และสำหรับการเสร็จสิ้นคุณอาจคิดว่าการเพิ่มการเชื่อมโยงไปล่าม sed ออนไลน์เช่นติ้ว
seshoumara

ที่จะไม่พูดทั้งหมดและไม่มีการกระทำนี่คือ 43 ไบต์สั้น! รุ่นของรหัสของคุณ (286 ไบต์รวมถึง -r) ที่ฉันพบโดย golfing คำสั่ง ฉันแน่ใจว่ามันจะสั้นกว่านี้ได้
seshoumara

อ่าดีที่รู้! นอกจากนี้การเล่นกอล์ฟที่ดี! คุณกำลังใช้ sed รุ่นใด ทำงานของคุณใน TIO แต่ใน GNU sed 4.4 ฉันเพิ่งได้รับsed: file golf.sed line 24: ":" lacks a label
charliegreen

ป้ายกำกับที่ไม่มีชื่อเป็นข้อผิดพลาดที่รู้จักกันดีใน GNU sed ซึ่งได้รับการแก้ไขในรุ่น 4.3 แต่ใน PPCG คุณสามารถเขียนโปรแกรมสำหรับตัวแปรและรุ่นใด ๆ โดยใช้บั๊กเป็นคุณสมบัติถ้ามันช่วยในการเล่นกอล์ฟ ความแตกต่างระหว่างรุ่นเล็กเกินไปที่จะพูดถึง (4.2 กับ 4.4) แต่ตัวแปร (POSIX sed มาตรฐานเทียบกับ GNU sed ที่ขยายเพิ่ม) จะต้องระบุไว้ในชื่อเรื่องพร้อมกับกล่าวถึงโปรแกรมระบบที่เรียกว่าถ้ามี
seshoumara

4

PHP, 168

เอาต์พุตจากน้อยไปมากด้วยการใช้ eval

[$a,$o,$b]=explode(" ",$argn);function d($s){for(;$i<strlen($s);)$n+=2**(ord($s[$i++])-97);return$n;}for(eval("\$k=d($a)$o d($b);");$i<26;)echo$k&2**$i++?chr(96+$i):"";

PHP, 185 ไบต์

ขาออก

[$a,$o,$b]=explode(" ",$argn);function d($s){for(;$i<strlen($s);)$n+=2**(ord($s[$i++])-97);return$n;}for(;$i<26;)echo(bc.[mul,add,0,sub][ord($o)-42])(d($a),d($b))&2**$i++?chr(96+$i):"";

เวอร์ชั่นออนไลน์

ขยาย

[$a,$o,$b]=explode(" ",$argn); # part the input into variables
function d($s){ # make decimal value
    for(;$i<strlen($s);)$n+=2**(ord($s[$i++])-97);
    return$n;
}
for(;$i<26;)
echo(bc.[mul,add,0,sub][ord($o)-42])(d($a),d($b))&2**$i++?chr(96+$i):""; # Bitwise Compare and Output

PHP, 201 ไบต์

กำลังส่งออก Decending

[$a,$o,$b]=explode(" ",$argn);function d($s){for(;$i<strlen($s);)$n+=2**(ord($s[$i++])-97);return$n;}for($r=(bc.[mul,add,0,sub][ord($o)-42])(d($a),d($b));$r;$r-=2**$l)$t.=chr(97+$l=log($r,2)^0);echo$t;

เวอร์ชั่นออนไลน์

ขยาย

[$a,$o,$b]=explode(" ",$argn); # part the input into variables
function d($s){ # make decimal value
    for(;$i<strlen($s);)$n+=2**(ord($s[$i++])-97);
    return$n;
}
for(
$r=(bc.[mul,add,0,sub][ord($o)-42])(d($a),d($b)) # result of the operation
;$r;
$r-=2**$l) # subtract the letter value 
$t.=chr(97+$l=log($r,2)^0); # find greatest letter
echo$t; # Output

4

Python 3 , 176 167 ไบต์

i=lambda a:str(sum(1<<ord(i)-97for i in a))
def f(a):
 a,b,c=a.split();m=eval(i(a)+b+i(c));r=''
 while m:
  t=0
  while m>=2**t*2:t+=1
  r+=chr(97+t);m-=2**t
 return r

ลองออนไลน์!

  • บันทึกแล้ว 9 ไบต์: ขอบคุณtutleman

1
เว้นแต่ฉันเข้าใจผิดว่าคุณสามารถโกนไบต์ที่สองโดยการแทนที่m>=2**(t+1)ด้วยm>=2**t*2และห้าไบต์โดยการแทนที่กับสิ่งที่ต้องการa=a.split();m=eval(i(a[0])+a[1]+i(a[2])) b,c,d=a.split();m=eval(i(b)+c+i(d))
Tutleman

1
Oh, และไบต์ที่สองมากขึ้นโดยการแทนที่ด้วย2**(ord(i)-97) 1<<ord(i)-97
Tutleman

1
ฉันประหลาดใจที่โซลูชันนี้สามารถอ่านได้เมื่อเปรียบเทียบกับโซลูชันอื่น
Ole Tange

ขอขอบคุณ :). แต่ฉันคิดว่ามันเป็นเพราะหลามเป็นภาษาที่ใช้ การเยื้องทำให้จำนวนไบต์เพิ่มขึ้นอย่างไรก็ตามสามารถอ่านได้ ;)
ประกาศอย่างเป็นทางการ

2

PHP, 130

for($d=a;$e=$argn[$i++];)$e!=' '?$d!=b?$$d+=1<<ord($e)-97:$b=$e:++$d;eval("for(;\$j++<27;)echo($a$b$c>>\$j-1)&1?chr(96+\$j):'';");

รุ่นที่ขยาย:

for($d=a;$e=$argn[$i++];)       // for each char in the input
  $e!=' '?                      //   if space
    $d!=b?                      //     if not the operation
      $$d+=1<<ord($e)-97:       //       add 2^(char - 'a')
      $b=$e:                    //     else save operation
    ++$d;                       //   else increase "pointer"
eval("for(;\$j++<27;)           // for each bit in the output
        echo($a$b$c>>\$j-1)&1?  //   calulate the result and check the bit
          chr(96+\$j):          //     output corrosponding char
          '';                   //     output nothing
     ");

php -R <code>ทำงานด้วย


1

AWK, 201 ไบต์

BEGIN{RS="(.)"}n=index(V="abcdefghijklmnopqrstuvwxyz",RT){s+=2^--n}index("+-*",RT){a=s RT
s=0}END{RS="\n"
"(awk '$0="a s"'<<<1)"|getline v
for(j=26;j--;)if((s=v-2^j)>=0){v=s;c=substr(V,j+1,1)c}print c}

"(awk '$0="a s"'<<<1)"|getline vเป็นวิธีที่ดีที่สุดที่ฉันสามารถขึ้นมาจะทำในevaluate AWKฉันอาจจะ "โกง" เล็กน้อยเพื่อเรียกสิ่งนี้เพียงแค่AWKเพราะฉันกำลังดำเนินการคำสั่ง แต่อย่างน้อยคำสั่งก็เช่นกันAWK:)

ฉันแน่ใจว่าฉันขาดวิธีการลดจำนวนไบต์ แต่ฉันไม่สามารถดูได้

การใช้งานนั้นค่อนข้างมาตรฐานเช่นใส่รหัสFILEและทำ:

awk -f FILE <<< "bc + ab"

โปรดทราบว่าไม่จำเป็นต้องใช้ช่องว่างและอักขระที่ไม่ใช่ op / non [az] ใด ๆ จะถูกละเว้นอย่างเงียบ ๆ สามารถขยายให้ทำงานกับตัวเลขที่มากกว่า "abcdefghijklmnopqrstuvwxyz" โดยเปลี่ยนลูป ในการแบ่งให้เพิ่ม/ตัวอักษรลงในสตริงการทำงาน :) result <= 0นอกจากนี้จะพิมพ์บรรทัดว่างถ้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.