式を型チェックする


10

中置式を指定して、すべての定数が同じ型であるかどうかを判別します。

演算子は、これらの2 演算子のみで構成されます。+-/*

プログラムまたは関数は、有効な式文字列を入力として受け取り、式の定数が同じ場合は真の値を出力し、それ以外の場合は偽の値を出力する必要があります。

式は定数のみで構成され、次のタイプのいずれかを含むことができます。

  • 次の形式の文字列"String"(常に二重引用符で囲むことができ、エスケープ文字は使用できません。ASCIIテキストを含めることができます)
  • 次の形式の整数14(常に正またはゼロ)
  • 浮動7.3f小数点数の形式(常に正またはゼロ、常に小数部分があります14.0f
  • バイト、形式0x420-255、常に2つの16進文字)
  • 次の形式のブールtruetrueまたはfalse、大文字と小文字を区別しない)

型強制が存在しない場合、演算の順序は型に影響しないため、式には括弧が含まれません。

演算子のない単独の定数は有効な式です。

空の式は有効な式ではありません。

式文字列には、文字列リテラルの外側に空白が含まれていないと想定できます。
注:あるいは、テストケースに見られるように、定数と演算子の間に常にスペースがあると想定することもできます。この仮定を行う場合は、回答にそのように指定してください

などの無効な式を処理する必要はありません1 +

得点

これはので、最も少ないバイト数が勝ちます!

テストケース

(読みやすくするために空白を追加)

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
「ケース・小文字を区別しない」ブール値については、我々はすべてのケースをサポートするために持っていることを意味ですか?または、どちらのケースを使用するかを決定できるということですか?
Arnauld

@Arnauldはすべてのケースをサポートする必要があります
Skidsdev '30

@JonathanAllan私の解釈では、ケースの混合(例truE+fALSe)を処理する必要があるというものでした。そうでない場合、ソリューションで2バイトを節約できます。
ニックケネディ

回答:


9

JavaScript(ES6)、 79 77  75バイト

@ExpiredDataのおかげで2バイト節約

演算子の前後に空白が必要です。ブール値を返します。

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

オンラインでお試しください!

どうやって?

  1. すべての文字列を削除して、 /".*?"/g
  2. すべてのバイトを削除して、 /0x../g
  3. 以下を使用して、すべてのフロートを削除します /\S+f/g
  4. 残りの数字はで探します/\d/。見つかった場合、少なくとも1つの整数が必要です
  5. 残り"e""E"、またはを探します/e/i。見つかった場合、少なくとも1つのブール値が必要です

削除されたすべての式は、実際には無害なコンマで置き換えられます。

入力文字列に変化を引き起こさない正規表現を除外し、プロセスの最後に残っている正規表現が2つ未満かどうかをテストします。


trueそしてfalseケース小文字を区別しないものとしてマークされ、私は考えるの手段は、あなたがこれらを検索するときに、あなたの正規表現は、ケースを無視する必要があることtと、s(私が間違っているかの可能性)。
ジョナサンアラン

1
@JonathanAllan一時的な修正を行い、OPに尋ねました。
Arnauld


@ExpiredDataいいね。:)ありがとう!
アーノールド

3

Perl 5、73 -pバイト

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

オンラインでお試しください!

どうやって?

文字列、浮動小数点数、16進数、ブール値、整数の順に削除してみてください。何かが削除されたらすぐに停止します。停止後、残りの文字列が演算子と空白のみで構成されているかどうかを確認します。存在する場合、trypeチェックはtrueです。そうでない場合、それは誤りです。

最初の試み:Perl 5 -MList::Util=all -p 5、99バイト

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

オンラインでお試しください!


$_=/^[+\/* -]*$/$_=!y#-+/* ##cおよび....?eによって変更される場合があります.*e
Nahuel Fouilleul


58のバイトと仮定すると、常に定数と演算子の間にスペースがあるでしょう
ナウエルFouilleul

2

ゼリー30 23バイト

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

オンラインでお試しください!

文字列を入力として取り、trueの場合は1、falseの場合は0(Jellyのブール値)を返すモナディックリンク。演算子の前後に空白が必要です。

TIOにいくつかの新しいテストケースを追加しました。1つは3つの演算子、もう1つはブールの大文字と小文字の混合です。

説明

ṣ”"                     | 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

05AB1E50 24 バイト

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

@NickKennedyのJelly回答のポートを作成することにより-26バイトなので、必ず彼に 賛成票を投じてください。

オペランドにスペースを含む入力が必要です。

オンラインそれを試してみてくださいまたは全て(プラスいくつかのより多くの)テストケースを確認してください

説明:

'"¡         '# 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バイト

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

オンラインでお試しください!

これらの型のいくつかをPythonでどのように表現するかは完全にはわかりません。たとえば、0xffと2はどちらも整数として扱われます。そして、2.4fはPythonでは有効な型ではないと思います。ブール値をテストするために大文字と小文字を区別します。

編集:文法


3
最後のテストケースに失敗します
無知の実施

...そして(現状では)true * false1つです。
ジョナサンアラン

「True * False」を渡します。小文字で動作させることもできますが、ブールでは常にpythonで大文字が使用されるため、それで十分だと考えました。
GotCubes 2019

3
現在、これはチャレンジ基準を満たしていません。つまり、大文字と小文字を区別せずにブール値を処理せず、浮動小数点数でエラーが発生し、バイトと整数で構成される式が指定された場合に誤ってtrueが返される
Skidsdev

0

Stax、26 バイト

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

実行してデバッグする

このプログラムでは、演算子の周囲にスペースが必要です。一般に、各式タイプの最大文字が異なるように、いくつかの変換を入力に適用することで機能します。

開梱、ゴルフ、コメントをすると、次のようになります。

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

これを実行


0

Haskell、140バイト

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 ...することができますf x|z<-...=...
Jonathan Frech
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.