Transpile WordMath


25

เราทุกคนเห็น "maths hax" ออนไลน์ที่มีลักษณะเช่นนี้:

Think of a number, divide by 2, multiply by 0, add 8.

และด้วยเวทมนตร์ทุกคนก็จบลงด้วยหมายเลข 8!


ภาษา

ลองกำหนดภาษาการเขียนโปรแกรมที่ใช้ไวยากรณ์ของข้อความด้านบนเรียกว่า "WordMath" สคริปต์ WordMath ปฏิบัติตามแม่แบบนี้:

Think of a number, <commandlist>.

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

คำสั่งถูกคั่นด้วยตัวคั่น,(เครื่องหมายจุลภาค + ช่องว่าง) คำสั่งที่ถูกต้องคือ(หมายเหตุที่#แสดงถึงจำนวนเต็มที่ไม่เป็นลบ :) :

  • add #/ subtract #- เพิ่ม / ลบค่าจากตัวสะสม
  • divide by #/ multiply by #- floordiv / คูณตัวสะสมด้วยค่าที่กำหนด
  • subtract from #- คล้ายกับsubtractแต่ทำacc = # - accแทนacc = acc - #
  • repeat- ทำคำสั่งสุดท้ายอีกครั้ง นี่ไม่ใช่คำสั่งที่ 1 แต่คุณต้องรองรับการซ้ำหลายครั้งติดต่อกัน

ความท้าทาย

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นซึ่งใช้สคริปต์ WordMath ที่ถูกต้องเป็นอินพุตและ transpilesให้เป็นโปรแกรมเต็มรูปแบบที่ถูกต้อง - ในภาษาเดียวกันกับรหัสของคุณ

ตัวอย่างเช่นหากรหัสของฉันอยู่ใน Python 2 และสคริปต์คือ:

Think of a number, subtract from 10, add 10, multiply by 2.

โปรแกรมที่ส่งออกสามารถเป็น:

a = input()
a = 10 - a
a += 10
a *= 2
print(a)

หรืออีกทางหนึ่ง:

print(((10-input())+10)*2)

ตราบใดที่มันเป็นโปรแกรมเต็มรูปแบบซึ่งรับข้อมูลจากSTDINและปริ้นไปยังSTDOUTหรือเทียบเท่าภาษาที่ใกล้เคียงที่สุด


กฎระเบียบ

  • โปรแกรมดั้งเดิมของคุณอาจสมมติว่าอินพุตนั้นเป็นสคริปต์ WordMath ที่ถูกต้องเสมอ
  • โปรแกรม transpiled ไม่ต้องจัดการกับข้อผิดพลาดทางคณิตศาสตร์เช่นการหารด้วย 0
  • โปรแกรม transpiled อาจสันนิษฐานว่าการป้อนข้อมูลหมายถึงจำนวนเต็มที่ลงนามที่ถูกต้องภายในช่วงจำนวนเต็มมาตรฐานของภาษา
  • นี่คือดังนั้นการแก้ปัญหาที่สั้นที่สุด (เป็นไบต์) ชนะ
  • เฉพาะจำนวนไบต์ของโปรแกรมดั้งเดิมของคุณเท่านั้นที่สำคัญรหัสเอาท์พุทอาจยาวเท่าที่คุณต้องการ!

ตัวอย่างสคริปต์

ตัวอย่างที่ 1:

Think of a number. 

ใช้อินพุตไม่ทำอะไรเลยแสดง: โปรแกรม cat ของ WordMath

ตัวอย่างที่ 2:

Think of a number, divide by 5, subtract from 9.

โปรดจำไว้ว่า "หาร" เป็นส่วนชั้นดังนั้นสำหรับโปรแกรมนี้และ6 -> 829 -> 4

ตัวอย่างที่ 3:

Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2.

โปรแกรมแมวตัวต่อ!

ตัวอย่างที่ 4:

Think of a number, subtract 1, repeat, repeat.

รับจำนวนและลบ 3


เราต้องสนับสนุนการทำซ้ำติดต่อกันหรือไม่?
darrylyeo

1
เราสามารถใช้ float เมื่อเป็นประเภทเริ่มต้นของภาษา / หากไม่รองรับจำนวนเต็มหรือไม่
Rainer P.

@RainerP เฉพาะในกรณีที่ภาษาไม่รองรับการแบ่งจำนวนเต็ม / จำนวนเต็ม
FlipTack

1
ผลลัพธ์ที่คาดหวัง-5/3คืออะไร เราปัดไปทาง0หรือไปทางอนันต์ลบหรือไม่?
Martin Ender

1
@MartinEnder ฉันจะบอกว่ารอบไปทางอินฟินิตี้ลบเพราะมันคือการแบ่งชั้นแต่ถ้าภาษาของคุณใช้การหารจำนวนเต็มไปที่ 0 นั่นก็ดีเช่นกัน
FlipTack

คำตอบ:


6

05AB1E , 59 56 54 52 ไบต์

„, ¡¦vyDþs.AJá'bK"dmas""/*+-"‡„-f„s-.:«D'rQi®}©}J'rK

ลองออนไลน์!

สมองของฉันเจ็บอย่างนรกหลังจากนั้น ... มันส่งออกในรหัส 05AB1E ดังนี้:

  • Think of a Number ถูกลบเนื่องจากอินพุตโดยนัย
  • Subtract From #ขนอ่อนที่จะ#s-(สลับaและbและการดำเนินการ)
  • Subtract ##-แปรรูป
  • Add ##+แปรรูป
  • Multiply by ##*แปรรูป
  • Divide by ##/แปรรูป
  • Repeat คว้าสิ่งที่ถูกเก็บไว้ในการลงทะเบียนครั้งสุดท้าย

อธิบาย:

„, ¡                                                 # Split on ', '.
    ¦                                                # Remove the 'Think of a number'.
     vy                                        }     # Loop through chunks.
       Dþs                                           # Dupe, push only digits, swap.
          .AJá                                       # Acronymify without digits.
              'bK                                    # Remove the `b`.
                 "dmas""/*+-"‡                       # Replace letters with OPs.
                              „-f„s-.:               # Replace '-f' with 's-'.
                                      «              # Concat # with OP.
                                       D'rQ          # Dupe, push 1 if OP='r'.
                                           i®}       # If 'r', push last #OP.
                                              ©      # Store current OP.
                                                J'rK # Join, remove remaining r's.

ตัวอย่าง:

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

