Là 7 l8r hơn 9? (Là bảy muộn hơn chín?)


10

Đây là một thử thách golf mã khá đơn giản. Chương trình của bạn, được cung cấp một chuỗi ASCII, là phân tích chuỗi đó thành hai chuỗi mà nó sẽ đánh giá. Nếu chuỗi thứ hai "muộn" hơn chuỗi thứ nhất, nó sẽ trả về 1, nếu nó "sớm hơn" chuỗi thứ nhất, nó sẽ trả về -1 và nếu chúng giống nhau, nó sẽ trả về 0. làm rõ nghĩa "sau" và "sớm hơn" nghĩa là gì, hãy xem mã ký tự ASCII. Bạn cần so sánh từng ký tự của chuỗi, coi mỗi ký tự là chữ số của một số. Sau này đề cập đến một số lớn hơn, xảy ra sau một số nhỏ hơn. Các chuỗi sẽ được định dạng bằng một ký tự gạch nối để tách hai nhóm đầu vào.

Hãy xem ví dụ này:

7-9như một đầu vào sẽ trở lại 1.

7chuyển đổi thành mã ASCII 559chuyển đổi thành mã ASCII 57.

Như 57xảy ra số sau 55, 9muộn hơn 7.

Một vi dụ khac:

LKzb-LKaj như một đầu vào sẽ trở lại -1

Các chuỗi mã ASCII cho điều này là 76-75-122-9876-75-97-106

Đây là một thử thách golf mã và số byte là cách các mục sẽ được ghi.

Bất kỳ đầu vào nào từ 95 ký tự ASCII có thể in được đều được chấp nhận, ngoại trừ khoảng trắng và dấu gạch nối cho bất cứ thứ gì ngoại trừ tách đầu vào. Ngoài ra, các chuỗi không được đảm bảo có cùng độ dài.

Chúc may mắn!

EDIT: Để rõ ràng hơn, mỗi ký tự sẽ được coi như một chữ số trong một số. Trong ví dụ LKzb-LKaj, mặc dù jmuộn hơn b, zmuộn hơn avà vì nó là một chữ số có ý nghĩa hơn, nên nó được ưu tiên. Một chuỗi được cung cấp sẽ luôn có tối thiểu 3 ký tự, loại bỏ các chuỗi trống khỏi phạm vi của vấn đề này.

EDIT: Dưới đây là một số trường hợp thử nghiệm khác, để được giúp đỡ của bạn:

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

1
Hai chuỗi có được đảm bảo có cùng độ dài không?
es1024

5
Trường hợp kiểm tra 11-Z-> -1không có ý nghĩa cho từ ngữ hiện tại của câu hỏi. Z(90) lớn hơn 1(49) và là chữ cái có ý nghĩa nhất. Hãy làm rõ cách so sánh các chuỗi có độ dài khác nhau.
George Reith

2
Còn bạn thì A-AAsao?

2
@SamWeaver Tôi biết ngoài cùng bên trái là chữ số có ý nghĩa nhất do đó tôi bối rối không biết tại sao 11>Ztrong ví dụ của bạn là khi nào 1<Z. Phải có một số hành vi không xác định để thực hiện với các chuỗi có độ dài khác nhau hoặc ví dụ là sai.
George Reith

3
Như đã giải thích trước đây: mỗi chuỗi sẽ được coi là một chữ số trong một số cơ sở-127. Nếu bạn được tính trong hệ thống này, bạn sẽ bắt đầu bằng một ký tự, tăng nó lên hàng rào của các ký tự có thể in, ~ở mức 126, sau đó sẽ tăng chữ số tiếp theo lên một, trả lại chữ số ban đầu !. Mỗi mức tăng của chữ số có nghĩa nhất tương đương với tăng chữ số có ý nghĩa thứ hai lên 127.
Sam Weaver

Câu trả lời:


11

Pyth - 11 byte

Dễ dàng, sử dụng ._dấu hiệu để có được dấu hiệu và Cđể có được mã char.

._-F_CMcz\-

Hãy thử trực tuyến tại đây .

Bộ thử nghiệm .

._               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

Rất đẹp! Thực hiện như mong đợi.
Sam Weaver

7

CJam, 12 byte

l'-/esfb~\-g

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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.

Thông minh! Điều này vượt qua tất cả các trường hợp thử nghiệm.
Sam Weaver

6

Java, 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));}  

Một cách rất lạ để so sánh các chuỗi. Thực hiện một sửa chữa nhanh chóng để nó vượt qua các trường hợp thử nghiệm bổ sung, sẽ tìm kiếm nhiều golf hơn sau này.

Cảm ơn Vartan trong ý kiến ​​cho signumđề xuất


