รถยนต์ Hot Wheels ของฉันเร็วแค่ไหน?


23

เมื่อหลายปีก่อน Hot Wheels สร้างเกมแฟลชง่ายๆที่เรียกว่า"Formula Fuelers Racers" * ในการเล่นเกมคุณเลือกส่วนผสมสามอย่างจากตู้เย็นเพื่อใส่เข้าไปในรถของคุณซึ่งจะแข่งกับรถที่สร้างแบบสุ่มของคอมพิวเตอร์ ปรากฎว่ากลไกของเกมนี้ค่อนข้างเรียบง่าย ก่อนอื่นการ "เวลา" การแข่งขันที่แท้จริงของรถของคุณจะถูกสร้างแบบสุ่มและไม่มีผลใด ๆ เลยว่าคุณชนะการแข่งขันหรือไม่ ประการที่สองผู้ชนะการแข่งขันจะถูกกำหนดโดยคะแนนซึ่งคำนวณจากส่วนผสมที่เลือก (อนุญาตให้ใช้ส่วนประกอบที่ซ้ำกันและลำดับการสั่งซื้อ) แต่ละส่วนผสมมี "คุณค่า" ที่เกี่ยวข้องและ "การทำงาน" ที่เกี่ยวข้องดังที่แสดงในตารางต่อไปนี้:

#   ingredient     val  op
1   Hot Salsa       2   +
2   Root Beer       1   +
3   Milk            1   +
4   Pickle Juice    2   +
5   Mystery Lunch   -3  *
6   BBQ Sauce       2   +
7   Egg             1   +
8   Ketchup         2   +
9   Mustard         -1  *
10  Melon           1   +
11  Chocolate Milk  1   +
12  Mayonnaise      -2  *
13  Baby Food       0   +
14  Pepper          1   +
15  Salt            2   +
16  Syrup           -1  *
17  Salad Dressing  2   +
18  Orange Juice    1   +
19  Soy Sauce       2   +

เพื่อความสะดวกความท้าทายนี้จะอ้างอิงถึงส่วนผสมตามหมายเลขไม่ใช่ชื่อของพวกเขา นี่คือขั้นตอนในการคำนวณคะแนน:

  1. ก่อนอื่นให้เตรียมคะแนนด้วยค่าของส่วนผสมแรก
  2. จากนั้นใช้การดำเนินการของส่วนผสมที่สองเพื่อรวมคะแนนปัจจุบันและมูลค่าของส่วนผสมที่สองเพื่อรับคะแนนที่อัปเดต
  3. ในที่สุดใช้การทำงานของส่วนผสมที่สามเพื่อรวมคะแนนปัจจุบันและมูลค่าของส่วนผสมที่สามเพื่อรับคะแนนสุดท้าย

คะแนนที่สูงขึ้นดีกว่าและชนะคะแนนที่ต่ำกว่าเสมอ

ยกตัวอย่างเช่นส่วนผสมที่มีคะแนนของ1 2 3 (2+1)+1 = 4ส่วนผสมที่มีคะแนนของ7 5 6 (1*-3)+2 = -1ดังนั้นเต้น1 2 37 5 6

ท้าทาย

ในการท้าทายนี้คุณจะต้องเขียนโปรแกรมที่ใช้รายการเรียงลำดับของจำนวนเต็ม 3 และส่งออกคะแนนที่สอดคล้องกัน

อินพุต

โปรแกรมของคุณอาจยอมรับรายการจำนวนเต็มสามตัวในรูปแบบที่สะดวกที่สุด คุณได้รับอนุญาตให้ใช้ 1 การจัดทำดัชนีสำหรับชื่อส่วนผสม (ดังกล่าวข้างต้น) หรือการจัดทำดัชนี 0 (ลบ 1 จากทุกดัชนีด้านบน)

ouput

โปรแกรมของคุณจะต้องแสดงผลเป็นจำนวนเต็มเดียวเพื่อระบุคะแนน

กรณีทดสอบ

4 5 5  =>  18 // max score
5 5 5  =>  -27 // min score
13 13 13  =>  0
1 2 3  =>  4
7 5 6  =>  -1
16 2 19  =>  2
19 7 12  =>  -6

* หน้านี้ค่อนข้างล้าสมัยและไม่สามารถใช้งานได้ในบางเบราว์เซอร์ แต่คุณไม่จำเป็นต้องเล่นเกมสำหรับความท้าทายนี้