Think of a number, divide by 2, multiply by 10, add 8, subtract 6, subtract from 9, repeat, repeat, subtract 41.

เอาท์พุท:

2/10*8+6-9s-9s-9s-41-

ลองวิธีแก้ปัญหาด้วยอินพุต 10:

ลองออนไลน์!

ดูใน google:

นี่คือลิงก์ไปยังสมการเดียวกันที่พิมพ์ลงใน google


13

ตัวประมวลผลล่วงหน้า C, 362 ไบต์

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

main(){int c[]={
#define Think 
#define of
#define a
#define number 0
#define add 1,
#define subtract 2,
#define from 0,3,
#define multiply 4,
#define divide 5,
#define by
#define repeat 6, 0
#include "input.wm"
,'$'};int _,l,v;scanf("%d", &_);for(int i=1;c[i]-'$';++i){c[i]!=6?l=c[i],v=c[++i]:++i;l==1?_+=v:l==2?_-=v:l==3?_=v-_:l==4?_*=v:_/=v;}printf("%d",_);}

อินพุตจะต้องระบุไว้ใน "input.wm" หรือเพียงแค่ทิ้งในแหล่งที่บรรทัดนั้น ฉันรวมจำนวนไบต์ในจำนวนของฉันเพราะฉันคิดว่ามันเป็นบิตแฮ็กและเล็กน้อยกับกฎของความท้าทายดังนั้นมันจึงเหมาะสมเท่านั้น

อย่างไรก็ตามเมื่อคุณถ่ายโอนซอร์ส WordMath ของคุณไปยัง input.wm ซึ่งคอมไพเลอร์สามารถค้นหาได้คุณควรจะสามารถคอมไพล์ไฟล์นี้ได้เช่นเดียวกับที่มีคำเตือนให้สร้างไฟล์ปฏิบัติการที่ทำในสิ่งที่ WordMath บอก


2
หมายเหตุ: สิ่งนี้โชคไม่ดีที่คอมไพเลอร์บางตัวเมื่อคุณทำซ้ำ นี่เป็นเพราะพวกเขาโยนช่องว่างหลังจาก 0 จากนั้นดูระยะเวลาจรจัดและไม่รู้ว่าจะทำอย่างไรกับมัน
LambdaBeta

ฉลาดฉันประทับใจ
แมว

7

เรติน่า 170 ไบต์

เพราะใครไม่อยากเห็นนี่!

ฉันคิดว่ามันยอดเยี่ยมแค่ไหนที่จะได้เห็นโซลูชัน Retina และฉันตัดสินใจที่จะสร้างมันขึ้นมาอย่างรวดเร็ว ใช้เวลาเพียงหนึ่งชั่วโมง ตามปกติจำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

S`, 
\.

T.*
.*¶$$*
\;+`(.*)¶rep.*(¶?)
$1¶$1$2
\d+
$*
.*f.* (1*)
1¶x¶$¶$1¶+`x1¶
m.* 
1¶
di.* (1*)
^¶$1 ¶^(1+) (\1)+1*$¶x$$#+¶1+ 1*¶x0¶x\d+¶$$*
s.* (1*)
^$1¶
a.* 
^¶
\z
¶1

ลองออนไลน์

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

คำอธิบาย:

S`,                 # Split input on ", " putting each command on its own line
\.                  # Remove the period

T.*                 # Think of a number -> .*\n$* (replaces input with unary)
.*¶$$*
\;+`(.*)¶rep.*(¶?)  # Loop, replacing "repeat" with the line before it
$1¶$1$2
\d+                 # Replace all numbers with their unary representation
$*
.*f.* (1*)          # Replace "subtract from " with a subtract from program
1¶x¶$¶$1¶+`x1¶
m.*                 # Replace "multiply by " with a multiply program
1¶
di.* (1*)           # Replace "divide by " by my integer division program
^¶$1 ¶^(1+) (\1)+1*$¶x$$#+¶1+ 1*¶x0¶x\d+¶$$*
s.* (1*)            # Replace "subtract " with a subtraction program
^$1¶
a.*                 # Replace "add " with an addition program
^¶
\z                  # At the end, add a stage to change unary into decimal
¶1

โปรแกรมคณิตศาสตร์:

เพิ่ม:

เพิ่มจำนวนของคนที่จะเริ่มต้น เพิ่ม 5:

^
1111

ลบ:

ลบจำนวนของคนจากจุดเริ่มต้น ลบ 5:

^11111

ลบออกจาก:

แทนที่อินพุต1s ด้วยxs ใส่ถัดจากหมายเลขคงที่ ลบซ้ำแล้วซ้ำx1อีก ลบออกจาก 10:

1
x
$
1111111111
+`x1

ทวีคูณโดย:

แทนที่ทุกคน1ด้วยจำนวนที่แน่นอน คูณด้วย 3:

1
111

หารด้วย:

โปรแกรมนี้จะใช้ Retina ของฉันสำหรับจำนวนเต็มกอง หารด้วย 2:

^                   # Place the fixed divisor before the dividend
11 
^(.+) (\1)+.*$      # Match the divisor, followed by each occurrence in the dividend.
x$#+                # Replace with the number of matches. Trailing ones are dropped
.+ .*               # If there are still two numbers, the result is zero
x0
x\d+                # Replace result (marked with an 'x') with unary
$*

ฉันเกรงว่าฉันจะไม่เห็นว่าสิ่งนี้สามารถทำงานได้ อินพุตใดที่ฉันลองใช้สำหรับคำสั่งการลบฉันจะได้ผลลัพธ์ที่ไม่สมบูรณ์ (มี linefeeds หายไปในผลลัพธ์หรือไม่) ฉันไม่เห็นด้วยว่าสิ่งนี้จัดการกับอินพุตเชิงลบหรือผลลัพธ์ระดับกลางเชิงลบได้อย่างไร
Martin Ender

@MartinEnder ฉันสามารถแก้ไขการลบได้หากคุณอธิบายว่าเหตุใดโปรแกรมที่เรียบง่ายนี้จึงให้สองรายการในผลลัพธ์ retina.tryitonline.net/#code=JArCtjE&input=dGVzdAo
mbomb007

เพราะ$ตรงกับส่วนท้ายสุดของสตริงหรืออยู่ด้านหน้าของตัวป้อนบรรทัดต่อท้าย คุณต้องการ\zถ้าคุณต้องการอดีต
Martin Ender

4

GNU awk, 139 ไบต์

BEGIN{RS="[,.]";c="{}{";ORS=";"}
/ad/{c="+="$2}
/c/{c="-="$2}
/om/{c="="$3"-$0"}
/l/{c="*="$3}
/v/{c="=int($0/"$3")"}
!NF{c="}1"}
$0="$0"c

ภาวนา:

$> awk `awk -f wordmath <<< "Think of a number, add 1, repeat, repeat."` <<< 0
$> 3

กรณีทดสอบ:

$> awk -f wordmath <<< "Think of a number."  
$> $0{}{;$0}1;

$> awk -f wordmath <<< "Think of a number, divide by 5, subtract from 9."
$> $0{}{;$0=int($0/5);$0=9-$0;$0}1;

$> awk -f wordmath <<< "Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2."
$> $0{}{;$0+=5;$0+=10;$0*=2;$0-=15;$0-=15;$0=int($0/2);$0}1;

4

Haskell, 232 231 ไบต์

แน่นอนโปรแกรมเมอร์ที่ใช้งานต้องการคืนฟังก์ชันมากกว่าสตริงที่แทนโปรแกรม แต่ที่นี่เราไปกัน:

t l="main=getLine>>=print."++""%words l++"(0+).read"
x%((o:_):f:n:r)|o=='m'=h"*"n r|o=='d'=h"`div`"n r|f=="from"=h"(-)"n r
x%(s:n:r)|s=="add"=h"+"n r|s!!0=='s'=h s(' ':n)r
x%(_:r)=x%r++x
_%_=""
h s n r|x<-'(':s++init n++")."=x%r++x

ข้อสังเกต: เรามักจะเริ่มต้นด้วยการเพิ่มศูนย์มิฉะนั้นการย้ายของโปรแกรม WordMath เล็กน้อยจะไม่ให้ข้อมูลเพียงพอที่จะสรุปประเภทที่readใช้ subtract from nสามารถนำมาใช้เป็น(n-)แต่ฉันใช้((-)n)เพื่อความสม่ำเสมอมากขึ้น ในกรณีที่subtract nฉันคัดลอกsubtractจากอินพุตดังนั้นฉันไม่ต้องเขียนมัน แต่ฉันต้องชดเชยพื้นที่ที่ขาดหายไปในตอนท้าย repeatใช้เป็นการดำเนินการเริ่มต้น พร้อมกับการดำเนินการก่อนหน้านี้เริ่มต้นที่ว่างเปล่านี้ช่วยให้ง่ายต่อการละเว้นคำสี่คำแรก

ตัวอย่างการใช้งาน:

*Main> t "Think of a number. "
"main=getLine>>=print.(0+).read" 

ตัวอย่างอื่น ๆ ให้ผลลัพธ์ดังต่อไปนี้:

"main=getLine>>=print.((-)9).(`div`5).(0+).read"
"main=getLine>>=print.(`div`2).(subtract 15).(subtract 15).(*2).(+10).(+5).(0+).read"  
"main=getLine>>=print.(subtract 1).(subtract 1).(subtract 1).(0+).read"

แค่อยากรู้อยากเห็นคุณจะสร้างฟังก์ชั่นเพื่อส่งกลับแทนที่จะเป็นสตริงได้อย่างไร
Cyoce

ในภาษาโปรแกรมที่ใช้งานได้การสร้างและการเขียนฟังก์ชั่นนั้นไม่ยากกว่าการสร้างและต่อท้ายสตริง hอาจมีลักษณะบางอย่างเช่นh s n r|x<-s.read.init$n=x%r.xและจะเรียกว่ามีอาร์กิวเมนต์แรกฟังก์ชั่นเช่นh(+)n r(และมีจะต้องมีบางอย่างflipอยู่ที่ไหนสักแห่งที่จะได้รับการสั่งการผู้ประกอบการที่ถูกต้อง) _%_=idกรณีฐาน t l=id%words lฟังก์ชั่นหลักสามารถหลีกเลี่ยงทุกสำเร็จรูปและเพียงแค่เป็น - เนื่องจากการปิดตาอาจถูกมองว่าเป็นล่ามและความคิดนั้นอาจนำไปสู่การแก้ปัญหาที่ง่ายขึ้นและ / หรือสั้นลง
Christian Sievers

4

Python 2, 263 258 260 221 ไบต์

นี้อาจจะยังคงเป็นที่สั้นมาก

def r(s,o="",p=""):c=s.pop(0);c=[c,p]['re'in c];n=c.split()[-1];o=[[o+[['+-'['s'in c],'//']['v'in c],'*']['m'in c]+n,n+'-'+o]['f'in c],'input()']['T'in c];return s and r(s,"(%s)"%o,c)or o
lambda s:"print "+r(s.split(','))

ลองออนไลน์

ฉันใช้//แทน/เพราะคำสั่งสุดท้ายจะมี.ท้ายทำให้ตัวเลขใด ๆ ลอย ดังนั้นเพื่อให้การแบ่งสอดคล้องกันฉันใช้การหารจำนวนเต็ม

กรณีทดสอบเอาท์พุท:

print input()
print 9.-((input())//5)
print ((((((input())+5)+10)+10)-15)-15)//2.
print (((input())-1)-1)-1

หากคุณเปลี่ยนบล็อกก้อนใหญ่ของifสำหรับoต่อไปนี้ (ซึ่งฉันคิดว่าควรจะทำงาน): o=[[o+[['+-'['s'in c],'//']['v'in c],'*']['m'in c]+n,n+'-'+o]['f'in c],'input()']['T'in c]คุณจะได้รับมันลงไปที่ 224
Kade

@ Kade ใช่มันยังคงชัดเจน ไม่สามารถมีได้
mbomb007

@Cyoce ไม่การกระทำที่เรียกว่าแลมบ์ดาอาจมีค่าใช้จ่ายมากกว่าที่จะประหยัดได้ มันจะต้องประหยัด 4 หรือ 5 ไบต์ต่อการโทรเพื่อชำระ
mbomb007

4

Befunge, 342 305 ไบต์

>~$1 +:89+`#v_801p
  v_^#`+85~$<
1+>~:5+88+/3-!#v_$
v`"/":~p8p10+1<>>:"/"`!|
 "+"\5+8p4+:1+^:p11:g10<  >:"+"\2+8p:"*"\3+8p:
