Nó là một số nguyên, một chuỗi, hay một số thập phân?


8

Thử thách của bạn là xác định xem đầu vào đã cho là số nguyên, chuỗi hay số thập phân.

Quy tắc

  • Chuỗi là bất kỳ đầu vào nào không phải là số nguyên hoặc dấu phẩy
  • Một số nguyên phải chỉ chứa các ký tự số và không được bắt đầu bằng số 0
  • Số thập phân là bất kỳ đầu vào nào chứa dấu chấm ( .) và dấu chấm được bao quanh bởi các ký tự số.

Lưu ý: .01 không được coi là số thập phân hợp lệ.

  • Chương trình sẽ xuất ra một chuỗi thô là "chuỗi", "số nguyên" hoặc "thập phân".
  • Bạn có thể giả sử chỉ sử dụng các ký tự ASCII có thể in được

Các trường hợp:

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: Đã sửa lỗi chính tả. Tôi có nghĩa là .01 mà không có số 0 đứng đầu, không phải với. Nếu điều đó làm cho nó không rõ ràng, nó đã được sửa ngay!

Đây là , vì vậy câu trả lời ngắn nhất sẽ thắng.


5
Tại sao 02 không phải là số nguyên? Những điều này chỉ cảm thấy như hạn chế tùy ý để tăng độ khó thử thách.
Addison Crump

1
Tôi nghĩ rằng 02không được coi là một số nguyên bởi vì hầu hết các ngôn ngữ cắt các số 0 đứng đầu khi loại là một integernhưng giữ các số 0 đứng đầu khi nó được lưu dưới dạng a string. Mặc dù, tôi với @isaacg rằng nếu 0.0được coi là số thập phân thì 0.01cũng nên như vậy. .01không tính có ý nghĩa, tôi đoán ...
hargasinski

3
@Zequ .01 không tính có ý nghĩa, tôi đoán ... - tại sao? Nó có giá trị trong hầu hết các ngôn ngữ.
mınxomaτ

2
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Không cần ping tất cả những người bình luận về câu hỏi của bạn; chỉnh sửa của bạn tự động đặt câu hỏi của bạn vào hàng đợi mở lại, nơi nó sẽ được mở lại nếu cần thiết. Hơn nữa, nhiều thử thách của bạn dường như đã bị đóng lại; bạn có thể muốn thử chạy chúng qua Sandbox của chúng tôi trước . Cảm ơn!
Doorknob

1
@CrazyPython Tôi nghĩ rằng ý tưởng bạn đang có với "số nguyên hợp lệ" và "số thập phân hợp lệ" là ý tưởng của một biểu diễn chính tắc. Theo tôi hiểu quy tắc của bạn, có chính xác một cách để viết từng số nguyên và từng số thập phân. Nếu đó là ý định, thêm điều đó vào thử thách sẽ làm rõ lý do tại sao các quy tắc là như vậy.
isaacg

Câu trả lời:


3

Pyth, 33 byte (39 không có chuỗi đóng gói)

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

Một số byte bị tước do Markdown. Mã chính thức và bộ thử nghiệm.

Không có chuỗi đóng gói:

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

Nó vượt qua tất cả các trường hợp thử nghiệm ở trên. Về cơ bản, để kiểm tra xem một chuỗi là số nguyên hay số thập phân, nó kiểm tra xem chuỗi đó có thể được đánh giá là một python bằng chữ ( v) hay không, và nếu vậy, nếu bạn có thể thêm 0 vào chuỗi đó và chuyển nó trở lại biểu diễn chuỗi của nó và lấy chuỗi đầu vào. Nếu vậy, nó là một số nguyên hoặc một số thập phân. Nếu bạn cũng có thể chuyển nó thành một int mà vẫn lấy lại chuỗi gốc, thì đó là một số nguyên.


2

Javascript, 112 121 87 byte

