ล่ามกอล์ฟที่เรียบง่าย


13

ท้าทาย:

งานของคุณคือการสร้างล่ามอย่างง่ายสำหรับภาษากอล์ฟที่ง่าย


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

อินพุตจะอยู่ในรูปแบบของสตริงคั่นด้วยช่องว่าง

คุณสามารถแทนที่การแยกพื้นที่ด้วยสิ่งที่คุณต้องการ


เอาท์พุท:

เอาต์พุตผลลัพธ์ (ตัวเลขหรือสตริง) ที่ได้รับหลังจากดำเนินการทั้งหมด หากมีมากกว่าหนึ่งเอาต์พุตเข้าร่วมร่วมกันเพื่อให้ผลลัพธ์เดียว (ไม่มีตัวคั่น) ค่าเริ่มต้นของตัวแปรนั้นเป็นศูนย์เสมอ เช่น: มันเริ่มต้นที่0


ไวยากรณ์ภาษา:

ภาษามีตัวดำเนินการดังต่อไปนี้:

inc  ---> add one to variable
dec  ---> remove one from variable
mult ---> multiply variable by 2
half ---> divide the variable by 2
Pri  ---> print the variable to console (or whatever your language has)
exit ---> end the program (anything after this is ignored)

ตัวอย่าง:

inc inc inc dec Pri exit                 ---> 2
dec inc mult inc inc Pri                 ---> 2
inc inc inc mult half Pri exit inc       ---> 3
inc Pri inc Pri inc Pri exit half mult   ---> 123
Pri exit                                 ---> 0
inc half Pri exit                        ---> 0.5 

ข้อ จำกัด :

นี่คือรหัส - กอล์ฟดังนั้นรหัสที่สั้นที่สุดเป็นไบต์สำหรับแต่ละภาษาจะชนะ


บันทึก:

  • อินพุตจะถูกต้องเสมอ (สตริงของตัวดำเนินการคั่นด้วยช่องว่าง)
  • คุณสามารถปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุดหากคุณไม่ต้องการตำแหน่งทศนิยม

3
ฉันสามารถใช้รายการสตริงได้หรือไม่? ฉันสามารถใช้อักษรตัวพิมพ์ใหญ่อื่นได้หรือไม่
user202729

เพิ่มกรณีออกจากระบบหรือไม่ ทางออกควรสำคัญ
l4m2

1
@Kaldo: คุณสามารถแยกโดยใช้บรรทัดใหม่
Muhammad Salman

3
อืมฉันจะไม่เรียกภาษานั้นว่า "ภาษากอล์ฟ"
Paŭlo Ebermann

1
นี่คือเดดฟิชที่มีสองและครึ่งแทนที่จะเป็นสี่เหลี่ยมและชื่อคำสั่งที่ยาวกว่า
คิงคิง

คำตอบ:


8

Bash , 61 ไบต์

sed '1i0
s/.//2g;y"idmhe"+-*/q";/+\|-/i1
/*\|\//i2
/P/cdn'|dc

ลองออนไลน์!

แปลงโปรแกรมเป็นโปรแกรม dc จากนั้นประเมินว่าเป็นรหัส dc สิ่งนี้จะรับอินพุตแยกจากกันโดยขึ้นบรรทัดใหม่ โปรดทราบว่า dc เป็นแบบสแต็กและใช้สัญลักษณ์ขัดเงาย้อนกลับ

อินพุตถูกส่งไปยัง sed ก่อน

1i0 ในบรรทัดแรกของอินพุตให้ใส่ (เสริม) a 0 นี่จะเป็นตัวสะสม

s/.//2g ลบทุกอย่างยกเว้นอักขระแรกในแต่ละบรรทัด

y"idmhe"+-*/q"ถอดidmheเข้า+-*/qตามลำดับ + - * / เป็นคำสั่งทางคณิตศาสตร์และ Q จบการทำงานของโปรแกรม

/+\|-/ในทุกบรรทัดที่มี + หรือ - ให้i1แทรก 1

