7 l8r이 9보다입니까? (7시 9시 이후입니까?)


10

이것은 매우 간단한 코드 골프 도전입니다. ASCII 문자열이 지정된 프로그램은 해당 문자열을 두 개의 문자열로 구문 분석하여 평가합니다. 두 번째 문자열이 첫 번째 문자열보다 "나중"인 경우 1을 반환하고 첫 번째 문자열보다 "이전"인 경우 -1을 반환하고 동일한 경우 0을 반환합니다. "나중"과 "이전"의 의미를 명확히하고 ASCII 문자 코드를 살펴 보자. 문자열의 각 문자를 비교하여 각 숫자를 숫자의 숫자로 취급해야합니다. 나중에는 더 작은 수 이후에 발생하는 더 큰 수를 나타냅니다. 문자열은 하이픈 문자로 형식화되어 두 입력 그룹을 구분합니다.

이 예제를 살펴보십시오.

7-9입력으로를 반환해야합니다 1.

7ASCII 코드로 변환 55하고, 9ASCII 코드로 변환 57.

57이후 55에 숫자 적으로 발생하는 대로 9보다 늦습니다 7.

또 다른 예:

LKzb-LKaj 입력으로 반환해야합니다 -1

이에 대한 ASCII 코드 시퀀스가 76-75-122-9876-75-97-106

이것은 코드 골프 도전이며, 바이트 수는 항목의 점수를 매기는 방법입니다.

공백을 제외하고 입력을 분리하는 것 외에는 하이픈을 포함하여 95 개의 인쇄 가능한 ASCII 문자의 모든 입력이 허용됩니다. 또한 문자열의 길이가 동일하지 않을 수도 있습니다.

행운을 빕니다!

편집 : 더 명확하게하기 위해 각 문자는 숫자의 숫자처럼 취급됩니다. 예에서 LKzb-LKaj, 비록 j보다 늦은 b, z나중에보다 a, 그것은 더 중요한 자리이기 때문에, 우선한다. 제공된 문자열은 항상 3 자 이상이므로이 문제의 범위에서 빈 문자열이 제거됩니다.

편집 : 다음은 도움이되는 몇 가지 테스트 사례입니다.

  • A-9 -> -1
  • 11-Z -> -1
  • 3h~J*-3h~J* -> 0
  • Xv-Y0 -> 1

1
두 줄의 길이가 동일합니까?
es1024

5
테스트 사례 11-Z-> -1질문의 현재 단어가 주어지면 의미가 없습니다. Z(90)은 1(49) 보다 크며 가장 중요한 문자입니다. 길이가 다른 문자열을 비교하는 방법을 명확히하십시오.
George Reith

2
그리고 A-AA어때요?

2
@SamWeaver 나는 가장 왼쪽에있는 숫자가 가장 중요한 숫자이므로 11>Z귀하의 예에서 왜 혼란 스럽습니까 1<Z. 길이가 다른 문자열과 관련하여 정의되지 않은 동작이 있거나 예제가 잘못되었습니다.
George Reith

3
앞에서 설명한대로 : 각 문자열은 기본 -127 숫자의 숫자로 처리됩니다. 이 시스템에서 계산하려면 문자로 시작하여 ~126에서 인쇄 가능한 문자의 장벽까지 늘린 다음 다음 자릿수를 1 씩 늘리고 초기 자릿수를로 되돌 !립니다. 최상위 유효 숫자가 증가 할 때마다 두 번째 최상위 숫자가 127 씩 증가하는 것과 같습니다.
Sam Weaver

답변:


11

Pyth-11 바이트

쉽고, ._부호를 사용 하여 부호 C를 얻고 문자 코드를 얻습니다.

._-F_CMcz\-

여기에서 온라인으로 사용해보십시오 .

테스트 스위트 .

._               Sign of number
 -F              Fold subtraction (this finds difference of a tuple)
  _              Reverse list to get correct order of operands when subtracting
   CM            Map char, already treats strings as digits of base256 number
    c \-         Split by "-"
     z           Input

아주 좋아요! 예상대로 수행합니다.
Sam Weaver