1
ดังนั้นโดยทั่วไปซัลซ่า + อาหารกลางวัน + มาโย = อยู่ยงคงกระพัน?
Matthew Roh

3
@SIGSEGV อนุญาตให้ใช้ส่วนผสมที่ซ้ำกันได้ Salsa, อาหารกลางวัน, อาหารกลางวันอนุญาตให้ทำคะแนนได้ 18 คะแนนซึ่งจะเต้น 12 ของคุณ
เลเวลริเวอร์เซนต์


4
ใครเป็นคนเก็บเกลือไว้ในตู้เย็น? :)
Wossname

3
1. ฉันไม่รู้ว่าทำไมเกลือถึงอยู่ในตู้เย็น 2. ใช่เมื่อคุณค้นพบคอมโบ 18 จุดคุณจะอยู่ยงคงกระพันอย่างแท้จริงและเกมไม่มีความหมาย
PhiNotPi

คำตอบ:


13

เยลลี่ 24 ไบต์

“zẈ€$ụ¤’b6’ị@µỊị⁾+׿CFḊV

ทำรายการส่วนผสมที่ทำดัชนี 0 รายการ

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

อย่างไร?

ใช้รูปแบบที่ซับซ้อนเล็กน้อยในการบีบอัดค่าเป็นตัวเลขฐาน -6 และความจริงที่ว่ารายการหลายรายการเป็นค่าลบ แทนที่จะเพิ่มขึ้นเพียง 3 ครั้งเพื่อให้ได้ตัวเลขฐาน -6 การเพิ่มค่าที่สมบูรณ์จะถูกนำมาใช้ซึ่งจะช่วยประหยัดไบต์ด้วยการอนุญาตให้อะตอมเลือกรายการเชิงลบก่อนขั้นตอนประกอบในขณะที่ยังบันทึกไบต์ในฐาน -250 การอัด

“zẈ€$ụ¤’b6’ị@µỊị⁾+׿CFḊV - Main link: 0-based ingredient list  e.g. [6,4,5]
“zẈ€$ụ¤’                 - base 250 compressed number: 120851767994004
        b6               - convert to base 6: [1,1,0,5,0,1,0,3,1,1,4,2,1,0,3,0,1,0,0]
          ’              - decrement: [0,0,-1,4,-1,0,-1,2,0,0,3,1,0,-1,2,-1,0,-1,-1]
           ị@            - index into [reversed @rguments]          [0,4,-1]
             µ           - monadic chain separation (call that x)
              Ị          - insignificant(x)? (abs(x)<=1)            [1,0,1]
                ⁾+×      - ['+','×']
               ị         - index into                               ['+','×','+']
                    C    - complement(x) (1-x)                      [1,-3,2]
                   ż     - zip                                      [['+',1],['×',-3],['+',2]]
                     F   - flatten                                  ['+',1,'×',-3,'+',2]
                      Ḋ  - dequeue                                  [1,'×',-3,'+',2]
                       V - evaluate as Jelly code                   -1

ส่วน "ฐาน 250 ที่บีบอัดหมายเลข" ทำงานอย่างไร
ckjbgames

@ckjbgames zẈ€$ụ¤จะถูกอ่านเป็นดัชนี (ดัชนี 1) ของพวกเขาในหน้ารหัสเยลลี่ซึ่งเป็น[123,188,13,37,226,4]และตีความว่าเป็นหมายเลขฐาน 250: 123*250**5+188*250**4+13*250**3+37*250**2+226*250**1+4*250**0=120851767994004(ดูส่วนสตริงตัวอักษรของการกวดวิชา )
Jonathan Allan

โอ้สตริงตัวอักษร
ckjbgames

นี่เป็นวิธีการของฉันจนกว่าฉันจะรู้ว่า "-3" ไม่ได้หมายความว่า "-3" เมื่อประเมินว่าเป็นรหัส 05AB1E
Magic Octopus Urn

11

JavaScript (ES6), 89 84 82 78 73 ไบต์

รับอินพุตเป็นอาร์เรย์จำนวนเต็ม 3 จำนวนโดยใช้ดัชนี 0

a=>(o=a=>F()<0?a*n:a+n)(o((F=_=>n='5445054524413452545'[a.shift()]-3)()))

กรณีทดสอบ

รุ่นก่อนหน้า 78 ไบต์

รับจำนวนเต็ม 3 จำนวนในรูปแบบ currying (a)(b)(c)โดยใช้ 0-indexing

