それは整数、文字列、または小数ですか?


8

問題は、指定された入力が整数、文字列、または10進数のいずれであるかを判別することです。

ルール

  • 文字列は、整数でも浮動小数点数でもない任意の入力です
  • 整数には数字のみを含める必要があり、ゼロで始めることはできません
  • 10進数は、ピリオド(.)を含み、ピリオドが数字で囲まれている任意の入力です。

注: .01は有効な10進数と見なされません

  • プログラムは、「string」、「integer」、または「decimal」のいずれかの生の文字列を出力する必要があります。
  • 印刷可能なASCII文字のみが使用されていると想定できます

ケース:

asdf -> string
asdf3.4 -> string
2 -> integer
2.0 -> decimal
02 -> string
40. -> string
. -> string
.01 -> string
0.0 -> decimal
.9.9.9 -> string
[empty space] -> string

編集:タイプミスを修正しました。私は、先頭のゼロなしで.01を意味しました。それが不明確になった場合は、修正されました!

これはので、最も短い答えが勝ちます。


5
02が整数ではないのはなぜですか?チャレンジの難易度を上げるために、これらは恣意的な制限のように感じます。
Addison Crump、2015

1
02ほとんどの言語では、型がの場合は先行ゼロをトリムしますが、integerとして格納される場合は先行ゼロを維持するため、整数とは見なされませんstring。ただし、@ isaacgを使用しているので0.0、10進数と見なされれば、それも10進数に0.01なります。.01数えないのは理にかなっていると思います...
ハルガシンスキー

3
@Zequ .01カウントしないのは理にかなっていると思います ...- なぜですか?ほとんどすべての言語で有効です。
mınxomaτ

2
プログラミングパズルとコードゴルフへようこそ!質問にコメントしたすべての人に不必要にpingを送信する必要はありません。編集により、質問は自動的に再オープンキューに入れられ、必要に応じて再オープンされます。さらに、あなたの課題の多くは解決されたようです。まずサンドボックスで実行しててください。ありがとう!
ドアノブ

1
@CrazyPython「有効な整数」と「有効な10進数」で得られるアイデアは、正規表現のアイデアだと思います。あなたのルールを理解しているように、各整数と各小数を書き込む方法は1つだけです。それが意図である場合、それをチャレンジに追加すると、ルールが規則どおりである理由が明らかになります。
isaacg

回答:


3

Pyth、33バイト(パックされた文字列なしの39)

@_c."at%¸Ã`9hàãáÊ"7.x/`MsB+vz0z0

Markdownにより、一部のバイトが削除されます。公式コードとテストスイート。

パックされた文字列なし:

@_c"integerdecimalstring"7.x/`MsB+vz0z0

上記のすべてのテストケースに合格します。基本的に、文字列が整数か10進数かを確認するために、文字列がPythonリテラル(v)として評価できるかどうかを確認し、評価できる場合は、0を追加して文字列表現に変換し、入力文字列。もしそうなら、それは整数または小数です。それをintにキャストしても元の文字列が返される場合、それは整数です。


2

JavaScript、112 121 87バイト

(説明の)元のコードをES6に変換して34バイトを節約してくれた@ edc65に感謝します。ロジックがよくわかるので、説明は変更しませんでした。

b=a=>/^[1-9]\d*$/.test(a)?"integer":/^([1-9]\d+|\d)\.\d+$/.test(a)?"decimal":"str‌​ing"

これは基本的に、質問の整数と小数の規則を正規表現チェックに変換し、指定された入力に対してそれらをテストします。入力が一致しない場合、文字列でなければなりません。それは質問で与えられたすべてのテストに合格します。

非ゴルフ+説明

function b(a) {
    if(/^[1-9]\d*$/.test(a)) // regex check for the rules of an 'integer':
        return"integer";     // ^[1-9] - check to make sure the first digit
                             // \d* - check to make sure that it is followed by zero or more digits
                             // $ - ensures that the previous check continues to the end of the word
    if(/^([1-9]\d+|\d)\.\d+$/.test(a)) // regex check for the rules of a 'decimal', starting from the middle
        return"decimal";     // \. checks for a '.' in the word
                             // the ([1-9]\d+|\d) and \d+ check to make sure the '.' is surrounded by
                             // one or more numerical characters on each side.
                             // the ^,$ ensure that the match is for the whole word
return"string";              // none of the others match, so it must be a string.

}


これはなどの入力で失敗するよう01.23です。
LegionMammal978 2015

