Apakah bilangan bulat, string, atau desimal?

8

Tantangan Anda adalah menentukan apakah input yang diberikan adalah integer, string, atau desimal.

Aturan

  • String adalah input apa pun yang bukan bilangan bulat atau float
  • Integer harus hanya berisi karakter numerik dan tidak boleh dimulai dengan nol
  • Desimal adalah input apa pun yang berisi titik ( .) dan titik tersebut dikelilingi oleh karakter numerik.

Catatan: .01 tidak dianggap sebagai desimal yang valid.

  • Program harus menampilkan string mentah baik "string", "integer", atau "desimal".
  • Anda dapat mengasumsikan hanya karakter ASCII yang dapat dicetak yang digunakan

Kasus:

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

EDIT: Memperbaiki kesalahan ketik. Maksud saya .01 tanpa nol di depan, bukan dengan. Jika itu membuatnya tidak jelas, ini sudah diperbaiki sekarang!

Ini , jadi jawaban tersingkat menang.

noɥʇʎԀʎzɐɹƆ
sumber
5
Mengapa 02 bukan bilangan bulat? Ini hanya terasa seperti pembatasan sewenang-wenang untuk meningkatkan kesulitan tantangan.
Addison Crump
1
Saya pikir 02tidak dianggap sebagai bilangan bulat karena sebagian besar bahasa memangkas angka nol di depan ketika jenisnya adalah integertetapi tetap angka nol di depan ketika disimpan sebagai string. Meskipun, saya dengan @isaacg bahwa jika 0.0dianggap desimal, maka 0.01harus juga demikian. .01tidak masuk akal, saya kira ...
hargasinski
3
@Zequ .01 tidak menghitung masuk akal, saya kira ... - mengapa? Ini berlaku di hampir setiap bahasa.
mınxomaτ
2
Selamat Datang di Programming Puzzles & Code Golf! Tidak perlu mem-ping semua orang yang mengomentari pertanyaan Anda secara tidak perlu; hasil edit Anda secara otomatis memasukkan pertanyaan Anda ke dalam antrean buka kembali, di mana ia akan dibuka kembali jika perlu. Selain itu, banyak tantangan Anda tampaknya telah ditutup; Anda mungkin ingin mencoba menjalankannya melalui Kotak Pasir kami terlebih dahulu . Terima kasih!
Gagang Pintu
1
@CrazyPython Saya pikir ide yang Anda maksud dengan "integer valid" dan "desimal valid" adalah ide representasi kanonik. Saat saya memahami aturan Anda, ada satu cara tepat untuk menulis setiap bilangan bulat dan setiap desimal. Jika itu maksudnya, menambahkannya ke tantangan akan memperjelas mengapa aturannya seperti itu.
isaacg

Jawaban:

3

Pyth, 33 byte (39 tanpa string yang dikemas)

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

Beberapa byte dilucuti karena penurunan harga. Kode resmi dan test suite.

Tanpa string yang dikemas:

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

Itu melewati semua kasus uji di atas. Pada dasarnya, untuk memeriksa apakah suatu string bilangan bulat atau desimal, ia memeriksa apakah string tersebut dapat dievaluasi sebagai python literal ( v), dan jika demikian, jika Anda dapat menambahkan 0 ke dalamnya dan rahasia kembali ke representasi stringnya, dan mendapatkan string input. Jika demikian, itu adalah bilangan bulat atau desimal. Jika Anda juga bisa melemparkannya ke int dan masih mendapatkan string asli kembali, itu adalah integer.

isaacg
sumber
2

Javascript, 112 121 87 byte

Terima kasih kepada @ edc65 untuk menghemat 34 byte dengan mengonversi kode asli (dalam penjelasan) ke ES6. Saya tidak mengubah penjelasan karena itu menunjukkan logika yang lebih baik.

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

Ini pada dasarnya mengubah aturan untuk bilangan bulat dan desimal dalam pertanyaan menjadi pemeriksaan regex, dan mengujinya terhadap input yang diberikan. Jika input tidak cocok, maka itu harus berupa string. Itu melewati semua tes yang diberikan dalam pertanyaan.

Penjelasan + tidak dikelompokkan

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.

}

hargasinski
sumber
Ini tampaknya gagal pada input seperti 01.23.
LegionMammal978
Saya memperbaikinya, melewati b("0.123")koper. Maaf tentang itu, karena hanya secara eksplisit disebutkan dalam pertanyaan bahwa bilangan bulat tidak dapat memiliki angka nol, saya berasumsi itu tidak berlaku untuk desimal.
hargasinski
Disingkat menjadi ES6 adalah 83 a=>/^[1-9]\d*$/.test(a)?"integer":/^([1-9]\d+|\d)\.\d+$/.test(a)?"decimal":"string"... toh bukan yang sesingkat mungkin
edc65
Terima kasih, saya memperbarui kode, saya harus menambahkannya b=agar berfungsi di Chrome. Bagi saya, ini menunjukkan yang asli yang Anda posting menjadi 85 byte, bukan 83, ditambah 2 byte dengan total 87.
hargasinski
@Zequ biasanya menugaskan fungsi ke variabel ( b=) tidak dihitung. Dan sisanya adalah 83, waspadalah terhadap karakter aneh yang tidak terlihat yang dimasukkan oleh editor komentar - ada beberapa di komentar saya sebelumnya antara "str" ​​dan "ing"
edc65
1

Java, 133 byte

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

JavaScript (ES6), 74 75

Edit 1 byte disimpan thx Zequ

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

Uji

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>

edc65
sumber
Anda bisa menghemat satu byte dengan mengubah [^0\D]dalam pertandingan regex ke[1-9]
hargasinski
@Sedikit petunjuk yang bagus, terima kasih ... menggunakan rentang senyawa tampak begitu pintar :(
edc65
1

Perl 5, 59 byte

Dengan -pargumen pada baris perintah (yang dihitung ke dalam jumlah byte):

chop;$_=!/\D|^0/?"integer":/^\d+\.\d+$/?"decimal":"string"
Codefun64
sumber
Gagal untuk 00.nn (coba 00.00)
edc65
1
Tetap. Padahal mungkin itu harus dalam uji kasus yang diberikan.
Codefun64
Itu harus. Di sisi lain, sering kasus uji tidak mencakup semua kasus yang mungkin.
edc65
Masih salah, sekarang memberi 'integer' untuk input .0. Untuk apa chop?
edc65
Tetap. Kehilangan minat pada tantangan ini. Tidak yakin apakah saya bisa mengoptimalkan perbaikan ini atau tidak. Chop diperlukan dalam iterasi naskah sebelumnya. Itu tidak suka baris baru dari input pengguna.
Codefun64
0

Perl 6 , 61 byte

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

Pemakaian:

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)
Brad Gilbert b2gills
sumber
0

Python 2, 148 byte

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'
Willem
sumber
0

JavaScript ES6, 74 70 byte

w=>w.match(/^\d+\.\d+$/)?"decimal":w.match(/^\d+$/)?"integer":"string"
nicael
sumber
gagal dengan kasus uji dari pertanyaan. Sungguh, tolong, uji sebelum memposting.
edc65
@edc Terima kasih atas umpan baliknya, tetapi bisakah Anda memberi tahu saya kasus apa yang gagal kecuali 02?
nicael
Senang Anda menemukannya sendiri
edc65
Lihatlah jawaban saya untuk biola.
Pavlo
Ini harus bekerja dengan kasus uji jika Anda berubah /^\d+$/menjadi ^[1-9]\d*(75 byte)
Chiru