a=>b=>(o=a=>b=>(n=F(b))<0?a*n:a+n)(o((F=n=>'5445054524413452545'[n]-3)(a))(b))

มันทำงานอย่างไร

สิ่งหนึ่งที่ผิดปกติเล็กน้อยเกี่ยวกับรหัสนี้ก็คือมันใช้เวลาเพียง 2 ข้อโต้แย้งในไวยากรณ์ทั่วไป 'currying' a => b =>และในที่สุดก็ส่งกลับฟังก์ชั่นที่จะใช้เวลาหนึ่ง

ทำให้พังถล่ม

F = n => '5445054524413452545'[n] - 3
o = a => b => (n = F(b)) < 0 ? a * n : a + n
f = a => b => o(o(F(a))(b))
f(a)(b)(c)
  |  |  |
  |  |  +-- 'b' argument of the function returned by the outer call to 'o'
  |  +----- 'b' argument of the function returned by 'f'
  +-------- 'a' argument of 'f'

กรณีทดสอบ


1
พูดอย่างเคร่งครัดคุณจะรับ 1 อาร์กิวเมนต์และส่งคืนฟังก์ชันที่ใช้ 1 อาร์กิวเมนต์คำนวณค่าเพื่อเรียกใช้ฟังก์ชันที่รับ 1 อาร์กิวเมนต์และส่งคืนฟังก์ชันที่ใช้ 1 อาร์กิวเมนต์และส่งคืนฟังก์ชันสุดท้าย ...
Neil

6

Befunge, 74 73 ไบต์

>&:0`!#^_1g68*-^:0`!#v_+
^2112-212/11.012/212 >*
^   @.$<       >">"35*0p

ลองที่นี่! มันแปลกที่รหัสของฉันใช้ได้กับล่ามตัวนี้เท่านั้น

โดยทั่วไปแถวที่สองจะมีค่าทั้งหมดจากตาราง ค่าที่ไม่ใช่ตัวเลขนั้นเป็นค่าลบตามจริงที่มาก่อนตัวเลขในตาราง ASCII มีตรรกะนิดหน่อยที่กำหนดว่าตัวเลขเป็นลบหรือไม่และถ้าเป็นเช่นนั้นตัวเลขนี้จะถูกคูณด้วยผลลัพธ์

ทางด้านขวาของแถวที่สามเริ่มต้นหมายเลขแรก ถ้าฉันไม่ต้องทำอย่างนั้นฉันก็สามารถประหยัดได้มาก


6

PHP, 128 ไบต์

$i="5445054524413452545";[,$a,$b,$c]=$argv;echo(bc.($i[$c]-3<0?mul:add))((bc.($i[$b]-3<0?mul:add))($i[$a]-3,$i[$b]-3),$i[$c]-3);

PHP, 138 ไบต์

$d=decbin(506743);$i="5445054524413452545";[,$a,$b,$c]=$argv;echo(bc.($d[$c]?add:mul))((bc.($d[$b]?add:mul))($i[$a]-3,$i[$b]-3),$i[$c]-3);

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

ขยาย

$d=decbin(506743);
$i="5445054524413452545";
[,$a,$b,$c]=$argv;
echo(bc.($d[$c]?add:mul))((bc.($d[$b]?add:mul))($i[$a]-3,$i[$b]-3),$i[$c]-3);

6

Python 2 , 123 110 107 ไบต์

a,b,c=input()
s=[int(i)-3for i in'05445054524413452545']
n=s[a]
for i in s[b],s[c]:n=[n*i,n+i][n>0]
print n

ลองออนไลน์!


-3 ไบต์ขอบคุณ @mathjunkie


1
นี่คือรุ่นที่ปรับปรุงแล้ว 118 ไบต์
Mr. Xcoder

2
5445054524413452545จากนั้นการลบ 3 อาจช่วยให้คุณประหยัดจำนวนไบต์
Magic Octopus Urn

1
n=[n+i,n*i][i<0]ข้างในลูปจะช่วยให้คุณประหยัด 3 ไบต์
คณิตศาสตร์ junkie

5

05AB1E , 29 ไบต์

•6SÚ²ÄOÕ6BS3-©¹è|v®yèD0‹i*ë+

ลองออนไลน์!

•6SÚ²ÄOÕ6BS3-©               # Push [2, 1, 1, 2, -3, 2, 1, 2, -1, 1, 1, -2, 0, 1, 2, -1, 2, 1, 2] and store.
               ¹è             # Get first score.
                 |v           # Iterate through remaining scores.
                   ®yèD0‹i*ë+ # Push score list, grab relevant score.
                              # If negative, multiply, else add.

