Xác định loại đầu vào


15

Thách thức rất đơn giản: Xác định loại đầu vào và đầu ra một mã định danh cho biết loại đó là gì.

  • "UI", nguyên Unsigned: 0, 1, 34,111111111111111111111111111111111111111111
  • "SI", Signed số nguyên: +0, +1, +42, -1, -3,-111111111111111111111111111111111111111111
  • "UD", thập phân Unsigned: 0.0, 1.23,1234.1234
  • "SD", Signed thập phân: -0.0, +0.0,-1.235
  • "LÊ", Thư: a- zA-Z
  • "SY", Ký hiệu: Điểm mã ASCII: [32-47, 58-64, 91-96, 123-126](tức là tất cả các ký tự ngoại trừ số và chữ cái)
  • "ST", Chuỗi: Hai hoặc nhiều ký tự không thể được phân tích cú pháp như bất kỳ định dạng số nào ở trên

Quy tắc:

  • Đầu vào sẽ dài 1-99 ký tự
  • Đầu vào sẽ chỉ chứa các ký tự ASCII có thể in, các điểm mã: 32-126.
  • Đầu ra phải là hai chữ cái định danh như được định nghĩa ở trên (UI, SI ...)
  • Áp dụng quy tắc I / O tiêu chuẩn

Ví dụ:

UI:
0
01
34
12938219383278319086135768712319838871631827319218923

SI:
-0
+01
+1
-123
+123

UD:
0.0
3.1415
2.718281828459045235360287471352662497757

SD:
+0.0
-3.1415
+2.718281828459045235360287471352662497757

LE:
a
k
L
Z

SY:
@
"
+
-

ST:
Hello, World!
f2!"
+23df
1234A
'"!
.012
1.
UI
+-1
5+3

SYthể nhiều hơn một nhân vật?
FryAmTheEggman

Tôi sẽ không coi 111111111111111111111111111111111111111111là loại số nguyên.
Matt

@FryAmTheEggman sy chỉ có một ký tự.
Stewie Griffin

Vì vậy, chúng tôi lấy đầu vào là một chuỗi?
lirtosiast

6
@ Matt, Nó có thể không phải là một uint8hay int64, nhưng nó chắc chắn là một số nguyên .
Stewie Griffin

Câu trả lời:



5

JavaScript (ES6), 99

x=>(z=x.match(/^([+-])?\d+(\.\d+)?$/))?'SU'[+!z[1]]+'DI'[+!z[2]]:x[1]?'ST':parseInt(x,36)?'LE':'SY'

Kiểm tra

f=x=>(z=x.match(/^([+-])?\d+(\.\d+)?$/))?'SU'[+!z[1]]+'DI'[+!z[2]]:x[1]?'ST':parseInt(x,36)?'LE':'SY'

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

;console.log(['0','01','34','12938219383278319086135768712319838871631827319218923'].map(x=>f(x)+' '+x).join`\n`)
;console.log(['-0','+01','+1','-123','+123'].map(x=>f(x)+' '+x).join`\n`)
;console.log(['0.0','3.1415','2.718281828459045235360287471352662497757'].map(x=>f(x)+' '+x).join`\n`)
;console.log(['+0.0','-3.1415','+2.718281828459045235360287471352662497757'].map(x=>f(x)+' '+x).join`\n`)
;console.log([...'akLZ'].map(x=>f(x)+' '+x).join`\n`)
;console.log([...'@"+-'].map(x=>f(x)+' '+x).join`\n`)
;console.log(['Hello, World!','f2!"','+23df','1234A',`'"!`,'.012','1.','UI','+-1','5+3'].map(x=>f(x)+' '+x).join`\n`)
<pre id=O></pre>


1
Tôi khá chắc chắn rằng ai đó sẽ có thể tối ưu hóa cho các trường hợp được chia sẻ nhưng tôi thích việc bạn sử dụng parseInt để phát hiện các chữ cái.
Neil

Đầu tiên () trong regex của bạn là không cần thiết
Awashi

@Awashi là cần thiết vì tôi cần một nhóm chụp cho dấu hiệu để phân biệt S hoặc U.
edc65

@WashingtonGuedes không, có thể (\+|-)nhưng không có byte nào được lưu
edc65

3

Mã máy Turing, 1544 byte

Hãy thử trực tuyến!