7

CJam, 12 바이트

l'-/esfb~\-g

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

l   e# Read a line from STDIN.
'-/ e# Split it at spaces.
es  e# Push the current time (milliseconds since epoch).
fb  e# Consider each string as digits in base huge-number.
~\  e# Dump the results and reverse their order.
-g  e# Subtract and apply sign function.

우수한! 이것은 모든 테스트 사례를 통과합니다.
Sam Weaver

6

자바, 86 (118)

int f(String...s){return(int)Math.signum((s=s[0].split("-"))[1].compareTo(s[0])*(s[0].length()==s[1].length()?1:-1));}  

문자열을 비교하는 매우 이상한 방법입니다. 추가 테스트 사례를 통과하여 나중에 더 많은 골프를 찾아 볼 수 있도록 빠른 수정을했습니다.

signum제안에 대한 의견 으로 Vartan에게 감사드립니다.


어쨌든 자바의 비교는 1,0, -1을 반환하지 않습니까? 보장되지는 않지만 알고 있지 않은 경우가 있습니까? 이 경우return s[0].compareTo(s[1]);
Vartan

이것은 좋지만 11-Zreturning 테스트 사례를 통과하지 못하면을 반환 -1합니다 1.
Sam Weaver

아, 테스트 케이스가 추가되기 전에 이것은 명확하지 않았습니다. 결정된.
Geobits

@Vartan No, 첫 번째 비 일치 위치에서의 값 차이 (또는 하나의 문자와 모든 문자가 일치하는 경우 길이 차이)를 반환합니다. 예를 "A".compareTo("Z") 들어을 반환합니다-25 . 운수 나쁘게.
Geobits

이 줄을 설명 할 수 있습니까? i = a!=b ? b-a : s[1].compareTo(s[0]);나는 그것을 얻지 못하는 것 같습니다 ... 또한, 당신은 아마도 Math.signum을 사용하고 i를 선언하는 자신을 구할 수 있습니다.
Vartan

4

펄, 31 바이트

#!/usr/bin/perl -p
/-/;$_=($`.$'^$`)cmp($'.$`^$')

용 1 바이트 + 30 바이트 -p. STDIN의 입력을 승인합니다.

설명

피연산자가 and와 cmp같은 다른 길이 를 가지면 다음과 같이 정렬됩니다.chickenegg

c  h  i  c  k  e  n
e  g  g  \0 \0 \0 \0

그래서 egg> chicken( \0는 널 바이트입니다). 그러나 우리는 그것들이 다음과 같이 정렬되기를 원합니다.

c  h  i  c  k  e  n
\0 \0 \0 \0 e  g  g

그래서 chicken> egg.

이를 위해, 우리는 한 번 그들을 연결하여 chicken이전 egg과에 한 번 egg전에 chicken:

c  h  i  c  k  e  n  e  g  g
e  g  g  c  h  i  c  k  e  n

이제 두 문자열의 길이가 같으므로 XOR을 사용하여 주요 단어를 제거하여 다음을 얻습니다.

\0 \0 \0 \0 \0 \0 \0 e  g  g
\0 \0 \0 c  h  i  c  k  e  n

그리고 지금 우리가 사용할 수있는 cmp첫번째 들어온 찾을 수 있습니다. (내가 말했어!)


매우 영리한 브라보!
Sam Weaver

3

파이썬 2, 88 자

a=raw_input().split('-');print-cmp(*(map(ord,s.rjust(max(map(len,a)),'\0'))for s in a))

cmp두 개의 다른 길이의 문자열이있을 때 올바른 일을하지 않으므로이 경우 를 처리하기 위해 둘 다 null 문자 (로 ord변환 0)로 채워야합니다. 불행히도 약 35 문자가 추가되었으며 입력 길이와 반복이 필요하기 때문에 한 줄이 아니라 두 줄이되었습니다.


불행히도 이것은 유효한 솔루션이 아닙니다. 다음 테스트 사례 : . returns를 반환 1-2해야 1합니다 -1. 그러나 영리한 작업.
Sam Weaver

