Ketik-periksa ekspresi

10

Diberikan ekspresi infiks, tentukan apakah semua konstanta memiliki tipe yang sama.

Operator hanya akan terdiri dari operator diad ini :+-/*

Program atau fungsi Anda harus mengambil string ekspresi yang valid sebagai input, dan menampilkan nilai kebenaran jika konstanta dalam ekspresi adalah waktu yang sama, dan nilai falsey sebaliknya.

Ekspresi hanya akan terdiri dari konstanta, dan dapat berisi salah satu dari jenis berikut:

  • String, dari bentuk "String"(Selalu kutip ganda, dapat kosong, tanpa karakter pelarian, dapat berisi teks ASCII)
  • Integer, dari formulir 14(Selalu positif atau nol)
  • Float, dari bentuk 7.3f(Selalu positif atau nol, selalu memiliki komponen desimal, misalnya 14.0f)
  • Byte, dari formulir 0x42( 0-255, Selalu 2 karakter heksadesimal)
  • Boolean, dari bentuk true( trueatau false, case-sensitive)

Ekspresi tidak akan mengandung tanda kurung, karena urutan operasi tidak mempengaruhi tipe ketika tidak ada tipe paksaan.

Satu-satunya konstanta tanpa operator adalah ekspresi yang valid.

Ekspresi kosong bukanlah ekspresi yang valid.

Anda dapat mengasumsikan bahwa string ekspresi tidak mengandung spasi putih di luar string literal.
Catatan: Atau Anda dapat mengasumsikan bahwa akan selalu ada ruang antara konstanta dan operator, seperti yang terlihat di dalam testcases. Jika Anda membuat asumsi ini, sebutkan seperti dalam jawaban Anda

Anda tidak harus menangani ekspresi tidak valid seperti 1 +.

Mencetak gol

Ini , byte paling sedikit menang!

Uji kasus

(Whitespace ditambahkan untuk dibaca)

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
Skidsdev
sumber
4
Apakah "case sensitive" untuk nilai Boolean berarti bahwa kita harus mendukung semua case? Atau kita dapat memutuskan kasing mana yang akan digunakan?
Arnauld
@Arnauld harus mendukung semua kasus
Skidsdev
@Jonathan Allan interpretasi saya adalah bahwa kami harus menangani setiap campuran kasus (mis truE+fALSe.). Jika tidak, saya dapat menyimpan dua byte dalam solusi saya.
Nick Kennedy

Jawaban:

9

JavaScript (ES6),  79 77  75 byte

Disimpan 2 byte berkat @ExpiredData

Mengharapkan ruang kosong di sekitar operator. Mengembalikan nilai Boolean.

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

Cobalah online!

Bagaimana?

  1. Kami menghapus semua string, menggunakan /".*?"/g
  2. Kami menghapus semua byte, menggunakan /0x../g
  3. Kami menghapus semua pelampung, menggunakan /\S+f/g
  4. Kami mencari digit yang tersisa dengan /\d/; jika kita menemukannya, setidaknya harus ada satu bilangan bulat
  5. Kami mencari yang tersisa "e"atau "E"dengan /e/i; jika kita menemukannya, setidaknya harus ada satu nilai Boolean

Semua ekspresi yang dihapus sebenarnya diganti dengan koma, yang tidak berbahaya.

Kami memfilter ekspresi reguler yang menyebabkan tidak ada perubahan pada string input dan menguji apakah kurang dari dua dari mereka tetap pada akhir proses.

Arnauld
sumber
truedan falseditandai sebagai tidak sensitif huruf, saya pikir itu berarti Anda harus membuat huruf besar-besar abaikan saat mencari tdan s(saya bisa salah).
Jonathan Allan
1
@ JonathanAllan Saya sudah melakukan perbaikan sementara dan meminta OP.
Arnauld
75 byte
Expired Data
@ExpiredData Bagus. :) terima kasih!
Arnauld
3

Perl 5 -p , 73 byte

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

Cobalah online!

Bagaimana?

Coba hapus string, float, hex, boolean, dan integer, dalam urutan itu. Hentikan segera setelah sesuatu dihapus. Setelah berhenti, periksa untuk melihat apakah string yang tersisa hanya terdiri dari operator dan spasi putih. Jika ya, pemeriksaan trype benar; jika tidak, itu salah.

Upaya pertama: 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}}{

Cobalah online!

Xcali
sumber
$_=/^[+\/* -]*$/dapat diubah oleh $_=!y#-+/* ##c, dan ....?eoleh.*e
Nahuel Fouilleul
jika tidak dalam satu regex, 63 byte
Nahuel Fouilleul
58 byte dengan asumsi akan selalu ada ruang antara konstanta dan operator
Nahuel Fouilleul
2

Jelly , 30 23 byte

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

Cobalah online!

Tautan monadik yang menggunakan string sebagai input dan mengembalikan 1 untuk true dan 0 untuk false (nilai boolean Jelly). Mengharapkan ruang kosong di sekitar operator.

Saya telah menambahkan beberapa test case baru ke TIO termasuk satu dengan tiga operator dan satu dengan case campuran untuk boolean.

Penjelasan

ṣ”"                     | 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)
Nick Kennedy
sumber
1

05AB1E , 50 24 byte

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

-26 byte dengan membuat port dari jawaban Jelly @NickKennedy , jadi pastikan untuk membesarkannya !!

Mengharapkan input dengan spasi di operan.

Cobalah online atau verifikasi semua (ditambah beberapa lagi) kasus uji .

Penjelasan:

'"¡         '# 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)
Kevin Cruijssen
sumber
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))

Cobalah online!

Tidak sepenuhnya yakin bagaimana mewakili beberapa tipe ini dengan Python. Misalnya, 0xff dan 2 sama-sama diperlakukan sebagai bilangan bulat. Dan 2.4f bukan tipe yang valid dalam Python, saya pikir. Dikapitalisasi Benar dan Salah untuk menguji Boolean.

Edit: Tata Bahasa

GotCubes
sumber
3
Akan gagal ujian terakhir
Perwujudan Ketidaktahuan
... dan (sebagaimana adanya) yang true * false.
Jonathan Allan
Ini berlaku untuk "Benar * Salah". Saya dapat mencoba membuatnya bekerja dengan huruf kecil, tapi saya pikir karena bools selalu dikapitalisasi dengan python akan cukup.
GotCubes
3
Saat ini ini tidak memenuhi kriteria tantangan. Yaitu: Ia tidak menangani case booleans dengan tidak sensitif, kesalahan pada float, dan itu salah mengembalikan true ketika diberi ekspresi yang terdiri dari byte dan integer
Skidsdev
0

Stax , 26 byte

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

Jalankan dan debug itu

Program ini mengharapkan ruang di sekitar operator. Secara umum, ini bekerja dengan menerapkan beberapa transformasi pada input sehingga karakter maksimum untuk setiap jenis ekspresi berbeda.

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

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

Jalankan yang ini

rekursif
sumber
0

Haskell, 140 Bytes

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
Benji
sumber
2
f x=let z=...in ...bisa f x|z<-...=....
Jonathan Frech