Tạo một chương trình đánh gôn để đánh giá biểu thức số học


8

Nhiệm vụ của bạn là viết một chương trình sẽ nhận đầu vào như thế này:

a + b * c + a / 2

và sẽ tạo mã nguồn cho một chương trình lấy đầu vào của người dùng và sau đó đánh giá biểu thức.

Các biểu hiện có thể chứa các nhà khai thác +, -, *, /; biến chữ thường một chữ cái; và số nguyên trong khoảng từ 0 đến 32000. Ưu tiên số học tiêu chuẩn phải được tuân thủ chính xác. Biểu thức được giới hạn ở 26 biến duy nhất từ ​​a đến z. Tuy nhiên, một biến duy nhất có thể xuất hiện nhiều lần.

Bạn có thể giả sử rằng biểu thức đầu vào là hợp lệ (tuân theo các quy tắc này).

Chương trình được tạo phải nhắc nhập dữ liệu người dùng ở dạng này, chỉ nhắc một lần cho mỗi biến:

a = 

Đầu vào của người dùng từ 0 đến 32000 phải được xử lý chính xác. Sau đó nó sẽ in biểu thức và kết quả chính xác. Bạn có thể sử dụng số học số nguyên hoặc dấu phẩy động. Các tính toán nên được thực hiện với độ chính xác ít nhất 32 bit. Ngoài ra, bạn không phải lo lắng về việc tràn hoặc chia cho số không.

Ví dụ về chương trình Perl không được tạo ra cho biểu thức trên:

print "a = ";
my $a = <>;
print "b = ";
my $b = <>;
print "c = ";
my $c = <>;
print "a + b * c + a / 2 = " . ($a + $b * $c + $a / 2); 

Ví dụ đầu vào và đầu ra của chương trình được tạo cho biểu thức trên:

a = 1
b = 2
c = 3
a + b * c + a / 2 = 7.5

Điểm được tính bằng độ dài của chương trình + độ dài của chương trình được tạo cho biểu thức này:

1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000

Điểm số thấp nhất chiến thắng.

Cập nhật: Chỉ để làm nổi bật một số yêu cầu của vấn đề, như đã nêu ở trên:

  • Đầu ra của chương trình phải là mã nguồn cho một chương trình khác để đánh giá biểu thức.
  • Chương trình phải in biểu thức gốc . Có lẽ có một sự mơ hồ trong điều này (người ta có thể lập luận rằng đó a+blà cùng một biểu thức a + b), nhưng để rõ ràng, hãy nói rằng đó phải là biểu thức ban đầu với không gian trắng nguyên vẹn. Tất cả các câu trả lời hợp lệ cho đến nay đã làm điều đó theo cách đó.

Câu trả lời:


1

Perl, 80 + 110 = 190

Lấy cảm hứng trực tiếp từ một câu trả lời khác (hiện đã bị xóa) trong Ruby. Yêu cầu Perl ≥ v5,14.

Theo quy tắc thông thường tôi đã thấy các công tắc dòng lệnh được tính là một ký tự.

#!/usr/bin/perl -n
chomp;print'print $_="',$_,'"," = ",eval(s#\pL#${$&}//=do{print"$& = ";<>}#ger)'

Perl, 80 + 231 = 311

Bởi vì đánh giá ở đầu ra cảm thấy rẻ.

#!/usr/bin/perl -p
chomp;print"print '$_ = ',";s/\pL/$s{$&}++?"\$$&":"do{print'$& = ';\$$&=<>}"/ge

Có vẻ như đầu ra có thể được rút ngắn bằng cách chuyển lời nhắc thành phụ, nhưng tôi đã hết nhiệt tình.


Đây là mã golf. Đánh giá đầu ra không rẻ!

Một vài gợi ý: \pLcó thể thay thế [a-z]. Không cần dokhối. Chỉ có thể viết:${$&}//=print"$& = "and<>

@ dan1111 Cảm ơn bạn đã \pLhoàn thành. Không thể sử dụng andtrong một trong hai chương trình, vì mức độ ưu tiên quá thấp; andđược ưu tiên thấp hơn //=.
Kevin Reid

1

Lua, 202 + 166 = 368

Tệp "Gener_code.lua"

F=...
C='function G(v)io.write(v.." = ")_G[v]=io.read"*n"end 'V={}for v in F:gmatch'%l'do V[v]=0 end
for v in pairs(V)do C=C..'G"'..v..'"'end
print(C..'F="'..F..'"print(F.." = "..load("return "..F)())')

Sử dụng:

$ lua generate_code.lua "1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000"

Mã được tạo (thứ tự các biến không được chỉ định):

function G(v)io.write(v.." = ")_G[v]=io.read"*n"end G"g"G"e"G"d"G"b"G"a"G"h"F="1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000"print(F.." = "..load("return "..F)())

Mã được tạo trong hành động:

g = 4
e = 3
d = 2
b = 1
a = 6.5
h = 4.3
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 = 29787.941860465

1

Tcl 198 + 155 = 352

gets stdin i;puts [string map [list @ [lsort -u [regexp -all -inline {[a-z]} $i]] & [regsub -all {[a-z]} [join $i {}] {$\0}] | $i] {foreach va {@} {puts "$va =";gets stdin $va};puts "| = [expr &]"}]

tạo ra

foreach va {a b d e g h} {puts "$va =";gets stdin $va};puts "1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 = [expr 1+$a*4*$b+2/$d*$e-$a-3+$g/$h*32000]"

foreach=> lmap; va=>v
sergiol

0

Con trăn 125 + 151 = 276

>>> t=raw_input();z=sorted(set(filter(str.isalpha,t)));print','.join(z)+'=[input(x+" = ")for x in%r];print"%s =",%s'%(z,t,t[::2])
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000
a,b,d,e,g,h=[input(x+" = ")for x in['a', 'b', 'd', 'e', 'g', 'h']];print"1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 =",1+a*4*b+2/d*e-a-3+g/h*300

Bây giờ thực hiện nó:

>>> exec"""a,b,d,e,g,h=[input(x+" = ")for x in['a', 'b', 'd', 'e', 'g', 'h']];print"1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 =",1+a*4*b+2/d*e-a-3+g/h*300"""
a = 1
b = 2
d = 3
e = 4
g = 5
h = 6
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 = 5

Tôi không nghĩ có bất kỳ yêu cầu nào để sắp xếp các biến và tôi nghĩ rằng tốt hơn là sử dụng một chuỗi ký tự thay vì một danh sách. Đó là, thay thế z=sorted(set(filter(str,isalpha,t)))bằng z=''.join(set(filter(str.isalpha,t))).
Geoff Reedy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.