피연산자가 교환 된 것처럼 보입니다. 정말 이상합니다. 몇 가지 테스트 사례로 테스트했으며 정상적으로 작동한다고 생각했습니다! 어쨌든 문자 수를 변경하지 않고 변경할 수 있습니다. 지금 쏴봐
Alex Van Liew

편집하여 해당 사례를 수정했지만 이제는 이 예제에서 리턴 하는 대신 11-A리턴해야합니다 . -11
샘 위버

나는 당신의 길이 규칙을 좋아하지 않습니다. 나는 약 35 자의 비용으로 그것을 고쳤으며 더 나아질 수 없다고 생각합니다.
Alex Van Liew

1
문자열을 16 진수 형식으로 인코딩 한 다음 해당 문자열을 int로 구문 분석하여 귀하보다 짧은 답변을 얻을 수있었습니다. 파이썬 2에서는 기본적으로 큰 엔디안으로 보입니다. 따라서 0 패딩은 더 이상 필요하지 않습니다.
모래 언덕

2

R, 54 바이트

pracma 라이브러리가 필요합니다. 입력 문자열을에서 분할합니다 -. 문자열을 오른쪽으로 맞 춥니 다. 그들을 순위 화하고 diff를합니다.

따라서 11-7의 경우 문자열 "11"과 "7"로 끝납니다. 이들의 순위는 [2, 1]입니다. 차이는 -1입니다. 3h ~ J * -3h ~ J *의 경우 "3h ~ J *"및 "3h ~ J *"를 얻습니다. 이들의 순위는 [1.5, 1.5]이며 diff는 0입니다.

diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))

테스트 예

> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: LKzb-LKaj
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: A-9
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 11-Z
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 3h~J*-3h~J*
3: 
Read 2 items
[1] 0
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: Xv-Y0
3: 
Read 2 items
[1] 1

영리한. 좋은 일 :)
Alex A.

2

커피 스크립트, 143 (140) 139

f=(s)->[a,b]=((t=s.split '-').map (y)->Array((m=Math.max) 1, 1+(m ((l=(c)->c.length) t[0]),l t[1])-l y).join('\u0000')+y);`b<a?-1:(b>a?1:0)`

다음은 결과에 대한 jsfiddle은 (콘솔의 모양)입니다


2

PERL, 46 36 바이트

print$2cmp$1if"@ARGV"=~/(\S+)-(\S+)/

argv 목록을 문자열로 변환하고 하이픈으로 공백없이 왼쪽과 오른쪽으로 분할 한 다음 cmp 호출을 반환합니다.


나는 당신이 많은 공간을 제거 할 수 있다고 생각합니다.
MickyT

다음과 같이 도망 갈 수 있어야합니다 : "@ARGV"=~/-/;print$`cmp$' (
예상치 않음

1
를 사용하는 cmp것이 좋지만 문자열 길이가 다른 경우에는 작동하지 않습니다. 두 입력 모두이 챌린지에 대해 동일한 값을 반환해야하지만 "A" cmp "9"1 "11" cmp "Z"은 -1입니다.
ThisSuitIsBlackNot

1

파이썬 3, 84 바이트

x,y=[int.from_bytes(i.encode(),"big")for i in input().split("-")];print((x<y)-(y<x))

문자열 입력을로 나눕니다 "-". 유니 코드 문자열을 바이트 문자열로 변환 한 다음이 바이트 문자열을 빅 엔디안 정수로 해석하십시오. 마지막으로 비교를 수행하십시오-불행히도 cmp파이썬 3에서는 더 이상 사용할 수 없습니다.

파이썬 2, 69 바이트

print -cmp(*[int(i.encode("hex"),16)for i in raw_input().split("-")]) 

print와 사이의 공백을 제거하여 문자를 제거 할 수 있습니다 cmp.
Alex Van Liew

1

파이썬 2, 79 바이트

매우 간단한 솔루션이며 이해하기 쉽습니다. 문자열 길이를 비교 한 다음 문자열을 사 전적으로 비교합니다.

여기 사용해보십시오

s,t=raw_input().split('-')
x,y=len(s),len(t)
print(x<y)*2-1if x-y else cmp(t,s)

1

perl5, 64

perl -aF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

명령 줄에서 실행하십시오. 새로운 줄로 더 좋아 보이지만 1 문자가 든다.

perl -laF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

이 더 긴 버전은 일치하지 않는 길이를 올바르게 처리합니다.


/-/,$_=$`cmp$'더 쉬울 것이고 -aF-비트를 건너 뛸 수 있습니다 . 또한이 값을 20으로 계산합니다 (16은 16 $_=$F[1]cmp$F[0], 4 paF-는 파일에 저장하고로 실행 perl -paF- file.pl).
primo