Cảm ơn @ edc65 đã lưu 34 byte bằng cách chuyển đổi mã gốc (trong phần giải thích) sang ES6. Tôi đã không thay đổi lời giải thích vì nó cho thấy logic tốt hơn.

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

Điều này về cơ bản chuyển đổi các quy tắc cho một số nguyên và số thập phân trong câu hỏi thành kiểm tra regex và kiểm tra chúng theo đầu vào đã cho. Nếu đầu vào không khớp, thì nó phải là một chuỗi. Nó vượt qua tất cả các bài kiểm tra được đưa ra trong câu hỏi.

Ungolfed + giải thích

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.

}


Điều này dường như thất bại trên đầu vào như 01.23.
LegionMammal978

Tôi đã sửa nó, nó vượt qua b("0.123")trường hợp. Xin lỗi về điều đó, vì nó chỉ được đề cập rõ ràng trong câu hỏi rằng một số nguyên không thể có số 0 đứng đầu, tôi cho rằng nó không áp dụng cho số thập phân.
hargasinski

Rút ngắn thành ES6 là 83 a=>/^[1-9]\d*$/.test(a)?"integer":/^([1-9]\d+|\d)\.\d+$/.test(a)?"decimal":"string"... dù sao cũng không phải là ngắn nhất có thể
edc65

Cảm ơn bạn, tôi đã cập nhật mã, tôi phải thêm b=nó để hoạt động trong Chrome. Đối với tôi, nó hiển thị bản gốc mà bạn đã đăng là 85 byte, thay vì 83, cộng với 2 byte cho tổng số 87.
hargasinski

@Zequ thường gán hàm cho một biến ( b=) không được tính. Và phần còn lại 83, hãy cẩn thận với các ký tự vô hình kỳ lạ được chèn bởi trình chỉnh sửa nhận xét - có một số trong nhận xét trước đây của tôi giữa "str" ​​và "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";}

1

JavaScript (ES6), 74 75

Chỉnh sửa 1 byte đã lưu thx Zequ

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

Kiểm tra

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>


Bạn có thể lưu một byte bằng cách thay đổi [^0\D]trong trận đấu regex thành[1-9]
hargasinski

@Zequ gợi ý tốt, cảm ơn ... sử dụng phạm vi kết hợp có vẻ rất thông minh :(
edc65

1

Perl 5, 59 byte

Với -pđối số trên dòng lệnh (được tính vào số byte):

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

Thất bại cho bất kỳ 00.nn (thử 00.00)
edc65

1
Đã sửa. Mặc dù có lẽ nên trong các trường hợp thử nghiệm được đưa ra.
Codefun64

Nó nên. Mặt khác, thường các trường hợp kiểm tra không bao gồm tất cả các trường hợp có thể.
edc65

Vẫn còn sai, bây giờ nó cho 'số nguyên' cho đầu vào .0. Để làm gì chop?
edc65

Đã sửa. Mất hứng thú với thử thách này. Không chắc chắn tôi có thể tối ưu hóa sửa chữa này hay không. Chop là cần thiết trong một lần lặp trước của kịch bản. Nó không giống như dòng mới từ đầu vào của người dùng.
Codefun64

0

Perl 6 , 61 byte

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

Sử dụng:

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 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'

0

JavaScript ES6, 74 70 byte

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

nó thất bại với các trường hợp thử nghiệm từ câu hỏi. Thực sự, xin vui lòng, kiểm tra trước khi đăng.
edc65

@edc Cảm ơn bạn đã phản hồi, mặc dù bạn có thể vui lòng cho tôi biết trường hợp nào không thành công ngoại trừ 02?
nicael

Vui mừng khi bạn tự tìm thấy nó
edc65

Có một cái nhìn vào câu trả lời của tôi cho một fiddle.
Pavlo

Nó sẽ hoạt động với các trường hợp thử nghiệm nếu bạn thay đổi /^\d+$/thành ^[1-9]\d*(75 byte).
Chiru
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.