ใช้งานได้จริงกับอินพุตมากหรือน้อยตามที่คุณต้องการดังนั้นคุณสามารถมีรถยนต์ที่มี 4 คุณลักษณะขึ้นไปหรือรถยนต์ที่มีเพียง 2 อย่างนี้ไม่ได้ตั้งใจโดยเจตนาว่าจะจบลงอย่างไร


5

CJam , 43 38 ไบต์

q~[YXXY-3YXYWXX-2TXYWYXY]f={_W>42+c~}*

อาจมีวิธีบีบอัดรายการเพิ่มเติม ...

ใช้การจัดทำดัชนีแบบ 0

ลองออนไลน์!

คำอธิบาย

โปรแกรมนี้ใช้ประโยชน์จากความจริงที่ว่าค่านั้นเป็นแบบหลายค่าแทนการเติมถ้าหากมันเป็นค่าลบ

q~                     e# Get the list from input
  [...]                e# Push the list of values for each ingredient. T=0, W=-1, 
                       e#   X=1, Y=2. 
       f=              e# Get the elements at the given indices 
         {             e# Reduce over this block:
          _W>          e#  Check if the second number is > -1 (returning 0 or 1)
             42+c      e#  Add the result to 42 and cast to a char. 
                       e#    (ASCII 42 is * and 43 is +)
                 ~     e#  Eval the char (* is multiply, + is add)
                  }*   e# (end block)

+ *เคล็ดลับดี!
แยกผลไม้

3

Lua, 140 131 ไบต์

i={2,1,1,2,-3,2,1,2,-1,1,1,-2,0,1,2,-1,2,1,2}function f(a,b,c)loadstring(("print("..i[a].."+"..i[b].."+"..i[c]..")"):gsub('%+%-','*-'))()end

i={2,1,1,2,-3,2,1,2,-1,1,1,-2,0,1,2,-1,2,1,2}function f(a,b,c)x,y,z=i[a],i[b],i[c]v=y>0 and x+y or x*y;print(z>0 and v+z or v*z)end

3

JavaScript, 85 72 ไบต์

a=a=>eval(a.map(x=>(b="5445054524413452545"[x]-3,b<0?"*":"+")+b).join``)

รับอินพุตในรูปแบบ[a,b,c]
-13 ไบต์ขอบคุณ ETHproductions


คุณสามารถทำได้x=>(b="...",b<0?"*":"+")+bเพื่อหลีกเลี่ยงการreturnฉันคิดว่า (นอกจากนี้คุณไม่จำเป็นต้อง[... ]ทำดัชนีทำงานบนสตริง)
ETHproductions

@ETHproductions ฉันได้รับ "Expected ';' มันอาจเป็นเบราว์เซอร์ของฉันใช้a=a=>eval(a.map(x=>(b="5445054524413452545"[x]-3,b<0?"*":"+")+b)).join``)งานได้สำหรับคุณ
Bald Bantha

คุณได้รับเพิ่ม)หลังจาก+bนั้นฉันเชื่อว่า
ETHproductions

2

R, 125 123 ไบต์

function(a,b,c){v=c(5,4,4,5,0,5,4,5,2,4,4,1,3,4,5,2,5,4,5)-3
o=rep("+",19)
o[v<0]="*"
get(o[c])(get(o[b])(v[a],v[b]),v[c])}

ฟังก์ชั่นไม่ระบุชื่อที่ใช้จำนวนเต็มสามค่าเป็นอินพุต o3(o2(v1,v2),v3)กำหนดรายการค่าและการดำเนินงานและประเมินแล้วเพียงแค่คนที่เรียกโดยการป้อนข้อมูลเช่น มีวิธีการเล่นกอล์ฟที่แน่นอนกว่านี้!

ปรับปรุง:หลังจากที่บางอีกครั้งการทำงานผมมีทางเลือกที่ยัง123 ไบต์ ฟังก์ชั่นที่ไม่ระบุชื่ออีกครั้ง แต่รับอินพุตเป็นเวกเตอร์เดียวที่มีสามค่า ใช้วิธีการเดียวกันโดยกำหนดรายการค่าและการดำเนินการและประเมินผล