1
Eric의 대답 에서 언급했듯이 cmp두 문자열의 길이가 서로 다른 경우 작동하지 않습니다 11-Z.
ThisSuitIsBlackNot

@ThisSuitIsBlackNot, 고정.
hildred

좋은. 당신이 할 수있는 골프 아래에 39 그 /-/;$_=length$'<=>length$`||$' cmp$`-p. ( $`정규 표현식이 일치하기 전에 모든 것을 $'저장하고 나중에 모든 것을 저장합니다.) map실제로 length두 번 호출하는 것보다 더 많은 바이트가 필요 합니다.
ThisSuitIsBlackNot

0

F #, 53

fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a

이것은 익명 함수 (lambda) 형식이므로, 붙여넣고 바로 뒤에 (또는 파이핑 표기법을 사용하여) 매개 변수를 제공해야합니다. 예를 들어 (FSI에서) :

> "7-9" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
1
> "abc-abc" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
0
> "LKzb-LKaj" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
-1

0

자바 스크립트 ES6, 46 43 바이트

f=s=>((a=s.split('-'))[1]>a[0])-(a[1]<a[0])

잘 했어,하지만이 테스트 케이스 (2)를 달성하지 않습니다는 : 11-Z반환해야 -1하지만 반환합니다 1.
Sam Weaver

1
@SamWeaver 실제로, 그것은 답변 후에 추가되었으며 다른 답변도 중단합니다. 왜 설명 할 '11'>'Z''11'<'ZZ'서로 다른 길이의 문자열이나 어떤 값을 빈 문자열이 비교하는 방법에 대한 질문에 아무것도 없다.
George Reith

질문의 의도는 바뀌지 않았습니다. 처음에는 명확하지 않다는 것을 깨달았 기 때문에 테스트 사례와 설명 만 추가했습니다. 빈 문자열의 값을 정의하지 않았으므로 그에 따라 질문을 업데이트 할 것입니다. 이러한 테스트 사례는 질문의 동작이나 목표를 변경하지 않았으며 단순히 설명했습니다. 각 문자는 기본적으로 인쇄 가능한 모든 ASCII 문자와 동등한 숫자에서 개별 "숫자"로 취급되어야하므로 함수 이름을 지정하는 예제입니다. 이 질문의 메커니즘은 결코 바뀌지 않았으며 단순히 더 명확 해졌습니다.
Sam Weaver

1
@SamWeaver 정의되지 않은 동작에서 정의 된 것으로 변경하면 변경됩니다. 아무것도 성격이 아닙니다. 이것이 처리하는 널 문자가 아닌 한.
George Reith

0

루비, 59 바이트

a,b=gets.chomp.split ?-
p (b.size<=>a.size).nonzero?||b<=>a

0

05AB1E , 12 11 9 바이트

'-¡₄ö¥0.S

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

'-¡          # Split the (implicit) input on '-'
             #  i.e. 'LKzb-LKaj' → ['LKzb','LKaj']
   ₄ö        # Convert both parts to a Base-1000 number
             #  i.e. ['LKzb','LKaj'] → [21020061037,21020036045]
     ¥       # Push the deltas (subtraction between each sub sequential pair) of the list
             #  i.e. [21020061037,21020036045] → [-24992]
      0.S    # Get the sign [1 for a>0; -1 for a<0; 0 for a==0] (and output implicitly)
             #  i.e. [-24992] → [-1]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.