_$7%:01g\!#v_\2-7g\:1+:01v^p8+1\"5":p8\"5":g10
#8\"\"$#:0#<^v<p8p8\<g80p<>\#+$#12#p
-/+* >:#,_@  #^p8g10<
".@"<^"&"
10<v0<\g8-\g11:<:p1>#1+g11:p10+g
-:^>1g\-8p1-::#^_$8g^  >$$01g11g

ลองออนไลน์!

เอาท์พุต

รหัสที่สร้างขึ้นเริ่มต้นด้วย&คำสั่ง (ค่าอินพุต) และเสร็จสิ้นด้วยคำสั่ง.(ค่าเอาต์พุต) และ@(ออก) ในระหว่างที่เรามีการคำนวณที่หลากหลายในรูปแบบ<number><operation>ที่การดำเนินการสามารถ+(เพิ่ม), -(ลบ), /(หารด้วย), *(คูณด้วย) และ\-(ลบออก)

จำนวนตัวเองเป็นบิตซับซ้อนเพราะ Befunge สนับสนุนเฉพาะอักษรตัวเลขในช่วง 0-9 ดังนั้นสิ่งที่มีขนาดใหญ่กว่าความต้องการที่จะนำไปคำนวณด้วยตนเอง เนื่องจากเรามีอยู่แล้วการอ่านตัวเลขในตัวละครตัวละครเราก็สร้างตัวเลขเป็นแต่ละหลักคือการอ่านดังนั้นสำหรับตัวอย่างเช่น 123 จะกลายเป็นเช่น155+*2+55+*3+(((1 * 10) + 2) * 10) + 3

ตัวอย่าง

Input:  Think of a number.
Output: &.@

Input:  Think of a number, divide by 5, subtract from 9.
Output: &5/9\-.@

Input:  Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2.
Output: &5+155+*0++2*155+*5+-155+*5+-2/.@

Input:  Think of a number, subtract 1, repeat, repeat.
Output: &1-1-1-.@

คำอธิบาย

Befunge ไม่มีความสามารถในการจัดการสตริงเช่นนี้ดังนั้นการวิเคราะห์ส่วนใหญ่จึงถูกจัดการโดยการนับตัวอักษร เราเริ่มต้นเพียงแค่ข้ามตัวอักษร 18 ตัวแรกซึ่งทำให้เราผ่านการคิดวลีแบบตัวเลข (บวกด้วยเครื่องหมายจุลภาคหรือจุด) ถ้าอักขระถัดไปเป็นรูปแบบของบรรทัดใหม่หรือ EOF เราจะไปที่รูทีนเอาต์พุตไม่เช่นนั้นเราจะค้นหารายการคำสั่งต่อไป

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

สำหรับวิธีการคำสั่งจะถูกกำหนดเราจะนับตัวละครถึงหลักแรก modulo 7 สำหรับเพิ่มนี้คือ 4 (รวมทั้งพื้นที่ดังต่อไปนี้) สำหรับลบมันเป็น 2 สำหรับหารด้วยมันเป็น 3 สำหรับคูณด้วยก็ 5 และสำหรับการลบจากมันคือ 0 การลบต้องใช้การจัดการเพิ่มเติมเล็กน้อยเนื่องจากต้องการ\-คอมโบคำสั่ง แต่คนอื่น ๆ ใช้ค่าของพวกเขาเพื่อค้นหาอักขระคำสั่งที่เหมาะสมในตาราง

กระบวนการนี้ทำซ้ำสำหรับแต่ละคำสั่งโดยสร้างเอาต์พุตเป็นสตริงที่สร้างไว้ล่วงหน้าในบรรทัดที่ 8 ในแต่ละครั้งที่มีการเพิ่มคำสั่งเพิ่มเติมเรายังเพิ่มเครื่องหมายคำพูดปิดให้กับสตริงเพื่อให้แน่ใจว่าจะถูกยกเลิกอย่างถูกต้องเสมอ จากนั้นเมื่อเราถึงจุดสิ้นสุดของอินพุตในที่สุดเราก็แค่ "รัน" สตริงนี้เพื่อผลักมันลงบนสแต็กจากนั้นทำตามนั้นด้วยลำดับเอาต์พุตมาตรฐานเพื่อเขียนมันออกมาทั้งหมด


3

JavaScript (ES6), 163 ไบต์

w=>w.split`, `.map(l=>(o={a:'+',s:'-',m:'*',d:'/'}[a=l[0]])?p=(x=l.split` `.pop(),l[9]=='f'?x+`-n`:`n`+o+x+`|0`):a<'r'?'n=+prompt()':p).join`
n=`+`
console.log(n)`

ลองมัน:

f=w=>w.split`, `.map(l=>(o={a:'+',s:'-',m:'*',d:'/'}[a=l[0]])?p=(x=l.split` `.pop(),l[9]=='f'?x+`-n`:`n`+o+x+`|0`):a<'r'?'n=+prompt()':p).join`
n=`+`
console.log(n)`

const program = f('Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2.')
document.write('<pre>' + program + '</pre>' )

eval(program)

/*
Outputs:

n=+prompt()
n=n+5|0
n=n+10|0
n=n*2|0
n=n-15|0
n=n-15|0
n=n/2.|0
console.log(n)
*/


3

เป็นกลุ่ม208 171 168 ไบต์

เพิ่มความสามารถในการทำซ้ำหลายครั้งในหนึ่งแถวต่อ @ Flp.Tkc แต่ออกไปทางไบต์มากพอที่ฉันจะยังสามารถลดจำนวนไบต์ได้