/*\|\//ในทุกบรรทัดที่มี * หรือ / ให้i2แทรก 2

/P/ในทุกบรรทัดที่มี P ให้cdnเปลี่ยนเป็นdnเทียบเท่ากับซ้ำและเอาท์พุทโดยไม่ต้องขึ้นบรรทัดใหม่ใน dc

ตอนนี้สิ่งนี้ถูกประเมินว่าเป็นนิพจน์ dc


2
ฉันคิดว่ามันไม่สมเหตุสมผลที่จะคาดหวังว่าsedไวยากรณ์จะกลายเป็นเอเลี่ยนมากกว่าที่คิดไว้ก่อนหน้านี้เมื่อเล่นกอล์ฟ
Mateen Ulhaq

6

เยลลี่ 21 ไบต์

ḲḢ€O%11ị⁾’‘j“IȮḤH”¤VI

ลองออนไลน์!


โปรดทราบว่าค่า ASCII ของอักขระตัวแรก ( idmhPe) modulo 11 เป็นแบบโมดูโลที่ไม่ซ้ำกัน 6


ใช้แบบโมดูโล 16:

เยลลี่ 21 ไบต์

ḲḢ€O%⁴ị“ḢwġḞkz’ṃØJ¤VI

ลองออนไลน์!

สตริงที่ใช้ในการจัดทำดัชนีเป็นḤH‘’IȮในกรณีนี้ ‘’นี้ไม่มีอีกต่อไปในขอบเขต


การใช้ 11 ไบต์เพื่อแทนสตริง 6 ไบต์คือ ... แย่เกินไป แต่ ... “”ใช้เวลา 2 ไบต์, ¤ใช้เวลา 1 ไบต์, ข้อมูลตัวเองใช้เวลา 6 ไบต์, เหลือ 2 ไบต์ในการทำบางสิ่งบางอย่าง ปัจจุบันมันและjแต่ịØJหรือṃØJแย่กว่านั้นมากและไม่ทำงาน (เพราะ Unicode)
user202729

แนวคิดสตริงของ jli ("สตริงคือรายการของจำนวนเต็มที่มีค่าสถานะพิเศษเพื่อส่งผลต่อการพิมพ์") นั้นยอดเยี่ยม
user202729

5

R , 128 125 ไบต์

Reduce(function(x,y)switch(y,i=x+1,d=x-1,m=x*2,h=x/2,P={cat(x);x}),substr(el(strsplit(gsub("e.*$","",scan(,""))," ")),1,1),0)

ลองออนไลน์!

ต้องเรียกด้วยsource(echo=FALSE)เพื่อป้องกันไม่ให้ค่าส่งคืนถูกพิมพ์โดยอัตโนมัติ ทางเลือกอื่นคือห่อทุกอย่างไว้ในinvisibleนั้น แต่มันก็น้อยกว่าที่เล่นกอล์ฟมาก (และทำให้ซากของฉันดีขึ้น


3

05AB1E , 25 ไบต์

΀¬"idmhPe"S"><·;=q"S‡J.V

ลองออนไลน์!

แม็พแต่ละฟังก์ชั่นภาษากับฟังก์ชั่น 05AB1E ที่เกี่ยวข้อง (ใช้อักขระตัวแรกของแต่ละฟังก์ชั่น) จากนั้นเรียกใช้งานสตริงผลลัพธ์เป็นรหัส 05AB1E



2

Python 2 , 131 125 122 121 118 117 115 ไบต์

v=0;o=""
for x in input().split("x")[0].split():
 if"Q">x:o+=`v`
 else:v+=(1,-1,v,-v/2.)['idmh'.find(x[0])]
print o

ลองออนไลน์!

-6 และ -3 ด้วย @Rod

-3 และ -2 ด้วย @etene

-1 โดยแทนที่"Pri"==xด้วย"P"in x


คุณสามารถsplitบน"exit"และได้รับบล็อกที่ 1 แทนbreakไอเอ็นจีประหยัด 4 ไบต์
ร็อด

1
คุณสามารถลบวงเล็บที่อยู่รอบ ๆ'idmh'และใช้findแทนindexซึ่งจะประหยัดไม่กี่ไบต์
etene

@Rod - จริง ๆ แล้วสามารถเพิ่มเติมเล็กน้อยและแยกexเพื่อบันทึกอีก 2
ElPedro

คุณสามารถแทนที่v=(v+1,v-1,v*2,v/2.)ด้วยv+=(1,-1,v,-v/2.)มันควรจะทำงานไม่ได้ทดสอบว่า
ร็อด

@Rod - คิดว่าเกี่ยวกับที่ halfแต่ไม่สามารถทำงานออกวิธีการทำ ง่ายมาก! ขอบคุณ
ElPedro

2

Python 3 , 110 91 82 ไบต์

exit จะทำให้โปรแกรมออกจากข้อผิดพลาด

x=0
for c in input():c=='P'==print(x,end='');x+=(1,-1,x,-x/2,c,0)['ndmhx'.find(c)]

ลองออนไลน์!


ย่อชื่อตัวแปรของคุณเพื่อบันทึก 9 ไบต์ i='x+=1';d='x-=1';...และจากนั้นในการexecโทรของคุณเปลี่ยนเป็นexec(eval(c[0]))
mypetlion

@mypetlion ขอบคุณ แต่ฉันพบวิธีที่ดีกว่า
mbomb007

ฉันคิดว่ามันถูกต้อง: 82 bytes
Lynn

@ ลินน์เยี่ยมมาก! ฉันไม่คิดว่าเป็นวิธีที่ดีในการลัดวงจรprintคำสั่ง!
mbomb007

2

JavaScript (ES6), 83 79 ไบต์

บันทึกแล้ว 4 ไบต์ด้วย @ l4m2

วนซ้ำคำสั่งด้วยเอาต์พุตหรือสตริงว่างซ้ำ

s=>s.replace(/\S+./g,w=>m<s?'':w<{}?m:(m+={d:-1,e:w,i:1,m}[w[0]]||-m/2,''),m=0)

ลองออนไลน์!

แสดงความคิดเห็น

s =>                       // given the input string s
  s.replace(/\S+./g, w =>  // for each word w in s:
    m < s ?                //   if m is a string:
      ''                   //     ignore this instruction
    :                      //   else:
      w < {} ?             //     if w is 'Pri' ({} is coerced to '[object Object]'):
        m                  //       output the current value of m
      : (                  //     else:
          m +=             //       add to m:
            { d: -1,       //         -1 if w is 'dec'
              e: w,        //         w  if w is 'exit' (which turns m into a string)
              i: 1,        //         1  if w is 'inc'
              m            //         m  if w is 'mult'
            }[w[0]]        //       using the first character of w to decide
            || -m / 2,     //       or add -m/2 (for 'half') if the above result was falsy
        ''),               //       do not output anything
    m = 0                  //   m = unique register of our mighty CPU, initialized to 0
  )                        // end of replace()

s=>s.replace(/\S+./g,w=>k<s?'':w<{}?k:(k+={d:-1,e:w,i:1,m:k}[w[0]]||-k/2,''),k=0)
l4m2

@ l4m2 นี่w<{}คือความชั่วร้ายที่บริสุทธิ์: p
Arnauld

s=>s.replace(/\S+./g,e=>m<s?'':e<{}?m:(m+={d:-1,e,i:1,m}[e[0]]||-m/2,''),m=0)ยังใช้งานได้
l4m2

2

ถ่าน , 37 35 ไบต์

≔⁰ηF⎇№θx…θ⌕θxθ≡ιn≦⊕ηd≦⊖ηm≦⊗ηh≦⊘ηrIη

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แรงบันดาลใจจากคำตอบของ @ RickHitchcock คำอธิบาย:

≔⁰η

เคลียร์ตัวแปร

F⎇№θx…θ⌕θxθ≡ι

ตัดทอนอินพุตที่xif ถ้ามีอย่างใดอย่างหนึ่งแล้ววนซ้ำและสลับแต่ละอักขระของ (ส่วนที่เหลือ) อินพุต

n≦⊕η

nฉันnสร้างตัวแปร

d≦⊖η

d d ecrements ตัวแปร

m≦⊗η

m m ultiplies ตัวแปรโดยสอง (เช่นคู่)

h≦⊘η

h h alves ตัวแปร

rIη

rp r ints ส่งตัวแปรไปที่สตริง


1
@ RickHitchcock ขออภัยไม่ทดสอบอย่างละเอียดพอ ฉันพบวิธีแก้ปัญหา แต่ค่าใช้จ่ายฉันเป็นไบต์
Neil

2

JavaScript (ES6), 77 75 ไบต์

(ยืม ( stole ) @ เคล็ดลับของ Arnauld ในการใช้mเป็นชื่อตัวแปรประหยัด 2 ไบต์)

f=([c,...s],m=0)=>c<'x'?(c=='P'?m:'')+f(s,m+({h:-m/2,d:-1,n:1,m}[c]||0)):''

เดินสายซ้ำโดยมองหาตัวอักษรที่แตกต่างกันต่อการเรียนการสอนและละเว้นส่วนที่เหลือ:

  • n: inc
  • d: ธันวาคม
  • m: mult
  • h: ครึ่งหนึ่ง
  • P: Pri
  • x: ออก

ใช้ประโยชน์จากความจริงที่ว่าundefinedจะสูงกว่าค่ามากกว่าหรือน้อยกว่า'x'ที่ก่อให้เกิดการเรียกซ้ำเพื่อหยุดในตอนท้ายของสตริงหรือเมื่อมันเจอ'x'ในทางออก


1
ติดตามความคิดเห็นที่ถูกลบไปแล้วซึ่งแน่นอนว่าฉันไม่สามารถตอบได้อีกต่อไปฉันลืมที่จะวางลิงค์ไปยังรหัสที่ถูกต้อง (d'oh!) แต่ฉันพบวิธีการใหม่ที่สั้นกว่าความพยายามดั้งเดิมของฉัน 2 ไบต์
Neil

1

JavaScript (Node.js) , 107 ไบต์

f=s=>s.split` `.map(([o])=>F?0:o=="i"?i++:o=="d"?i--:o=="m"?i*=2:o=="h"?i/=2:o=="P"?S+=i:F=1,F=i=0,S="")&&S

ลองออนไลน์!



สิ่งนี้ควรนับเป็น 105 ไบต์ afaik ตราบใดที่ฟังก์ชันของคุณไม่เรียกตัวเองคุณไม่จำเป็นต้องนับf=
Brian H.

1

JavaScript (Node.js) , 91 ไบต์

_=>_.split` `.map(o=>o<{}>!_?S+=+i:o<"e"?i--:o<"f"?++_:o<"i"?i/=2:o<"j"?i++:i*=2,i=S="")&&S

ลองออนไลน์!

JavaScript (Node.js) , 96 ไบต์

_=>_.split` `.map(o=>F?0:o<"Q"?S+=i:o<"e"?i--:o<"f"?F=1:o<"i"?i/=2:o<"j"?i++:i*=2,F=i=0,S="")&&S

ลองออนไลน์!

JavaScript (Node.js) , 99 ไบต์

s=>s.split` `.map(_=>eval('++i7--i7++e7u+=+i7i*=27i/=2'.split(7)[Buffer(e+_)[0]%11%6]),e=i=u='')&&u

ลองออนไลน์!




1

Lua, 207 ไบต์

s=0;n=0;for a in io.read():gmatch'.'do if s==0 then s=1;n=a=='i'and n+1 or a=='d'and n-1 or a=='m'and n*2 or a=='h'and n/2 or n;if a=='P'then print(n)elseif a=="e"then break end elseif a==' 'then s=0 end end

1

Python 3 , 114 110 109 116 ไบต์

จริงๆแล้วจะใช้สองไบต์น้อยกว่าใน Python 2 เพราะexecเป็นคำสั่งและไม่จำเป็นต้องใช้วงเล็บ ...

  • บันทึก 4 ไบต์พิเศษด้วย @ElPedro

  • บันทึกไบต์พิเศษโดยใช้ประโยชน์จากข้อเท็จจริงที่findส่งกลับ -1 เมื่อเกิดข้อผิดพลาดซึ่งสามารถใช้เป็นดัชนีได้

  • +7 ไบต์เพราะฉันไม่ได้สังเกตเห็นกฎไม่มีการขึ้นบรรทัดใหม่ :(

i=0;exec(";".join("i+=1 i-=1 i*=2 i/=2 print(i,end='') exit()".split()["idmhP".find(h[0])]for h in input().split()))

ลองออนไลน์!

แมปอักขระตัวแรกของทุกคำที่ป้อนเข้ากับโค้ด Python เหล่านี้จะถูกตัดแบ่งแล้วและexecเอ็ด

วิธีการตรงไปตรงมาค่อนข้างที่อาจจะ golfed อีกเล็กน้อย ความยากลำบากส่วนใหญ่อาศัยอยู่ในการหารูปแบบที่สั้นที่สุดจากหลาย ๆ ที่เป็นไปได้ ...


112 ลองออนไลน์! หากคุณมีคำสั่งเป็นช่องว่างแยกสตริงและแยกมัน
ElPedro

1
110 ในความเป็นจริงแล้ววงเล็บสามารถไปลองออนไลน์!
ElPedro

นี่ไม่ได้ให้ผลลัพธ์ที่ถูกต้อง print(i,end='')คำถามที่ว่าคุณจะต้องพิมพ์โดยไม่ต้องแยกดังนั้นคุณต้อง ดูกรณีทดสอบที่ 4
mbomb007

ฉันไม่ได้สังเกตฉันจะแก้ไข ขอบคุณมาก!
etene

@etene ความคิดเห็นเมื่อคุณแก้ไขแล้วฉันจะลบ downvote ของฉัน
mbomb007

1

Ruby + -na, 81 73 65 ไบต์

x=0;$F.map{|w|eval %w{x+=1 x-=1 1/0 $><<x x*=2 x/=2}[w.ord%11%6]}

ลองออนไลน์!

ค่อนข้างตรงไปตรงมา สำหรับตัวอักษรตัวแรกของแต่ละคำค้นหาสตริงคำสั่งที่เกี่ยวข้องและevalมัน ใช้จำนวนเต็มส่วนและโดยการขว้างปาexitsZeroDivisionError

-5 ไบต์: ใช้.ord%11%6แทนการค้นหาสตริง เครดิตไปที่user202729

-3 ไบต์: จะพิจารณาตัวอักษรตัวแรกของสตริงเพื่อให้สามารถข้าม.ord[0]

-8 ไบต์: ใช้การ-aตั้งค่าสถานะเพื่อแยกอินพุตโดยอัตโนมัติด้วยKirill L.


1
คุณสามารถบันทึกไบต์ได้มากขึ้นโดยการเพิ่ม-aตัวเลือกในการทำ autosplit ให้คุณแบบนี้
Kirill L.

1

อิโมจิโคด , 270 ไบต์

🐖🔥🍇🍮c 0🔂j🍡💣🐕🔟 🍇🍊😛j🔤inc🔤🍇🍮c➕c 1🍉🍋😛j🔤dec🔤🍇🍮c➖c 1🍉🍋😛j🔤mult🔤🍇🍮c✖️c 2🍉🍋😛j🔤half🔤🍇🍮c➗c 2🍉🍋😛j🔤Pri🔤🍇👄🔡c 10🍉🍓🍇🍎🍉🍉🍉

ลองออนไลน์!

🐋🔡🍇
🐖🔥🍇
🍮c 0
🔂j🍡💣🐕🔟 🍇
🍊😛j🔤inc🔤🍇🍮c➕c 1🍉
🍋😛j🔤dec🔤🍇🍮c➖c 1🍉
🍋😛j🔤mult🔤🍇🍮c✖️c 2🍉
🍋😛j🔤half🔤🍇🍮c➗c 2🍉
🍋😛j🔤Pri🔤🍇👄🔡c 10🍉
🍓🍇🍎🍉🍉🍉🍉

🏁🍇
 🔥🔤inc inc inc dec Pri exit🔤
😀🔤🔤
 🔥🔤dec inc mult inc inc Pri🔤
😀🔤🔤
 🔥🔤inc inc inc mult half Pri exit inc🔤
😀🔤🔤
 🔥🔤inc Pri inc Pri inc Pri exit half mult🔤
😀🔤🔤
 🔥🔤Pri exit🔤
😀🔤🔤
 🔥🔤inc half Pri exit🔤
🍉

0

SNOBOL4 (CSNOBOL4) , 165 ไบต์

	P =INPUT ' exit ' 
	x =0
S	P LEN(1) $ L ARB ' ' REM . P	:S($L)F(end)
i	X =X + 1	:(S)
d	X =X - 1	:(S)
P	O =O X		:(S)
m	X =X * 2	:(S)
h	X =X / 2.	:(S)
e	OUTPUT =O
END

ลองออนไลน์!

ทั้งหมด

	P =INPUT ' exit ' 				;* append ' exit ' to the input to guarantee that the program will stop
	x =0						;* initialize x to 0 else it won't print properly if the program is 'Pri'
S	P LEN(1) $ L ARB ' ' REM . P	:S($L)F(end)	;* set L to the first letter of the word and goto the appropriate label
i	X =X + 1	:(S)
d	X =X - 1	:(S)
P	O =O X		:(S)				;* append X to the output string
m	X =X * 2	:(S)
h	X =X / 2.	:(S)				;* divide by 2. to ensure floating point
e	OUTPUT =O					;* print whatever's in O, which starts off as ''
END

0

C # (.NET Core), 186 ไบต์

class P{static void Main(string[]a){int v=0;foreach(var s in a){var i=s[0];if(i=='i')v++;if(i=='d')v--;if(i=='m')v*=2;if(i=='h')v/=2;if(i=='P')System.Console.Write(v);if(i=='e')break;}}}

คุณสามารถโกนออกได้ 26 ไบต์โดยทำสิ่งง่าย ๆ เช่นประกาศiกับvโต๊ะ ASCII เพื่อให้คุณสามารถใช้ตัวเลขขนาดเล็กจัดเรียงifs แล้วใช้ ternary: class Z{static void Main(string[]a){int v=0,i;foreach(var s in a){i=s[0]%'d';if(i==1)break;if(i>9)System.Console.Write(v);else v=i<1?v-1:i<5?v/2:i<6?v+1:v*2;}}}(PS คำอธิบายวิธีการทำงานและวิธีใช้ (เช่นคาดว่าบรรทัดคำสั่ง args) จะได้รับการชื่นชมเสมอ!)
VisualMelon

(โอ้ที่น่าอาย ... ฉันควรจะใช้%50แทน%'d')
VisualMelon

0

Perl 5 -a , 61 ไบต์

eval'$,'.qw(++ -- ;exit ;print$,||0 *=2 /=2)[(ord)%11%6]for@F

ลองออนไลน์!

ord%11%6เคล็ดลับของ Stole @ user202729

อย่างไร?

-a            # split the input by whitespace, store in @F
eval          # Execute the string that results from:
'$,'          # $, (the accumulator)
.             # appending:
qw(           # create an array for the following whitespace separated values:
++ --            # operators for inc & dec
;exit            # exit
;print$,||0      # Pri  (||0 ensures that 0 is output if accumulator is null
*=2 /=2)         # mult div
[(ord)%11%6] # @user202729's trick selects one of the preceding operations
for@F        # for every term input

0

Pyth, 44 ไบต์

Vmx"idmhPe"hdcwd=Z@[hZtZyZcZ2ZZ)NIqN4pZIqN6B

ชุดทดสอบ

คำอธิบาย

Vmx"idmhPe"hdcwd=Z@[hZtZyZcZ2ZZ)NIqN4pZIqN6B   ## full program
             cwd                               ## split input on space
Vmx"idmhPe"hd                                  ## iterate through list of numbers corresponding to operators
                =Z@[hZtZyZcZ2ZZ)N              ## assign the variable Z (initialliy Zero) it's new value
                                 IqN4pZ        ## print Z if the current operator is "Pri" (4)
                                       IqN6B   ## break if the current operator is "exit" (5)

0

TI-BASIC, 112 ไบต์

สิ่งนี้ใช้ประโยชน์จากสมมติฐานบางอย่างที่เป็นที่ยอมรับอย่างสมบูรณ์แบบของ AFAIK หมายเลขหนึ่งที่ตัวแปรทั้งหมดถูกเตรียมใช้งานให้เป็นศูนย์ก่อนที่จะดำเนินการ Ansหมายเลขสองถูกป้อนข้อมูลที่จะนำมาผ่าน

Ans+" E→Str1
While 1
I+4→I
sub(Str1,I-3,1→Str2
A+(Ans="I")-(Ans="D
If inString("MH",Str2
Then
I+1→I
2AAns+A/2(1-Ans
End
If Str2="P
Disp A
If Str2="E
Stop
Ans→A
End

0

Java (OpenJDK 8) , 164 ไบต์

a->{int c=0;for(String g:a.split(" ")){char b=g.charAt(0);if(b==105)c++;if(b==100)c--;if(b==109)c*=2;if(b==104)c/=2;if(b==80)System.out.print(c);if(b==101)return;}}

ลองออนไลน์!

ด้านบนคือโซลูชันของฉันที่ปัดเศษเป็นจำนวนเต็ม แต่ด้านล่างเป็นโซลูชันของฉันที่จัดการทศนิยม วิธีที่น่าสะพรึงกลัวที่จาวาพิมพ์เพิ่มเป็นสองเท่าเพิ่มอีก 55 ไบต์ให้กับคะแนน ฉันออกจากบรรทัดใหม่เพื่อให้โค้ดอ่านได้ง่ายขึ้นในการส่งครั้งที่สองเท่านั้นเพราะโดยพื้นฐานแล้วมันเป็นคำตอบเดียวกับคำสั่งพิเศษหนึ่งคำสั่งและคำสั่งนำเข้า

Java (OpenJDK 8) , 219 ไบต์

a->{
double c=0;
for(String g:a.split(" ")){
char b=g.charAt(0);
if(b==105)c++;
if(b==100)c--;
if(b==109)c*=2;
if(b==104)c/=2;
if(b==80)System.out.print(new DecimalFormat("0.#").format(c));
if(b==101)return;}}

ลองออนไลน์!


0

C (gcc) , 120 114 111 ไบต์

-6 ไบต์ขอบคุณไปที่ catcat

x,d;f(char*s){for(x=0;s>1;s=index(d^1?s:"",32)+1)d=*s-100,x+=d?d==5:-1,x*=d^9?d^4?1:.5:2,d+20||printf("%d",x);}

ลองออนไลน์!

124 ไบต์

เวอร์ชันอิงดัชนี:

d;f(char*s){for(float f=0;s>1;s=strchr(s,32)+1)d=*s-80,f+=d==25,f-=d==20,f*=d^29?d^24?1:.5:2,s=d^21?s:"",d?:printf("%f",f);}

ลองออนไลน์!

ฉันไม่ได้สนใจรุ่นที่ปัดเศษลง แต่ทำให้ข้อยกเว้นเป็น 0 ซึ่งน่าจะได้รับอนุญาตถ้าฉันเข้าใจความคิดเห็นของลูกโซ่อย่างถูกต้อง


0

33 , 62 ไบต์

s'i'{1a}'d'{1m}'m'{2x}'h'{2d}'P'{o}'e'{@}It[mzsjk""ltqztItn1a]

ลองออนไลน์!

โปรแกรมนี้ใช้คำสั่งที่คั่นด้วยการขึ้นบรรทัดใหม่

คำอธิบาย:

It[mzsjk""ltqztItn1a]
  [mz            n1a] | Forever
It    jk       It     | - Get the first character of the next instruction
            qz        | - Call the function declared previously
     s  ""lt  t       | - Make sure we don't lose track of the variable

รหัสก่อนส่วนนั้นจะกำหนดฟังก์ชั่นทั้งหมด

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