私はそれを修正しました、それはb("0.123")ケースを通過します。それについて申し訳ありませんが、整数は先行ゼロを持つことができないという質問で明示的に言及されただけなので、私はそれが小数には適用されないと仮定しました。
hargasinski

ES6への短縮は83 a=>/^[1-9]\d*$/.test(a)?"integer":/^([1-9]\d+|\d)\.\d+$/.test(a)?"decimal":"string"...とにかく最短ではありません
edc65

ありがとう、私はコードを更新しましたb=。それをChromeで動作させるには追加する必要がありました。私にとって、それはあなたが投稿元1が87の合計85バイトの代わりに、83、プラス2バイトであることを示している
hargasinski

@Zequは通常、関数を変数(b=)に割り当ててもカウントされません。そして、残り 83です。コメントエディターによって挿入された奇妙な目に見えない文字に注意してください-以前のコメントの "str"と "ing"の間にいくつかあります
edc65

1

Java、133バイト

String t(String v){if(v.matches("[1-9]\\d*"))return "integer";if(v.matches("(0|[1-9]\\d+)\\.\\d+"))return "decimal";return "string";}

1

JavaScript(ES6)、74 75

保存された1バイトのZequを編集

f=i=>(i=i.match(/^(0|[1-9]\d*)(\.\d+)?$/))?i[2]?'decimal':'integer':'string'

テスト

f=i=>(i=i.match(/^(0|[1-9]\d*)(\.\d+)?$/))?i[2]?'decimal':'integer':'string'

console.log=x=>O.textContent +=x +'\n';

// test cases from the question and some more
s=['asdf','asdf3.4','02','40.','.','.01','.9.9.9','','0.0.0','00.00','02.00']
i=['2', '11', '1000']
d=['2.0','0.0', '1.009', '911.1','123.4567890']

console.log('Strings:')
s.forEach(x=>console.log('<'+x+'> -> '+f(x)))
console.log('Integers:')
i.forEach(x=>console.log('<'+x+'> -> '+f(x)))
console.log('Decimals:')
d.forEach(x=>console.log('<'+x+'> -> '+f(x)))
<pre id=O></pre>


[^0\D]正規表現の一致を次のように変更することで、バイトを節約できます[1-9]
hargasinski '27

@Zequ良いヒント、ありがとう...複合範囲を使用するのはとても賢明なように見えました:(
edc65

1

Perl 5、59バイト

-p(バイト数に計算される)、コマンドラインの引数:

chop;$_=!/\D|^0/?"integer":/^\d+\.\d+$/?"decimal":"string"

00.nnで失敗(00.00を試行)
edc65

1
修繕。おそらくそれは与えられたテストケースにあるはずです。
Codefun64

そうすべき。一方、多くの場合、テストケースはすべての可能なケースをカバーしません。
edc65

まだ間違っていますが、今は入力に「整数」を与えます.0。何のchopためですか?
edc65

修繕。この挑戦への興味を失った。この修正を最適化できたかどうかわかりません。スクリプトの以前の反復ではチョップが必要でした。ユーザー入力からの改行は好きではありませんでした。
Codefun64

0

Perl 6、61バイト

{<string integer decimal>[?/^[(\d+\.\d+)|<[1..9]>\d*]$/+?$0]} # 61

使用法:

say «asdf asdf3.4 2 2.0 02 40. . .01 0.0 .9.9.9 ''».map: {...}
(string string integer decimal string string string string decimal string string)

0

Python 2、148バイト

def f(s):
 try:
  t=float(s);assert s[0]!='0'
  if `t+0`==s:return'decimal'
  if `int(t)`==s:return'integer'
  return'string'
 except:return'string'


assert f('asdf') == 'string'
assert f('asdf3.4') == 'string'
assert f('2') == 'integer'
assert f('2.0') == 'decimal'
assert f('.') == 'string'
assert f('.01') == 'string'
assert f('.9.9.9') == 'string'
assert f(' ') == 'string'    
assert f('40.') == 'string'
assert f('02') == 'string'
assert f('0.0') == 'string'
assert f('00.00') == 'string'

0

JavaScriptのES6、74の 70バイト

w=>w.match(/^\d+\.\d+$/)?"decimal":w.match(/^\d+$/)?"integer":"string"

質問のテストケースで失敗します。投稿前にテストしてください。
edc65

@edcフィードバックをありがとうござい02ます。
nicael

自分で見つけてうれしい
edc65

フィドルに対する私の答えを見てください。
Pavlo、2015

(75バイト)に変更/^\d+$/すると、テストケースで動作するはず^[1-9]\d*です。
チル、2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.