:map s :s;\v
c4wcw="s, s\w* \w+ (\d+); *-1+\1);g
s, ([adms]).{-}(\d+); \1\2);g
qws(\S+), r\w+;\1 \1
@wq@ws.*;\=tr(submatch(0),'adms','+/*-')
qq])T=i(@qq@qx$xA

TryItOnline

อักขระที่ไม่สามารถพิมพ์ได้:

:map s :s;\v
c4wcw^V^R=^V^R"^[s, s\w* \w+ (\d+); *-1+\1);g
s, ([adms]).{-}(\d+); \1\2);g
qws(\S+), r\w+;\1 \1
@wq@ws.*;\=tr(submatch(0),'adms','+/*-')
qq])T=i(^[@qq@qx$xA
^V^[^[

กรณีทดสอบเอาท์พุท:

  1. cw^R=^R" ^[ TryItOnline
  2. cw^R=((^R" /5) *-1+9) ^[ TryItOnline
  3. cw^R=((((((^R" +5) +10) *2) -15) -15) /2) ^[ TryItOnline

ดูเหมือนจะไม่สามารถใช้งานได้ซ้ำหลายครั้งติดต่อกัน
FlipTack

@ Flp.Tkc คงที่ขอบคุณ! ฉันไม่ได้สังเกตก่อนหน้านี้
nmjcman101

2

เล็ก, 246 ไบต์

%{
#define P printf
#define O P("n%s%d;",c,v);
int v;char*c;
%}
%%
T {P("%%%%\n.* {int n=atoi(yytext);");}
ad {c="+=";}
fr {c="=-n+";}
s {c="-=";}
v {c="/=";}
l {c="*=";}
re {O}
[0-9]+ {v=atoi(yytext);O}
\. P("printf(\"%%d\",n);}\n%%%%");
. ;
%%

เป้าหมาย lex ไปที่ C ดังนั้นคอมไพเลอร์ C จะต้องรวบรวมมันเป็นสิ่งที่ปฏิบัติการได้ ไลบรารี lexer ( ll) จะต้องเชื่อมโยงด้วย นี่อาจเพิ่มการลงโทษแบบไบต์ แต่ฉันไม่แน่ใจว่ามีกี่ไบต์ถ้าใช่

โปรแกรมเอาต์พุตโปรแกรม lex (ต่อหนึ่งข้อกำหนด) ที่ประเมินนิพจน์ wordmath ที่ถูก transpiled รหัสระหว่าง%{และ%}สำหรับ "transpiler" เท่านั้น:

#define P printf              /* for brevity */
#define O P("n%s%d;",c,v)     /* expression builder, calls P = printf */
int v;char*c;                 /* v=most recent integer read */
                              /* c=the expression infix */

ระหว่างสอง%%บรรทัดคือส่วน regex / action กฎข้อแรกที่จะจับคู่กันคือT("คิดว่า ... ") ซึ่งสร้างคำนำ (โปรแกรม lex จะต้องเริ่มมีส่วนของกฎอย่างน้อยที่สุดและyytextเป็นข้อความที่ตรงกันล่าสุดดังนั้นกฎจึงรวบรวมแอคคูเลเตอร์กับอินพุตของผู้ใช้ )

ทิ้งโปรแกรมการป้อนข้อมูลทั้งหมดยกเว้นที่จะถูกจับคู่และกฎระเบียบอื่น ๆ ( ad, frขึ้นไปre) จัดการกับข้อแสดงออก wordmath กับเป็นคู่ที่น้อยที่สุดที่เป็นไปได้จะไม่ซ้ำกัน ในส่วนใหญ่เหล่านี้จะตั้งค่าcเป็นนิพจน์มัดซึ่งได้รับการเชื่อมต่อระหว่างnและจำนวนเต็มสุดท้ายอ่านเมื่อOได้รับการเรียก (เช่นตัวอย่างเช่นการอ่าน "เพิ่ม 9" จะตั้งค่ามัดเป็น+=, v ไป9และการเรียกร้องที่Oจะส่งออกn+=9;) . (สิ่งที่น่าสนใจคือการที่ "ลบออกจาก 8" จะทำให้ทั้งคู่sและfrกฎจับคู่กัน แต่เนื่องจากOถูกเรียกที่ตัวเลขเท่านั้นกฎที่เหมาะสมn=-n+8;คือนิพจน์เดียวที่รับเอาต์พุต) reกฎสำหรับ "ซ้ำ" เพียงโทรOอีกครั้งซึ่งส่งออกนิพจน์ที่สร้างขึ้นล่าสุด (และเนื่องจากการจับคู่ที่ตามมาจะปิดบังyytextการสนับสนุน "ซ้ำ" คือเหตุผลที่[0-9]+จำเป็นต้องแปลงจำนวนเต็มในกฎ) ในที่สุดช่วงเวลาทำให้ตัวอย่างโปรแกรมเป็นเอาต์พุตซึ่งเพิ่งออกเอาต์พุตตัวสะสมและปิดด้วย%%คู่ที่แสดงถึงจุดสิ้นสุดของเอาต์พุตโปรแกรม lex

หมายเหตุ: โปรแกรม transpiler หลักไม่เช่นนั้นโปรแกรมเอาต์พุตจะยุติการทำงาน การป้อนข้อมูลในท่อสามารถใช้งานได้หรือจัดหา EOF (ctrl-D) หากจำเป็นต้องมีการยกเลิกหลังจากอินพุตแรกสามารถเพิ่ม exit () s

วิธีสร้าง / เรียกใช้:

Build the main program:
% lex -o wordmath.yy.c wordmath.l
% cc -o wordmath wordmath.yy.c -ll

Execute to create a specific transpiled program:
% echo "This is a number, add 8, subtract 5, repeat." | ./wordmath > program.l

Build the transpiled program:
% lex -o program.yy.c program.l
% cc -o program program.yy.c -ll

Execute the transpiled program (with input 3, called via a pipe or inline):
% echo 3 | ./program
1
% ./program
3
1
^D
%

ทดสอบ 1:

%%
.* {int n=atoi(yytext);printf("%d",n);}
%%

ทดสอบ 2:

%%
.* {int n=atoi(yytext);n/=5;n=-n+9;printf("%d",n);}
%%

ทดสอบ 3:

%%
.* {int n=atoi(yytext);n+=5;n+=10;n*=2;n-=15;n-=15;n/=2;printf("%d",n);}
%%

ทดสอบ 4:

%%
.* {int n=atoi(yytext);n-=1;n-=1;n-=1;printf("%d",n);}
%%

2

Pyth, 69 67 ไบต์

J\QVtcQ\,Iq@N1\r=NZ)=Jjd+@"+-/*"x"asdm"@N1.>,J-ecN)\.qh@cN)1\f=ZN)J

โปรแกรมที่รับอินพุต"quoted string"และพิมพ์ผลลัพธ์

ชุดทดสอบ

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

Pyth มีตัวดำเนินการส่วนนำหน้าดังนั้นการดำเนินการเกี่ยวกับคณิตศาสตร์ขั้นพื้นฐานจะดำเนินการโดยใช้(operator)(operand1)(operand2)ในขณะที่ตัวแปรที่กำหนดค่าเริ่มต้นQให้อินพุต ดังนั้นโปรแกรม WordMath transpiled ถูกสร้างขึ้นโดยเริ่มต้นด้วยสตริง'Q'และในแต่ละขั้นตอนการเตรียมผู้ประกอบการและจากนั้นการเพิ่มหรือผนวกตัวถูกดำเนินการเป็นสิ่งจำเป็น

J\Qตั้งค่าJสตริงโปรแกรม transpiled เป็นสตริง'Q'

tcQ\, แยกอินพุตด้วยเครื่องหมายจุลภาคและละทิ้งองค์ประกอบแรก (ซึ่งก็คือ ' Think of a number')

V สำหรับNในที่:

  • Iq@N1\r หากตัวละครที่N[1]เป็น'r'(ซ้ำ):
    • =NZตั้งค่าNเป็นZ(ค่าก่อนหน้าของNตั้งไว้ที่ส่วนท้ายของลูป)
  • x"asdm"@N1 ค้นหาดัชนีของN[1]ใน"asdm"(เพิ่ม, ลบ, หาร, คูณ)
  • @"+-/*" จัดทำดัชนีโดย"+-/*"คำนึงถึงสิ่งนั้นทำให้ผู้ปฏิบัติงานที่ต้องการ
  • ,J-eCN)\.ให้ผลลัพธ์รายการสององค์ประกอบ[J, -eCN)\.]โดยที่องค์ประกอบที่สองเป็นองค์ประกอบสุดท้ายของการNแยกบนช่องว่างโดย'.'ลบอักขระใด ๆออก (ตัวถูกดำเนินการ)
  • qh@cN)1\f หากอักขระตัวแรกขององค์ประกอบที่สองของการNแยกบนช่องว่างคือ'f'(ลบออก):
    • .> สลับองค์ประกอบของรายการสององค์ประกอบ
  • + รวมโอเปอเรเตอร์และรายการสององค์ประกอบไว้ในรายการเดียว
  • =Jjd ตั้งค่าJเป็นช่องว่างที่เข้าร่วม
  • =ZN ตั้งค่าZเป็นN

J พิมพ์ J


คำตอบที่ดีชาย ... เป็นแรงบันดาลใจให้ฉันลองใน 05AB1E ซึ่ง ... น่ากลัวกว่าที่คาดไว้
Magic Octopus Urn

2

Pip , 58 ไบต์

น่าเสียดายที่ฉันยังไม่ได้ใช้ตัวดำเนินการการลบย้อนกลับ

{p:a:sNa?ap['Y("-y+  y- y// y+ y* "^sa@?Y`\d`)|'qa@y]}Mq^k

โปรแกรมใช้สคริปต์ WordMath จาก stdin และส่งออกรหัส Pip ไปยัง stdout รหัสที่ถูกส่งออกในทำนองเดียวกันจะใช้หมายเลขจาก stdin และส่งออกผลลัพธ์ไปยัง stdout ลองออนไลน์!

กลยุทธ์

สำหรับอินพุตเช่นนี้:

Think of a number, multiply by 3, add 1.

เราต้องการผลลัพธ์เช่นนี้:

YqYy*3Yy+1

ซึ่งทำงานดังนี้:

Yq    Yank a line of stdin into y
Yy*3  Compute y*3 and yank result into y
Yy+1  Compute y+1 and yank result into y
      Last expression is autoprinted

คำอธิบาย Ungolfed +

{
 p : a : sNa ? a p
 [
  'Y
  ("-y+  y- y// y+ y* "^s a@?Y`\d`) | 'q
  a@y
 ]
} M q^k

โครงสร้างพื้นฐานของโปรแกรมคือ{...}Mq^kซึ่งแยกq(บรรทัด stdin) บนk (จุลภาคพื้นที่) และMฟังก์ชั่น aps กับแต่ละองค์ประกอบ

ภายในฟังก์ชั่นเราเริ่มต้นด้วยการจัดการrepeatกรณีและปัญหา การทดสอบสั้นที่สุดใน Pip ดูเหมือนว่าจะมีsNa(มีช่องว่างในคำสั่ง) ถ้าเป็นเช่นนั้นเราต้องการใช้a; ถ้าไม่ใช่ให้ใช้pซึ่งเก็บคำสั่งก่อนหน้า กำหนดค่านั้นกลับไปที่aและไปยังp (สำหรับครั้งถัดไป)

สำหรับค่าส่งคืนของเราเราใช้รายการซึ่งใช้ได้เนื่องจากรูปแบบผลลัพธ์เริ่มต้นสำหรับรายการคือการเชื่อมทุกอย่างเข้าด้วยกัน ผลลัพธ์จะเริ่มต้นด้วยYเสมอ ต่อไปเราต้องการตารางการค้นหาสำหรับการดำเนินการ

สังเกตว่าความยาวของadd (4), subtract (9), divide by (10), multiply by (12) และsubtract from (14) ต่างกัน สังเกตเพิ่มเติมว่าพวกเขายังคงแตกต่างกันเมื่อนำ mod 7 มาใช้ดังนั้นเราสามารถใช้มันเพื่อจัดทำดัชนีในรายการเจ็ดองค์ประกอบ (ประกอบด้วยโค้ดขนาดห้าและสองตัวยึด) เพื่อแมปคำสั่ง WordMath แต่ละคำกับรหัส Pip ที่เหมาะสม สามารถต่อกันจนจบ):

  • 0: -y+(subtract from )
  • 1: ตัวยึดตำแหน่ง
  • 2: y-(subtract )
  • 3: y//(divide by )
  • 4: y+(add )
  • 5: y*(multiply by )
  • 6: ตัวยึดตำแหน่ง

สำหรับดัชนีที่เราใช้ regex a@?`\d`ที่จะได้รับดัชนีหลักแรกในคำสั่งนี้: นอกจากนี้เรายังดึง regex yสำหรับใช้ในอนาคต ตารางการค้นหาถูกสร้างขึ้นโดยการแยกสตริง"-y+ y- y// y+ y* "เปิดs (ช่องว่าง)

Yqเรายังคงต้องจัดการกับรายการแรกซึ่งควรแปลเป็นรหัส เนื่องจากThink of a numberไม่มีตัวเลขใด ๆ@?ผู้ประกอบการจึงส่งกลับศูนย์ การใช้ศูนย์เป็นดัชนีในตารางการค้นหาก็จะส่งกลับศูนย์ Nil เป็นเท็จดังนั้นสิ่งที่เราต้องทำคือเพิ่ม|'qการใช้qแทนการดำเนินการสำหรับกรณีนี้

องค์ประกอบสุดท้ายของรายการที่ส่งคืนคือจำนวนตัวเอง เราได้รับสิ่งนี้ผ่านa@y(ค้นหาการแข่งขันทั้งหมดในคำสั่งของ regex หลักที่เราดึงไปก่อนหน้านี้) นี่จะส่งคืนรายการตัวเลข แต่ก็ไม่ใช่ปัญหาเนื่องจากรายการทั้งหมดจะถูกต่อกันเมื่อเอาต์พุต สำหรับรายการแรกa@yไม่ตรงกับตัวเลขและให้รายการว่างเปล่าซึ่งไม่ได้เพิ่มอะไรลงในเอาต์พุต

ตัวอย่างเช่น

ด้วยอินพุต

Think of a number, subtract from 20, add 2, repeat.

นิพจน์แผนที่ให้รายการ

[["Y";"q";[]]; ["Y";"-y+";[2;0]]; ["Y";"y+";[2]]; ["Y";"y+";[2]]]

ซึ่งเมื่อตัดการเชื่อมต่อเอาต์พุต

YqY-y+20Yy+2Yy+2

2

Python 2 , 154 153 146 bytes

แก้ไขและแม้กระทั่งบันทึกหลายไบต์ในกระบวนการ ^ __ ^

for c in input()[9:-1].split(","):s=c.rfind(" ");p=o=s and"x="+"-x+ input() x- x// x+ x*".split()[s%7]+c[s:]*(c[0]<"a")or p;print o
print"print x"

ลองออนไลน์!

ขึ้นอยู่กับกลยุทธ์เดียวกับฉันคำตอบ Pip คุณสมบัติเฉพาะของ Python:

  • Think of และการปิด.จะถูกลบออกจากสตริงก่อนที่จะแยก ( input()[9:-1]) ช่วงเวลานั้นน่ารำคาญเกินกว่าที่จะรับมือในวงหลัก การลบอักขระเก้าตัวแรกออกไปช่วยด้วยเหตุผลอื่น (ดูด้านล่าง)
  • แทนที่จะได้ความยาวของแต่ละคำสั่งโดยค้นหา regex สำหรับตัวเลข (แพงใน Python เพราะimport re) เราใช้rfind(" ")เพื่อค้นหาช่องว่างสุดท้ายในคำสั่ง เรายังสามารถใช้สิ่งนี้เพื่อตรวจสอบrepeatเคส
  • Python ไม่มีการจัดทำดัชนีวัฏจักรของ Pip ดังนั้นเราจึงต้องใช้ดัชนี mod 7 อย่างชัดเจน ในทางกลับกันนี่หมายความว่าเราสามารถลบค่าดัมมี่สุดท้ายในตารางการค้นหาเนื่องจากดัชนี mod 7 ไม่เคยเป็น 6
  • คำสั่ง "" เป็นครั้งแรกผ่านมีซึ่งในดัชนีของพื้นที่คือa number 1ดัชนีนี้เติมช่องอื่น ๆ ในตารางการค้นหาได้อย่างสะดวก ปัญหาอื่น ๆ ที่มีการประมวลผลขั้นตอนการป้อนข้อมูลในวงหลักเป็นส่วนหนึ่งซึ่งจะส่งผลให้+c[s:] x=input() numberเมื่อต้องการแก้ไขปัญหาที่เราสตริงคูณด้วยc[0]<"a": 1คำสั่งปกติซึ่งcเริ่มต้นด้วยพื้นที่ แต่สำหรับการเริ่มต้น0a number

1

WinDbg, 449 388 ไบต์

as, }@$t1
as. }0;?@$t0
asThink n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{
aSa " "
asQ .printf";r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0
as/c add Q +"
aSby " "
as/c divide Q /"
asfrom 0;r$t0=-@$t0+
as/c multiply Q *"
aSnumber " "
aSof " "
asrepeat +1
as/c subtract Q -"
.for(r$t9=1;by(@$t0);r$t0=@$t0+1){j44!=by(@$t0) .printf"%c",by(@$t0);.if116!=by(@$t0-1){.printf" , "}};.printf"\b ."

-61 ไบต์โดยการกำหนดนามแฝงสำหรับรหัสซ้ำ

แรงบันดาลใจจากLambdaBeta ของ#defineการใช้งานของ วิธีนี้จะแก้ไขไวยากรณ์ WordMath เล็กน้อย ( ,และ.ต้องคั่นด้วยช่องว่างเหมือนคำอื่น ๆ และ,ไม่เป็นไปตามrepeat) และสร้างนามแฝงเช่นนั้นไวยากรณ์ WordMath ที่แก้ไขนั้นเป็นรหัส WinDbg ที่ถูกต้อง บรรทัดสุดท้ายทำในสิ่งที่คำถามถามและ transpiles โดยแปลงอินพุตให้เป็นไวยากรณ์ที่แก้ไข

อินพุตถูกถ่ายโดยการตั้งค่าสตริงที่ที่อยู่หน่วยความจำและการตั้งค่าหลอกลงทะเบียน$t0ไปยังที่อยู่นั้น หมายเหตุ: สิ่งนี้จะเขียนทับintat ที่0x2000000ดังนั้นหากคุณเริ่มต้นสตริงของคุณที่นั่นมันจะถูกเขียนทับบางส่วน $t0จะถูกเขียนทับด้วย

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

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

* $t1 is used for repeating and $t0 is used to read the input and hold the accumulator
* Alias , to }@$t1 -- closing do-while loop and allowing repeat
as , }@$t1

* Alias . to }0;?@$t0 -- close do-while loop and evaluate $t0 (accumulator)
as . }0;?@$t0