0 + _ r s
0 - _ r s
0 0 _ r u
0 1 _ r u
0 2 _ r u
0 3 _ r u
0 4 _ r u
0 5 _ r u
0 6 _ r u
0 7 _ r u
0 8 _ r u
0 9 _ r u
0 a _ r l
0 b _ r l
0 c _ r l
0 d _ r l
0 e _ r l
0 f _ r l
0 g _ r l
0 h _ r l
0 i _ r l
0 j _ r l
0 k _ r l
0 l _ r l
0 m _ r l
0 n _ r l
0 o _ r l
0 p _ r l
0 q _ r l
0 r _ r l
0 s _ r l
0 t _ r l
0 u _ r l
0 v _ r l
0 w _ r l
0 x _ r l
0 y _ r l
0 z _ r l
0 A _ r l
0 B _ r l
0 C _ r l
0 D _ r l
0 E _ r l
0 F _ r l
0 G _ r l
0 H _ r l
0 I _ r l
0 J _ r l
0 K _ r l
0 L _ r l
0 M _ r l
0 N _ r l
0 O _ r l
0 P _ r l
0 Q _ r l
0 R _ r l
0 S _ r l
0 T _ r l
0 U _ r l
0 V _ r l
0 W _ r l
0 X _ r l
0 Y _ r l
0 Z _ r l
0 * _ r y
s 0 _ r s
s 1 _ r s
s 2 _ r s
s 3 _ r s
s 4 _ r s
s 5 _ r s
s 6 _ r s
s 7 _ r s
s 8 _ r s
s 9 _ r s
s . _ r d
s _ _ r i
s * _ r T
u 0 _ r u
u 1 _ r u
u 2 _ r u
u 3 _ r u
u 4 _ r u
u 5 _ r u
u 6 _ r u
u 7 _ r u
u 8 _ r u
u 9 _ r u
u . _ r D
u _ _ r I
u * _ r T
l _ _ r L
l * _ r T
y _ _ r S
y * _ r T
d 0 _ r d
d 1 _ r d
d 2 _ r d
d 3 _ r d
d 4 _ r d
d 5 _ r d
d 6 _ r d
d 7 _ r d
d 8 _ r d
d 9 _ r d
d _ _ r e
d * _ r T
i 0 _ r i
i 1 _ r i
i 2 _ r i
i 3 _ r i
i 4 _ r i
i 5 _ r i
i 6 _ r i
i 7 _ r i
i 8 _ r i
i 9 _ r i
i _ _ r j
i * _ r T
D 0 _ r D
D 1 _ r D
D 2 _ r D
D 3 _ r D
D 4 _ r D
D 5 _ r D
D 6 _ r D
D 7 _ r D
D 8 _ r D
D 9 _ r D
D _ _ r E
D * _ r T
I 0 _ r I
I 1 _ r I
I 2 _ r I
I 3 _ r I
I 4 _ r I
I 5 _ r I
I 6 _ r I
I 7 _ r I
I 8 _ r I
I 9 _ r I
I _ _ r J
I * _ r T
L * L r M
M * E r halt
S * S r Y
Y * Y r halt
e * S r f
f * D r halt
j * S r k
k * I r halt
E * U r f
J * U r k
T _ S r U
T * _ r T
U * T r halt

3
Vui lòng bao gồm một phiên bản đầy đủ của mã. Nếu khoảng trắng không thể được loại bỏ, nó phải được tính vào số byte.
Mego

2
Có vẻ như không thể xóa được, chương trình không hoạt động chính xác nếu không có khoảng cách giữa các ký hiệu.
Matthew Smith

Nó dường như không phân loại "+ -1" (từ các ví dụ) dưới dạng ST.
Xantix

2

Võng mạc, 98 97 byte

Một cách tốt đẹp để thực hành kỹ năng regex của tôi thực sự.

Hãy thử trực tuyến!

^(?![+-]?\d+(\.\d+)?$)..+
ST
^([+-]?)\d+$
$1UI
^([+-]?)\d+\.\d+$
$1UD
i`^[a-z]$
LE
^.$
SY
[+-]U
S

4
Bạn có thể thay đổi ^[a-zA-Z]$để i`^[a-z]$lưu một byte
daavko

1

Lua, 157 byte

Hãy thử trực tuyến!

Chơi gôn