function(x,f=c(sum,prod)[x[-1]%in%c(5,9,12,16)+1],s=c(5,4,4,5,0,5,4,5,2,4,4,1,3,4,5,2,5,4,5)[x]-3)f[[2]](el(f)(s[-3]),s[3])

2

Haskell, 186 116 112 108 ไบต์

o x|x<0=(*)|0<1=(+)
v=(map((-51+).fromEnum)"95445054524413452545"!!)
w [x,y,z]=(o z)((o y)x y)z
k=w.map v

kหน้าที่หลักคือ ใหม่สำหรับ Code Golf ดังนั้นฉันมั่นใจว่ามีไม่กี่ไบต์ที่ฉันสามารถโกนออกได้ด้วยการใช้อย่างชาญฉลาด$ตัวดำเนินการเมื่อเทียบกับวงเล็บ ฉันอาจจะปรับปรุงคำตอบในขณะที่ฉันยังคงพบการปรับปรุง

เป็นหลักโปรแกรมสามารถแบ่งลงดังนี้:

  • v คือฟังก์ชันที่รับดัชนีตาม 1 และส่งกลับค่าของรหัสอาหารนั้น
  • o เป็นฟังก์ชั่นที่รับค่าอาหารและคืนค่าตัวดำเนินการที่เหมาะสม (เช่นค่าลบมัก*เป็นค่าบวกเสมอ+)
  • w คือฟังก์ชั่นที่รับรายการของ 3 ฟังก์ชั่นบางส่วนของการvแม็พกับจำนวนเต็มอินพุตและดึงข้อมูลการดำเนินการและค่าที่เหมาะสมจากแต่ละค่า
  • k คือฟังก์ชั่นหลักในสไตล์ฟรีพ้อยท์ที่แมป v กับอินพุตและเขียนรายการนี้สำหรับ w เพื่อส่งคืนเอาต์พุต

UPDATE

ขอขอบคุณเป็นพิเศษสำหรับการชี้เคล็ดลับ fromEnum! ที่ได้ผลออกมาอย่างดี นอกจากนี้ฉันพลาดส่วนหนึ่งในกฎที่ระบุวิธีแก้ปัญหาที่ยอมรับได้อาจเป็นฟังก์ชั่นที่รับรายการจำนวนเต็ม นั่นช่วยประหยัดงานได้อย่างมาก

อัพเดท 2

ตามคำแนะนำอื่น ๆ ให้ทำการโกนไบต์จำนวนหนึ่งโดยจัดเรียงการดำเนินการใหม่สร้างชุดป้องกันอื่นที่ประเมินค่าเป็น True เสมอและการจับคู่รูปแบบบน W ที่รูปแบบนั้นตรงกับรายการองค์ประกอบ 3 รายการ ขอบคุณสำหรับคำแนะนำ!

อัพเดท 3

ต้องขอขอบคุณ Laikoni อีกครั้งสำหรับการชี้ให้เห็นกฎกติกากอล์ฟที่ฉันไม่รู้ นอกจากนี้การแม็พ v กับอินพุตของฉันเพื่อสร้างรายการฟังก์ชั่นที่ใช้บางส่วนเป็นแนวคิดที่น่าอัศจรรย์และช่วยฉันเพิ่มอีก 4 ไบต์!


1
ยินดีต้อนรับสู่การเล่น PPCG และ Haskell โดยเฉพาะ! คุณสามารถบันทึกจำนวนมากไบต์โดยการเขียนฟังก์ชั่น[Int] -> Intแทนการอ่านจาก stdin และการเขียนไปยัง stdout การทำเช่นนั้นได้รับอนุญาตโดยค่าเริ่มต้น แต่ในกรณีนี้มันได้กล่าวถึงอย่างชัดเจนในความท้าทายที่ taling รายการจำนวนเต็มตามอินพุตเป็นที่ยอมรับ
Laikoni

1
การใช้fromEnumแทนdigitToIntมีแนวโน้มที่จะสั้นลงเพราะช่วยให้คุณสามารถนำเข้าที่ลดลง
Laikoni

@Laikoni ขอบคุณมากสำหรับการชี้ให้เห็นกฎบางอย่างที่ข้าไม่รู้! เคล็ดลับ fromEnum ทำงานเหมือนมีเสน่ห์เหมือนกันฉันไม่รู้ว่าทำไมฉันไม่คิดว่าจะทำงานจากรหัส ASCII แต่นั่นก็ช่วยประหยัดจำนวนมหาศาลเช่นกัน
maple_shaft