* Alias Think to (note this is one line)
as Think n10;               * Set base 10
         ed 8<<22;          * Read ints to address 0x2000000. Enter nothing to exit input mode
         r$t0 = dwo(8<<22); * Set $t0 = first int
         r$t1=0;.do{        * Open do-while

* Alias a to nothing
aS a " "

* Alias add to (note one line):
as add ;                       * Close previous statement
       r$t1=1;.do{r$t1=@$t1-1; * Open do-while (once) loop
       r$t0=@$t0+              * Add number to $t0

* Alias by to nothing
aS by " "

* Alias divide to (note one line):
as divide ;                       * Close previous statement
          r$t1=1;.do{r$t1=@$t1-1; * Open do-while (once) loop
          r$t0=@$t0/              * Divide next number from $t0

* Alias from to (note one line):
as from 0;         * Preceding subtract statement subtracts 0
       r$t0=-@$t0+ * Subtract $t0 from next number

* Alias multiply to (note one line):
as multiply ;                       * Close previous statement
            r$t1=1;.do{r$t1=@$t1-1; * Open do-while (once) loop
            r$t0=@$t0*              * Multiply next number with $t0

* Alias number to nothing
aS number " "

* Alias of to nothing
aS of " "

* Alias repeat to +1 making do-while (once) loops into do-while (once)+1
as repeat +1

* Alias subtract to (note one line):
as subtract ;                       * Close previous statement
            r$t1=1;.do{r$t1=@$t1-1; * Open do-while (once) loop
            r$t0=@$t0-              * Subtract next number from $t0


.for (r$t9=1; by(@$t0); r$t0=@$t0+1) * Enumerate the string
{
    j 44!=by(@$t0)                   * If not comma
        .printf "%c",by(@$t0);       * Print the char
    * implicit else
        .if 116!=by(@$t0-1)          * Else if the previous char is not t
        {
          .printf " , "              * Print the comma with spaces around it
        }
};
.printf "\b ."                       * Replacing ending "." with " ."

ตัวอย่างเอาต์พุตป้อนสตริงก่อนเรียกใช้โค้ดนี้หนึ่งครั้ง (โปรแกรมที่ได้จะคล้ายกับ WordMath):

0:000> r$t0=8<<22
0:000> eza8<<22"Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2."
0:000> as, }@$t1
0:000> as. }0;?@$t0
0:000> asThink n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{
0:000> aSa " "
0:000> asadd ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+
0:000> aSby " "
0:000> asdivide ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0/
0:000> asfrom 0;r$t0=-@$t0+
0:000> asmultiply ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0*
0:000> aSnumber " "
0:000> aSof " "
0:000> asrepeat +1
0:000> assubtract ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0-
0:000> .for(r$t9=1;by(@$t0);r$t0=@$t0+1){j44!=by(@$t0) .printf"%c",by(@$t0);.if116!=by(@$t0-1){.printf" , "}};.printf"\b ."
Think of a number ,  add 5 ,  add 10 ,  multiply by 2 ,  subtract 15 ,  repeat divide by 2 }0;?@$t0

0:000> Think of a number ,  add 5 ,  add 10 ,  multiply by 2 ,  subtract 15 ,  repeat divide by 2 }0;?@$t0
base is 10
02000000 6e696854 18
18
02000004 666f206b 

Evaluate expression: 18 = 00000012

เอาต์พุตตัวอย่างการป้อนสตริงหลังจากโค้ดนี้รันครั้งเดียว (นามแฝงจะถูกขยายเมื่อป้อนสตริงดังนั้นโปรแกรมผลลัพธ์จะไม่สวย):

0:000> r$t0=8<<22
0:000> eza8<<22"Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2."
0:000> as, }@$t1
0:000> as. }0;?@$t0
0:000> asThink n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{
0:000> aSa " "
0:000> asadd ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+
0:000> aSby " "
0:000> asdivide ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0/
0:000> asfrom 0;r$t0=-@$t0+
0:000> asmultiply ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0*
0:000> aSnumber " "
0:000> aSof " "
0:000> asrepeat +1
0:000> assubtract ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0-
0:000> .for(r$t9=1;by(@$t0);r$t0=@$t0+1){j44!=by(@$t0) .printf"%c",by(@$t0);.if116!=by(@$t0-1){.printf" , "}};.printf"\b ."
n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{     number ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+ 5 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+ 10 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0*   2 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0- 15 ,  repeat ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0/   2 }0;?@$t0

0:000> n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{     number ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+ 5 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+ 10 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0*   2 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0- 15 ,  repeat ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0/   2 }0;?@$t0
base is 10
02000000 3b30316e 26
26
02000004 3c386465 

Evaluate expression: 26 = 0000001a

ตัวอย่างผลลัพธ์เพิ่มเติมบางส่วนเพียงใช้ไวยากรณ์ WordMath ที่แก้ไขเล็กน้อย:

0:000> Think of a number , add 1 , repeat repeat repeat divide by 3 .
base is 10
02000000 0000001a 3
3
02000004 3c386465 

Evaluate expression: 2 = 00000002


0:000> Think of a number , divide by 5 , subtract from 9 .
base is 10
02000000 00000003 29
29
02000004 3c386465 

Evaluate expression: 4 = 00000004

0

สกาลา 338 ไบต์

ลองด้วยตัวคุณเองที่ ideone

s=>{val n=(_:String)filter(_.isDigit)toInt;(Seq("").tail/:s.split(",").tail)((a,&)=> &match{case&if&contains "v"=>a:+"x/="+n(&)
case&if&contains "d"=>a:+"x+="+n(&)
case&if&contains "y"=>a:+"x*="+n(&)
case&if&contains "f"=>a:+"x="+n(&)+"-x"
case&if&contains "s"=>a:+"x-="+n(&)
case p=>a:+a.last})mkString("var x=readInt;",";",";print(x)")}

คำอธิบาย:

// define a function with a parameter s
s => {
    // define a function with a String parameter to extract a number from a string
    val n =
        // filter out the chars that arent't digits
        (_: String) filter (_.isDigit)
        // and parse the number
        toInt;
    // take the tail of a list with an empty string,
    // which is the empty list of type Seq[String].
    // This is the start value for the fold...
    (Seq("").tail /:
        // ... of the tail of the sentence splitted at commas
        s.split(",").tail
    ) (
        // This is the function for the fold.
        // a is the accumulator (the list), and the current element is called &
        (a, &) => & match {
            // if & contains a "v", append "x/=" + n(&) to a.
            case & if & contains "v" => a :+ "x/=" + n(&)
            // the other cases are similar
            case & if & contains "d" => a :+ "x+=" + n(&)
            case & if & contains "y" => a :+ "x*=" + n(&)
            case & if & contains "f" => a :+ "x=" + n(&) + "-x"
            case & if & contains "s" => a :+ "x-=" + n(&)
            // for the repeat, apppend the last value of a to a
            case p                   => a :+ a.last
        }
     )
     // make a string out of the parts by joining them with semicolons,
     // prepending "var x=readInt;" and appending ";print(x)"
     mkString("var x=readInt;", ";", ";print(x)")
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.