Gõ kiểm tra một biểu thức


10

Cho một biểu thức infix, xác định xem tất cả các hằng có cùng loại không.

Các nhà khai thác sẽ chỉ bao gồm các nhà khai thác dyadic :+-/*

Chương trình hoặc hàm của bạn nên lấy một chuỗi biểu thức hợp lệ làm đầu vào và xuất giá trị trung thực nếu các hằng số trong biểu thức có cùng thời gian và ngược lại có giá trị falsey.

Biểu thức sẽ chỉ bao gồm các hằng và có thể chứa bất kỳ loại nào sau đây:

  • Chuỗi, có dạng "String"(Luôn là dấu ngoặc kép, có thể để trống, không có ký tự thoát, có thể chứa bất kỳ văn bản ASCII nào)
  • Số nguyên, có dạng 14(Luôn dương hoặc bằng 0)
  • Float, có dạng 7.3f(Luôn dương hoặc bằng 0, luôn có thành phần thập phân, vd 14.0f)
  • Byte, có dạng 0x42( 0-255, Luôn có 2 ký tự thập lục phân)
  • Boolean, có dạng true( truehoặc false, không phân biệt chữ hoa chữ thường)

Biểu thức sẽ không chứa dấu ngoặc đơn, vì thứ tự hoạt động không ảnh hưởng đến kiểu khi không có sự ép buộc kiểu nào.

Một hằng số không có toán tử là một biểu thức hợp lệ.

Một biểu thức trống không phải là một biểu thức hợp lệ.

Bạn có thể giả sử rằng chuỗi biểu thức không chứa khoảng trắng bên ngoài chuỗi ký tự.
Lưu ý: Ngoài ra, bạn có thể cho rằng sẽ luôn có khoảng cách giữa các hằng số và toán tử, như được thấy trong các testcase. Nếu bạn đưa ra giả định này, vui lòng ghi rõ như vậy trong câu trả lời của bạn

Bạn không phải xử lý các biểu thức không hợp lệ như 1 +.

Chấm điểm

Đây là , vì vậy ít byte nhất sẽ thắng!

Các trường hợp thử nghiệm

(Khoảng trắng được thêm vào để dễ đọc)

2 + 3
True

"Hello" / "World"
True

true * false
True

"Hello" + 4
False

"Hello" + "4"
True

3 + 2.4f / 8
False

0xff * 0xff
True

0xff + 2
False

6
True

" " + ""
True

"4 + false" + "word"
True

4
Có phải "không phân biệt chữ hoa chữ thường" đối với các giá trị Boolean có nghĩa là chúng ta phải hỗ trợ tất cả các trường hợp không? Hoặc là chúng ta có thể quyết định sử dụng trường hợp nào?
Arnauld

@Arnauld phải hỗ trợ tất cả các trường hợp
Skidsdev

@Jonathan ALLan giải thích của tôi là chúng tôi phải xử lý bất kỳ trường hợp hỗn hợp nào (ví dụ truE+fALSe). Nếu không tôi có thể lưu hai byte trong giải pháp của mình.
Nick Kennedy

Câu trả lời:


9

JavaScript (ES6),  79 77  75 byte

Đã lưu 2 byte nhờ @ExpiredData

Mong đợi khoảng trắng xung quanh các nhà khai thác. Trả về giá trị Boolean.

s=>![/".*?"/g,/0x../g,/\S+f/g,/\d/,/e/i].filter(e=>s!=(s=s.split(e)+''))[1]

Hãy thử trực tuyến!

Làm sao?

  1. Chúng tôi loại bỏ tất cả các chuỗi, sử dụng /".*?"/g
  2. Chúng tôi loại bỏ tất cả các byte, sử dụng /0x../g
  3. Chúng tôi loại bỏ tất cả các phao, sử dụng /\S+f/g
  4. Chúng tôi tìm kiếm một chữ số còn lại với /\d/; nếu chúng ta tìm thấy một, phải có ít nhất một số nguyên
  5. Chúng tôi tìm kiếm một còn lại "e"hoặc "E"với /e/i; nếu chúng ta tìm thấy một, phải có ít nhất một giá trị Boolean

Tất cả các biểu thức bị loại bỏ thực sự được thay thế bằng dấu phẩy, vô hại.

Chúng tôi lọc các biểu thức chính quy không gây ra thay đổi nào cho chuỗi đầu vào và kiểm tra xem có ít hơn hai trong số chúng ở cuối quy trình hay không.


truefalseđược đánh dấu là không phân biệt chữ hoa chữ thường, tôi nghĩ điều đó có nghĩa là bạn cần phải bỏ qua trường hợp regex của mình khi tìm kiếm những trường hợp này ts(mặc dù tôi có thể sai).
Jonathan Allan

1
@Jonathan ALLan Tôi đã khắc phục tạm thời và hỏi OP.
Arnauld


@ExpiredData Đẹp. :) Cảm ơn!
Arnauld

3

Perl 5 -p , 73 byte

for$f(qw/".*?" \d+.\d+f 0x.. ....?e \d+/){s/$f//gi&&last}$_=/^[+\/* -]*$/

Hãy thử trực tuyến!

Làm sao?

Cố gắng loại bỏ các chuỗi, float, hex, boolean và số nguyên theo thứ tự đó. Dừng lại ngay khi một cái gì đó được gỡ bỏ. Sau khi dừng, kiểm tra xem chuỗi còn lại chỉ bao gồm các toán tử và khoảng trắng. Nếu có, kiểm tra trype là đúng; nếu không, nó sai.

Lần thử đầu tiên: Perl 5 -MList::Util=all -p, 99 byte

s/".*?"/!/g;for$f(qw/! \d+ \d+\.\d+f 0x[0-9a-f]{2} (true|false)/){$\||=all{/^$f$/i}/[^+\/* -]+/g}}{

Hãy thử trực tuyến!


$_=/^[+\/* -]*$/có thể được thay đổi bởi $_=!y#-+/* ##c....?ebởi.*e
Nahuel Fouilleul


58 byte giả sử sẽ luôn có khoảng cách giữa các hằng số và toán tử
Nahuel Fouilleul

2

Thạch , 30 23 byte

ṣ”"ŒœḢYŒlḲŒœḢeþ@“.e¶x”E

Hãy thử trực tuyến!

Một liên kết đơn âm lấy một chuỗi làm đầu vào và trả về 1 cho true và 0 cho false (giá trị boolean của Jelly). Mong đợi khoảng trắng xung quanh các nhà khai thác.

Tôi đã thêm một vài trường hợp thử nghiệm mới vào TIO, bao gồm một trường hợp có ba toán tử và một trường hợp hỗn hợp cho booleans.

Giải trình

ṣ”"                     | Split input at double-quotes
   Œœ                   | Split into two lists, one of odd indices and one even. The even indices will have the contents of the quoted bits in the input (if any)
     Ḣ                  | Keep only the odd-indexed items
      Y                 | Join with newlines (so now all quoted strings in input are a single newline)
       Œl               | Convert to lower case (so that booleans are case insensitive)
         Ḳ              | Split at spaces
          ŒœḢ           | As before just take odd indices
             eþ@“.e¶x”  | Check for each section which they contain of .e¶x (respectively floats, booleans, strings and hex; integers will have none of these)
                      E | Check each section is equal (will return true for single section)



1

05AB1E , 50 24 byte

'"¡āÉÏ»lð¡āÉÏε".e
x"Så}Ë

-26 byte bằng cách tạo một cổng câu trả lời Jelly của @NickKennedy , vì vậy hãy đảm bảo nâng cấp anh ta !!

Mong đợi đầu vào với không gian tại các toán hạng.

Hãy thử trực tuyến hoặc xác minh tất cả (cộng thêm một số trường hợp) thử nghiệm .

Giải trình:

'"¡         '# Split the (implicit) input-string by '"'
   āÉÏ       # Only keep all values at 0-based even indices
      »      # Join them by newlines
       l     # Converted to lowercase (for `true`/`false`)
ð¡           # Split by spaces (NOTE: `#` cannot be used here, since inputs without
             # operands wouldn't be wrapped inside a list)
  āÉÏ        # Keep all values at 0-based even indices again
     ε".e
     x"Så}   # Check for each item for each of [".","e","\n","x"] if it's in the item
          Ë  # Check if all inner lists are the same
             # (which is output implicitly as result)

0

Python 2 , 102 byte

import re
def f(s):
	m=map(eval,re.split('[*+-/]',s))
	return all(map(lambda t:type(t)==type(m[0]),m))

Hãy thử trực tuyến!

Không hoàn toàn chắc chắn làm thế nào để đại diện cho một số loại trong Python. Ví dụ, 0xff và 2 đều được coi là số nguyên. Và 2.4f không phải là một loại hợp lệ trong Python, tôi nghĩ vậy. Viết hoa Đúng và Sai để kiểm tra Booleans.

Chỉnh sửa: Ngữ pháp


3
Sẽ thất bại trong trường hợp thử nghiệm cuối cùng
Hiện thân của sự thiếu hiểu biết

... và (như nó đứng) true * falsemột.
Jonathan Allan

Nó chuyển cho "Đúng * Sai". Tôi có thể cố gắng làm cho nó hoạt động với chữ thường, nhưng tôi đã hình dung ra rằng các bool luôn được viết hoa trong python là đủ.
GotCubes

3
Hiện tại điều này không đáp ứng các tiêu chí thách thức. Cụ thể: Nó không xử lý trường hợp booleans một cách vô cảm, nó bị lỗi trên float và nó trả về không đúng khi được đưa ra một biểu thức bao gồm byte và số nguyên
Skidsdev

0

Stax , 26 byte

ïd"┬Z\¡►L!8$lm╗╕╤☻ú≡╝ò6Å>^

Chạy và gỡ lỗi nó

Chương trình này mong đợi không gian xung quanh các nhà khai thác. Nói chung, nó hoạt động bằng cách áp dụng một vài biến đổi cho đầu vào sao cho ký tự tối đa cho mỗi loại biểu thức là khác biệt.

Giải nén, không được chỉnh sửa và nhận xét, nó trông như thế này.

i           suppress automatic evaluation of input
'"/2::'s*   replace quoted strings with 's'
.\d'9R      replace all digits with '9'
.ez|t       replace 'e' with 'z'
j2::        split on spaces, and discard alternating groups (operators)
{|Mm        calculate the maximum character in each remaining group
:u          resulting array contains exactly one distinct value

Chạy cái này


0

Haskell, 140 byte

r(a:t)|a=='"'=a:r(tail$snd$span(/=a)t)|elem a"+-*/"=r t|0<1=a:r t
r n=n
f x|z<-[last$'i':(filter(`elem`t)"fex\"")|t<-words$r x]=all(==z!!0)z

2
f x=let z=...in ...có thể f x|z<-...=....
Jonathan Frech
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.