입력 유형 결정


15

문제는 간단합니다. 입력 유형을 결정하고 입력 유형을 알려주는 식별자를 출력합니다.

  • "UI", 부호없는 정수 : 0, 1, 34,111111111111111111111111111111111111111111
  • 정수 서명 "SI", : +0, +1, +42, -1, -3,-111111111111111111111111111111111111111111
  • "UD"서명되지 않은 소수 : 0.0, 1.23,1234.1234
  • 소수점 서명 "SD", : -0.0, +0.0,-1.235
  • "LE", 편지 : a- zA-Z
  • "SY", 기호 : ASCII 코드 포인트 : [32-47, 58-64, 91-96, 123-126](예 : 숫자와 문자를 제외한 모든 문자)
  • "ST", 문자열 : 위의 숫자 형식으로 구문 분석 할 수없는 두 개 이상의 문자

규칙 :

  • 입력 길이는 1-99 자입니다.
  • 입력은 인쇄 가능한 ASCII 문자, 코드 포인트 32-126 만 포함합니다.
  • 출력은 위에서 정의한 두 개의 식별자 문자 여야합니다 (UI, SI ...).
  • 표준 I / O 규칙이 적용됩니다

예 :

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

SY둘 이상의 캐릭터가 될 수 있습니까 ?
FryAmTheEggman

111111111111111111111111111111111111111111정수 유형 이라고 생각하지 않습니다 .
Matt

@FryAmTheEggman sy는 하나의 문자입니다.
Stewie Griffin

그래서 입력을 문자열로 가져 옵니까?
lirtosiast

6
@ 매트는, 그것은을하지 않을 수 있습니다 uint8또는 int64, 그러나 확실히의 정수 .
Stewie Griffin

답변:


0

Pyth-47 바이트

슬라이싱 트릭으로 몇 바이트 떨어져 골프를 칠 수 있습니다.

.x-+?@z"+-"\S\U?@z\.\D\Isz?!tz?}rzZG"LE""SY""ST

테스트 스위트 .


5

자바 스크립트 (ES6), 99

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

테스트

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
나는 누군가가 공유 사례를 최적화 할 수 있다고 확신했지만 parseInt를 사용하여 글자를 감지하는 것을 좋아합니다.
Neil

정규 표현식의 첫 번째 ()는 필요하지 않습니다
Awashi

@Awashi S 또는 U를 구별하기위한 표시를 위해 캡처 그룹이 필요하기 때문에 필요합니다.
edc65

@WashingtonGuedes 아니오, (\+|-)바이트를 저장할 수는 없습니다
edc65

3

튜링 머신 코드, 1544 바이트

온라인으로 사용해보십시오!

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
완전히 골프화 된 코드를 포함 시키십시오. 공백을 제거 할 수 없으면 바이트 수로 계산해야합니다.
Mego

2
제거 할 수없는 것처럼 보이며, 기호 사이에 공백이 없으면 프로그램이 제대로 작동하지 않습니다.
Matthew Smith

"+ -1"(예제에서)을 ST로 분류하지 않는 것 같습니다.
Xantix

2

망막, 98 97 바이트

내 정규식 기술을 실제로 연습하는 좋은 방법입니다.

온라인으로 사용해보십시오!

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

4
1 바이트를 저장 ^[a-zA-Z]$하도록 변경할 수 있습니다i`^[a-z]$
daavko

1

루아, 157 바이트

온라인으로 사용해보십시오!

골프 :

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")

언 골프 드 :

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

자바 스크립트 (ES6) 125 120 바이트

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

대체 버전, 120 바이트 :

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

정규 표현식은 정규 표현식 eval(`/regex/`)생성자 + 템플릿 문자열을 사용하여 골프를 칠 수 있습니다
Downgoat

0

자바, 192 바이트

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");할 수 있습니다 return v.length()<2?"SY":"ST";(-3 바이트) 아니면이 될 수 있습니다 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 바이트 ) 그리고 추가로 변경할 수 String t(String v)v->당신은 자바 8 람다를 사용하는 경우.
케빈 크루이 ssen

0

자바 스크립트 (ES6), 138 바이트

나는 사용하려고 replace 더 "멋진" .

이렇게하면 형식의 문자열을 반환하는 익명 함수가 생성됩니다.

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

이를 개선하기위한 팁은 전적으로 환영합니다.


1
1.해서는 ST안됩니다 UD. 당신의 변경 \d*\d+
edc65

@ edc65 어떻게? 십진수입니다. 그것과 같습니다 1.0.
Ismael Miguel

그것은 유효 할 수도 있고 아닐 수도 있습니다 ( 1.대신 쓰지 않습니다 1) 그러나 그것은 당신의 선택이나 내 것이 아닙니다 : 테스트 사례가 있습니다
edc65

@ edc65 당신이 맞아요. 나는 매우 큰 목록을 건너 뛰었습니다. 나는 그것을 고쳤다. 감사!
Ismael Miguel

0

파이썬 3.5 - (241) 240 바이트 :

( @CatsAreFluffy 덕분에 1 바이트가 절약되었습니다 )

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'

조금 길지만 작업을 거의 완벽하게 수행합니다. 이것은 정규 표현 기술을 향상시키는 정말 좋은 방법이었습니다. 도전 해 주셔서 감사합니다. :) 가능하면 더 줄이려고 노력하겠습니다.


공간을 절약하기 위해 가져 오기 를 기능 외부로 다시 이동할 수 있습니다 . (백틱이없는 멋진 iPad 키보드)
CalculatorFeline

@CatsAreFluffy 그래, 나는 생각하지 않았다. 감사합니다! :)
R. Kap

@ CatsAreFluffy : 실제로 iOS 키보드 백틱을 허용합니다! 내 아이폰 : 사용하여 쓰기 인하에 필요로 할 때 나는 다른 일에서 이걸 발견 meta.stackexchange.com/questions/133673/...
호머 심슨

@CatsAreFluffy 니스! 알아두면 좋습니다.
R. Kap

또한 len(d)>0==d>[]
CalculatorFeline

0

Tcl 414 바이트

읽을 수없는 구현되지 않은 구현 :

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]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.