Không phải java so sánh trả lại 1,0, -1 dù sao? Tôi biết nó không được đảm bảo, nhưng có trường hợp nào không? trong trường hợp nàoreturn s[0].compareTo(s[1]);
Vartan

Điều này là tốt, nhưng nó không vượt qua trường hợp thử nghiệm 11-Ztrả lại -1, nó trở lại 1.
Sam Weaver

Ah, điều này không rõ ràng với tôi trước khi những trường hợp thử nghiệm được thêm vào. Đã sửa.
Geobits

@Vartan Không, nó trả về chênh lệch giá trị ở vị trí không khớp đầu tiên (hoặc chênh lệch về độ dài nếu có một và tất cả các ký tự khớp). Ví dụ, "A".compareTo("Z") trả về-25 . Không may.
Geobits

Bạn có thể giải thích dòng này? i = a!=b ? b-a : s[1].compareTo(s[0]);Tôi dường như không hiểu được ... Ngoài ra, bạn có thể sử dụng Math.signum và tự cứu mình khi khai báo i;
Vartan

4

Perl, 31 byte

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

30 byte + 1 byte cho -p. Chấp nhận đầu vào trên STDIN.

Giải trình

Khi các toán hạng cmpcó độ dài khác nhau, như chickenegg, chúng được căn chỉnh như thế này:

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

sao cho egg> chicken( \0là một byte rỗng). Nhưng chúng tôi muốn chúng được căn chỉnh như thế này:

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

vậy mà chicken> egg.

Để làm điều này, chúng tôi nối chúng, một lần với chickentrước eggvà một lần với eggtrước chicken:

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

Bây giờ hai chuỗi của chúng tôi có cùng độ dài, chúng tôi xóa từ đầu bằng XOR để nhận:

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

bây giờ chúng ta có thể sử dụng cmpđể tìm cái nào đến trước. (Ở đó, tôi đã nói nó!)


Rất thông minh- Bravo!
Sam Weaver

3

Python 2, 88 ký tự

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

cmpkhông làm điều đúng khi bạn có hai chuỗi độ dài khác nhau, vì vậy tôi phải đệm cả hai chuỗi bằng ký tự null ( ordchuyển đổi thành 0) để xử lý trường hợp đó. Thật không may, điều đó đã thêm khoảng 35 ký tự, cộng với bây giờ là hai dòng thay vì một dòng vì tôi cần cả độ dài của đầu vào và lặp lại trên nó.


Thật không may, đây không phải là một giải pháp hợp lệ. Các trường hợp thử nghiệm sau : 1-2, sẽ trả 1về -1. Thông minh làm việc mặc dù.
Sam Weaver

Rất tiếc, nó xuất hiện các toán hạng được hoán đổi. Điều đó thật kỳ lạ, tôi đã thử nghiệm nó với một vài trường hợp thử nghiệm của bạn và tôi nghĩ rằng nó hoạt động tốt! Không vấn đề gì, tôi có thể thay đổi nó mà không thay đổi số lượng nhân vật. Cho nó một shot ngay bây giờ.
Alex Van Liew

Chỉnh sửa của bạn đã khắc phục trường hợp đó, nhưng bây giờ nó không thành công, 11-Atrường hợp này sẽ trả về -1, thay vì trả về 1trong ví dụ này.
Sam Weaver

Tôi không thích quy tắc của bạn về chiều dài. Tôi đã sửa nó với chi phí khoảng 35 ký tự và tôi không nghĩ mình có thể làm cho nó tốt hơn.
Alex Van Liew

1
Tôi quản lý để có được một câu trả lời ngắn hơn của bạn bằng cách mã hóa chuỗi thành định dạng hex sau đó phân tích chuỗi đó dưới dạng int. Trong python 2, nó dường như được mặc định là kết thúc lớn cho việc này. Vì vậy, phần đệm 0 không còn cần thiết.
Cồn cát

2

R, 54 byte

Điều này đòi hỏi thư viện pracma. Nó tách chuỗi đầu vào trên -. Phải biện minh cho các chuỗi. Xếp hạng chúng và làm khác.

Vì vậy, trong 11-7, chúng tôi kết thúc với các chuỗi "11" và "7". Thứ hạng của những thứ này là [2, 1]. Sự khác biệt là -1. Trong 3h ~ J * -3h ~ J *, chúng tôi nhận được "3h ~ J *" và "3h ~ J *". Thứ hạng của những thứ này là [1,5, 1,5] với độ chênh lệch là 0.

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

Ví dụ kiểm tra

> 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

Tài giỏi. Làm tốt lắm :)
Alex A.

2