1
v=(map((-51+).fromEnum)"95 ... 5"!!)บันทึกสองวงเล็บ o x|x<0=(*)|0<1=(+)บันทึกหนึ่งไบต์ในยามที่สอง
Laikoni

1
ในwเป็นพื้นที่พิเศษเหลือ นอกจากนี้เนื่องจากคุณจำเป็นต้องจัดการรายการความยาว 3 เท่านั้นคุณสามารถใช้w[x,y,z]=เป็นการจับคู่รูปแบบ
Laikoni

0

Haskell, 92 87 ไบต์

x#y|x<0=(y*)|0<1=(y+)
k[x,y,z]=z#z$y#x$y
k.map([read[q]-3|q<-"95445054524413452545"]!!)

ลองออนไลน์!

จากคำตอบของ @ maple_shaft ฉันแค่แยกมันออกมาเล็กน้อย

ขอบคุณ @Laikoni 5 ไบต์!



@Laikoni ฉันค่อนข้างมั่นใจว่าบรรทัดใหม่นับ
BlackCap

ฉันไม่ได้นับสองไบต์f=เพราะฟังก์ชั่นนิรนามอนุญาตให้ส่งได้ พวกเขาจำเป็นต้องใช้เพื่อให้ตัวอย่าง tio ทำงานได้เท่านั้น
Laikoni

0

C, 171 161 ไบต์

#include<stdio.h>
r,z[3],*a=z,i;f(x){i?x<0?r*=x:(r+=x):(r=x);}main(){scanf("%d %d %d",a,a+1,a+2);for(;i++<3;f("05445054524413452545"[*a++]-51));printf("%d",r);}

0

รหัสเครื่อง 8086, 62 ไบต์

00000000  be 3b 01 31 c0 86 c4 ac  e8 0a 00 81 fe 3e 01 72  |.;.1.........>.r|
00000010  f4 b4 4c cd 21 bb 32 01  d0 e8 d7 73 03 c0 e0 04  |..L.!.2....s....|
00000020  c0 f8 04 e3 05 31 c9 c3  86 c4 78 03 00 e0 c3 f6  |.....1....x.....|
00000030  ec c3 21 12 d2 12 f1 1e  01 2f 12 00 00 00        |..!....../....|
0000003e

สามไบต์สุดท้ายมีอินพุต (zero-indexed) เฮ้คุณบอกฉันว่าฉันสามารถใช้รูปแบบอินพุตที่สะดวกที่สุดได้ ในกรณีนี้นั่นเป็นรหัสฮาร์ดโค้ด!
เอาต์พุตคือโค้ดระบุความผิดพลาดที่ส่งคืนไปยังเชลล์

มันทำงานอย่างไร:

            |   org 0x100
            |   use16
be 3b 01    |       mov si, input   ; source = input
31 c0       |       xor ax, ax      ; clear ax
86 c4       |   @@: xchg al, ah     ; swap al/ah (ah = total value)
ac          |       lodsb           ; al = *si++
e8 0a 00    |       call fn
81 fe 3e 01 |       cmp si, input+3 ; end of input?
72 f4       |       jb @b           ; repeat if not
b4 4c       |       mov ah, 0x4c    ; dos function: exit with al=error code
cd 21       |       int 0x21        ; syscall
            |
bb 32 01    |   fn: mov bx, table   ; pointer to lookup table
d0 e8       |       shr al, 1       ; divide input by 2
d7          |       xlatb           ; al = *(bx + al)
73 03       |       jnc @f          ; skip next instruction if input was odd
c0 e0 04    |       shl al, 4       ; shift low nibble to high nibble
c0 f8 04    |   @@: sar al, 4       ; shift high nibble to low nibble with sign-extension
e3 05       |       jcxz @f         ; return if cx is non-zero (only happens for the first input)
31 c9       |       xor cx, cx      ; clear cx
c3          |       ret
86 c4       |       xchg al, ah     ; swap al/ah (al = total value)
78 03       |   @@: js @f           ; multiply if negative, add if positive
00 e0       |       add al, ah      ; al = al+ah
c3          |       ret
f6 ec       |   @@: imul ah         ; ax = al*ah
c3          |       ret
21 12 d2 12 |   table db 0x21, 0x12, 0xd2, 0x12, 0xf1, 0x1e, 0x01, 0x2f, 0x12
f1 1e 01 2f |                       ; each value is stored in a 4-bit nibble
12          |
00 00 00    |   input db 3 dup(0)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.