n=(...)m=string.match s=m(n,"^[+-]")and"S"or"U"print(m(n,"^[+-]?%d+%.%d+$")and s.."D"or m(n,"^[+-]?%d+")and s.."I"or m(n,"^%w$")and"LE"or#n==1 and"SY"or"ST")

Ung dung:

n = "2.718281828459045"

s = n:sub(1,1):match("[+-]") and "S" or "U"

if n:match("^[+-]?%d+%.%d+$") then
    print(s.."D")
elseif n:match("^[+-]?%d+") then
    print(s.."I")
elseif n:match("^%w$") then
    print("LE")
elseif #n==1 then
    print("SY")
else
    print("ST")
end

1

JavaScript (ES6), 125 120 byte

s=>"UISIUDSDLESYST".substr(s.match(/^((\d+)|([+-]\d+)|(\d+\.\d+)|([+-]\d+\.\d+)|([A-Z])|(.)|(.*))$/i).indexOf(s,2)*2-4,2)

Phiên bản thay thế, cũng 120 byte:

s=>"STUISIUDSDLESY".substr(s.match(/^(?:(\d+)|([+-]\d+)|(\d+\.\d+)|([+-]\d+\.\d+)|([A-Z])|(.)|.*)$/i).lastIndexOf(s)*2,2)

Chắc chắn regex có thể được chơi với một hàm tạo regex eval(`/regex/`)+ chuỗi mẫu
Downgoat

0

Java, 192 byte

String t(String v){for(String[]x:new String[][]{{"\\d+","UI"},{"[-+]\\d+","SI"},{"\\d+\\.\\d+","UD"},{"[-+]\\d+\\.\\d+","SD"}})if(v.matches(x[0]))return x[1];return (v.length()==1?"SY":"ST");}

return (v.length()==1?"SY":"ST");có thể là return v.length()<2?"SY":"ST";(-3 byte) Hoặc có thể là thế này: String t(String v){for(String x:"UI\\d+;SI[-+]\\d+;UD\\d+\\.\\d+;SD[-+]\\d+\\.\\d+".split(";"))if(v.matches(x.substring(2)))return x.substring(0,2);return v.length()<2?"SY":"ST";}( 179 byte ) Và ngoài ra, bạn có thể thay đổi String t(String v)thành v->khi bạn sử dụng lambda Java 8.
Kevin Cruijssen

0

Javascript (ES6), 138 byte

Tôi đã cố gắng sử dụng một replace để trở nên "lạ mắt" hơn.

Điều này tạo ra một hàm ẩn danh trả về chuỗi kiểu.

s=>s.replace(/^((([+-])?(\d+)(\.\d+)?)|([a-z])|([ -~])|([^\0]*))$/i,(_,a,b,c,d,e,f,g)=>b?(c?'S':'U')+(e?'D':'I'):(f?'LE':'S'+(g?'Y':'T')))

Bất kỳ lời khuyên để cải thiện điều này sẽ hoàn toàn được chào đón.


1
1.nên ST, không nên UD. Thay đổi \d*thành\d+
edc65

@ edc65 thế nào? Đó là một số thập phân. Điều đó cũng giống như 1.0.
Ismael Miguel

Nó có thể hợp lệ hoặc không (tôi không viết 1.thay vì 1) NHƯNG Đó không phải là lựa chọn của bạn hay của tôi: có những trường hợp thử nghiệm
edc65

@ edc65 Bạn nói đúng. Tôi bỏ qua danh sách RẤT lớn. Tôi đã sửa nó. Cảm ơn!
Ismael Miguel

0

Python 3.5 - 241 240 byte:

( Đã lưu 1 byte nhờ @CatsAreFluffy )

import re
def r(g):
 y={'^\d+$':'UI','^[+-]\d+$':'SI','^[0-9]\d*(\.\d+)?$':'UD','[+-](?=[0-9]\d*(\.\d+))':'SD','[a-zA-Z]+':'LE','^[^A-Za-z0-9]+$':'SY'};d=[y[i]for i in list(y.keys())if re.match(i,g)]
 if len(d)>0:return d[0]
 else:return'ST'

Nó có thể hơi dài, nhưng công việc khá hoàn hảo. Đây là một cách thực sự tốt để cải thiện kỹ năng diễn đạt thường xuyên của tôi. Cảm ơn về thử thách. :) Tôi sẽ cố gắng và rút ngắn nó nhiều hơn nếu tôi có thể.


Bạn có thể di chuyển nhập lại ra bên ngoài chức năng để tiết kiệm một không gian. (Bàn phím iPad ngu ngốc không có backticks)
CalculatorFeline

@CatsAreFluffy Vâng, tôi không nghĩ về điều đó. Cảm ơn bạn! :)
R. Kap

@CatsAreFluffy: Trên thực tế, bàn phím iOS không cho phép backticks! Tôi đã tìm thấy điều này vào một ngày khác khi tôi cần viết markdown bằng iPhone của mình :) meta.stackexchange.com/questions/133673/
homersimpson

@CatsAreFluffy Đẹp! Đó là điều tốt để biết.
R. Kap

Cũng thế len(d)>0 ==d>[]
CalculatorFeline

0

Tcl 414 byte

thực hiện vô căn cứ, có thể đọc được:

proc a b {
  if {[string index $b 0] eq "+" || [string index $b 0] eq "-"} {
    set c S
  } elseif {[string match {[A-Za-z]} $b]} {
    return LE
  } elseif {[regexp {^(?![+-]?\d+(\.\d+)?$)..+} $b]} {
    return ST
  } elseif {[regexp {[^a-zA-Z0-9.]} $b]} {
    return SY
  } else {
    set c U
  }
  if {[string match *.* $b]} {
    return $c\U
  } else {
    return $c\I
  }
}
puts [a $argv]
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.