Cà phê, 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)`

Đây là một jsfiddle với kết quả (nhìn trong bảng điều khiển)


2

PERL, 46 36 byte

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

Chuyển đổi danh sách argv thành một chuỗi, phân tách bằng dấu gạch nối thành bên trái và bên phải không có khoảng trắng arg, sau đó trả về một cuộc gọi cmp.


Tôi nghi ngờ bạn có thể thoát khỏi một số không gian và;
MickyT

Có thể thoát khỏi: "@ARGV"=~/-/;print$`cmp$' (chưa được kiểm tra)
Jarmex

1
Ý tưởng tốt để sử dụng cmp, nhưng nó không hoạt động khi độ dài chuỗi khác nhau. "A" cmp "9"là 1 trong khi "11" cmp "Z"là -1, mặc dù cả hai đầu vào sẽ trả về cùng một giá trị cho thử thách này.
ThisSuitIsBlackNot

1

Python 3, 84 byte

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

Chia chuỗi đầu vào bằng "-". Chuyển đổi chuỗi unicode thành chuỗi byte, sau đó diễn giải các chuỗi byte này dưới dạng số nguyên lớn. Cuối cùng, thực hiện so sánh - (un) may mắn cmplà không còn có sẵn trong Python 3.

Python 2, 69 byte

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

Bạn có thể cạo một ký tự bằng cách xóa khoảng trắng giữa printcmp.
Alex Van Liew

1

Python 2, 79 byte

Giải pháp khá đơn giản và dễ hiểu. So sánh độ dài chuỗi, sau đó so sánh các chuỗi từ vựng.

Hãy thử nó ở đây

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

Chỉ cần chạy nó từ dòng lệnh. Mặc dù nó sẽ trông tốt hơn với một dòng mới nhưng chi phí là 1 char.

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

Phiên bản dài hơn này xử lý độ dài không khớp chính xác.


/-/,$_=$`cmp$'sẽ dễ dàng hơn, và bạn có thể bỏ qua -aF-bit. Ngoài ra, tôi đếm số này là 20 (16 cho $_=$F[1]cmp$F[0]và 4 cho paF-, được lưu vào một tệp và chạy dưới dạng perl -paF- file.pl).
Primo

1
Như tôi đã lưu ý về câu trả lời của Eric , cmpkhông hoạt động khi hai chuỗi có độ dài khác nhau, giống như với 11-Z.
ThisSuitIsBlackNot

@ ThisSuitIsBlackNot, đã sửa.
hildred

Đẹp. Bạn có thể chơi golf xuống tới 39 với /-/;$_=length$'<=>length$`||$' cmp$`-p. ( $`lưu trữ mọi thứ trước khi khớp regex, $'lưu trữ mọi thứ sau.) Sử dụng mapthực sự tốn nhiều byte hơn là chỉ gọi lengthhai lần.
ThisSuitIsBlackNot

0

F #, 53

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

Đây là dưới dạng một hàm ẩn danh (lambda), vì vậy bạn phải dán nó và cung cấp tham số trực tiếp sau đó là (hoặc, sử dụng ký hiệu đường ống). Ví dụ: (trong 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

JavaScript ES6, 46 43 byte

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

Công việc tốt, nhưng điều này không hoàn thành trường hợp thử nghiệm 2: 11-Znên trả lại -1nhưng nó trả về 1.
Sam Weaver

1
@SamWeaver Thật vậy, điều đó đã được thêm vào sau câu trả lời và cũng phá vỡ các câu trả lời khác. Bạn có thể giải thích tại sao '11'>'Z'khi '11'<'ZZ'không có gì trong câu hỏi về cách so sánh chuỗi có độ dài khác nhau hoặc giá trị của chuỗi trống có giá trị gì.
George Reith

Ý định của câu hỏi không bao giờ thay đổi, tôi chỉ thêm những trường hợp kiểm tra đó và làm rõ vì tôi nhận ra rằng tôi không đủ rõ ràng ngay từ đầu. Bạn đúng rằng tôi không bao giờ xác định giá trị của một chuỗi trống và tôi sẽ cập nhật câu hỏi tương ứng. Những trường hợp thử nghiệm đã không thay đổi hành vi hoặc mục tiêu của câu hỏi, chỉ làm rõ nó. Các ví dụ bạn đặt tên hàm là như vậy bởi vì mỗi ký tự phải được coi là một "chữ số" riêng lẻ trong một số cơ sở tương đương với tất cả các ký tự ASCII có thể in được. Cơ chế của câu hỏi không bao giờ thay đổi, chỉ đơn giản là trở nên rõ ràng hơn.
Sam Weaver

1
@SamWeaver Thay đổi từ hành vi không xác định sang xác định sẽ thay đổi nó. Không có gì không phải là một nhân vật. Trừ khi nó là ký tự null, cái này xử lý.
George Reith

0

Ruby, 59 byte

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

0

05AB1E , 12 11 9 byte

'-¡₄ö¥0.S

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

'-¡          # 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]
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.