7 l8r มากกว่า 9 หรือไม่ (คือเจ็ดหลังจากเก้า)


10

นี่คือความท้าทายกอล์ฟรหัสค่อนข้างง่าย โปรแกรมของคุณที่มีสตริง ASCII คือการแยกสตริงนั้นออกเป็นสองสายซึ่งมันจะทำการประเมิน หากสตริงที่สองคือ "ภายหลัง" มากกว่าสตริงแรกมันจะส่งกลับ 1 หากเป็น "ก่อนหน้า" กว่าสตริงแรกมันจะส่งกลับ -1 และถ้าพวกเขาเหมือนกันก็จะกลับ 0 ชี้แจงว่า "ในภายหลัง" และ "ก่อนหน้า" หมายถึงอะไรลองดูที่รหัสอักขระ ASCII คุณต้องเปรียบเทียบอักขระแต่ละตัวของสตริงโดยถือว่าแต่ละอักขระเป็นตัวเลขของตัวเลข หลังจากนั้นหมายถึงจำนวนที่มากขึ้นเกิดขึ้นหลังจากจำนวนที่น้อย สตริงจะถูกจัดรูปแบบด้วยอักขระยัติภังค์เพื่อแยกกลุ่มอินพุตสองกลุ่ม

ดูตัวอย่างนี้:

7-91ในฐานะที่เป็นอินพุตควรกลับ

7แปลงรหัส ASCII 55และแปลงรหัส9 ASCII57

ในฐานะที่57เกิดขึ้นหลังจากที่ตัวเลข55, ช้ากว่า97

ตัวอย่างอื่น:

LKzb-LKaj ตามที่อินพุตควรกลับมา -1

ลำดับรหัส ASCII สำหรับสิ่งนี้คือ76-75-122-98และ76-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
ตามที่อธิบายไว้ก่อนหน้า: แต่ละสตริงจะต้องถือว่าเป็นตัวเลขในจำนวนฐาน -128 หากคุณกำลังจะนับในระบบนี้คุณจะเริ่มต้นด้วยตัวอักษรเพิ่มมันขึ้นอยู่กับอุปสรรคของตัวอักษรพิมพ์ที่~126 !จากนั้นจะเพิ่มขึ้นหลักถัดไปโดยหนึ่งกลับหลักเริ่มต้น การเพิ่มขึ้นของตัวเลขที่สำคัญที่สุดแต่ละครั้งจะเทียบเท่ากับการเพิ่มตัวเลขที่มีความสำคัญมากที่สุดที่สองโดย 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

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

วิธีที่แปลกมากในการเปรียบเทียบสตริง ทำการแก้ไขอย่างรวดเร็วเพื่อให้ผ่านกรณีทดสอบเพิ่มเติมจะมองหา golfiness เพิ่มเติมในภายหลัง

ขอบคุณ Vartan ในความคิดเห็นสำหรับsignumข้อเสนอแนะ


การเปรียบเทียบผลตอบแทนของ Java ไม่ 1,0, -1 ยังไงก็ตาม? ฉันรู้ว่ามันไม่รับประกันว่าจะมี แต่มีกรณีใด ๆ ที่มันไม่ได้? ในกรณีนี้return s[0].compareTo(s[1]);
Vartan

นี้เป็นสิ่งที่ดี แต่ก็ไม่ผ่านกรณีทดสอบของ11-Zกลับมาก็จะส่งกลับ-1 1
Sam Weaver

อานี่ไม่ชัดเจนสำหรับฉันก่อนที่จะเพิ่มกรณีทดสอบเหล่านั้น แก้ไขแล้ว.
Geobits

@Vartan ไม่มันคืนค่าส่วนต่างให้กับตำแหน่งที่ไม่ได้จับคู่แรก (หรือความยาวต่างกันถ้ามีตัวอักษรหนึ่งและตรงกันทั้งหมด) ตัวอย่างเช่นผลตอบแทน"A".compareTo("Z") -25น่าเสียดาย.
Geobits

คุณอธิบายบรรทัดนี้ได้ไหม i = a!=b ? b-a : s[1].compareTo(s[0]);ฉันดูเหมือนจะไม่ได้รับ ... นอกจากนี้คุณอาจจะใช้ Math.signum และช่วยตัวเองประกาศ i;
Vartan

4

Perl, 31 ไบต์

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

30 ไบต์ + 1 -pไบต์สำหรับ ยอมรับอินพุตบน STDIN

คำอธิบาย

เมื่อตัวถูกดำเนินการcmpมีความยาวต่างกันเช่นchickenและeggพวกเขาจะถูกจัดตำแหน่งเช่นนี้:

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

เพื่อให้>chickenegg

การทำเช่นนี้เรา concatenate พวกเขาครั้งเดียวกับ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

Python 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 ตัวอักษรรวมทั้งตอนนี้มันเป็นสองบรรทัดแทนที่จะเป็นหนึ่งเพราะฉันต้องการทั้งความยาวของอินพุตและวนซ้ำมัน


น่าเสียดายที่นี่ไม่ใช่ทางออกที่ถูกต้อง กรณีการทดสอบต่อไปนี้: 1-2ซึ่งควรจะกลับผลตอบแทน1 -1แม้ว่าการทำงานที่ฉลาด
Sam Weaver

อ๊ะดูเหมือนว่าตัวถูกดำเนินการถูกสลับ มันแปลกมากฉันทดสอบกับกรณีทดสอบของคุณสองสามข้อและฉันคิดว่ามันใช้ได้ดี! ไม่ว่าฉันจะเปลี่ยนมันได้โดยไม่เปลี่ยนจำนวนตัวละคร ลองยิงดูสิ
Alex Van Liew

การแก้ไขของคุณได้แก้ไขกรณีนั้น แต่ตอนนี้มันล้มเหลว11-Aซึ่งควรกลับมา-1แทนที่จะกลับมา1ในตัวอย่างนี้
Sam Weaver

ฉันไม่ชอบกฎความยาวของคุณ ฉันซ่อมมันด้วยราคาประมาณ 35 ตัวอักษรและฉันไม่คิดว่าฉันจะทำให้ดีขึ้นได้
Alex Van Liew

1
ฉันจัดการเพื่อให้ได้คำตอบที่สั้นกว่าของคุณโดยการเข้ารหัสสตริงในรูปแบบฐานสิบหกแล้วแยกวิเคราะห์สตริงนั้นเป็น int ใน python 2 ดูเหมือนว่าจะเป็นการเริ่มต้นที่ยิ่งใหญ่สำหรับสิ่งนี้ ดังนั้นไม่จำเป็นต้องใช้ช่องว่างภายใน 0
Dunes

2

R, 54 ไบต์

สิ่งนี้ต้องการไลบรารี pracma -มันแยกสายเข้าใน จัดชิดขวาสตริง จัดอันดับพวกเขาและทำสิ่งที่แตกต่าง

ดังนั้นสำหรับ 11-7 เราจึงลงท้ายด้วยสตริง "11" และ "7" อันดับของสิ่งเหล่านี้คือ [2, 1] ความแตกต่างคือ -1 สำหรับ 3h ~ J * -3h ~ J * เราจะได้รับ "3h ~ J *" และ "3h ~ J *" อันดับของสิ่งเหล่านี้คือ [1.5, 1.5] ด้วยความต่างของ 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

ฉลาด. เป็นคนดีมาก :)
อเล็กซ์เอ.

2

CoffeeScript, 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$' (ยังไม่ทดลอง)
Jarmex

1
ความคิดที่ดีที่จะใช้cmpแต่มันไม่ทำงานเมื่อความยาวของสตริงแตกต่างกัน "A" cmp "9"คือ 1 ในขณะที่"11" cmp "Z"คือ -1 ถึงแม้ว่าทั้งสองอินพุตควรส่งคืนค่าเดียวกันสำหรับความท้าทายนี้
ThisSuitIsBlackNot

1

Python 3, 84 ไบต์

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

"-"แยกการป้อนข้อมูลสตริงโดย แปลงสตริง Unicode เป็นสตริงไบต์จากนั้นตีความสตริงไบต์เหล่านี้เป็นจำนวนเต็มขนาดใหญ่ ในที่สุดทำการเปรียบเทียบ - (un) โชคดีcmpไม่มีใน Python 3 อีกต่อไป

Python 2, 69 ไบต์

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

คุณสามารถโกนตัวละครโดยการลบช่องว่างระหว่างและprint cmp
Alex Van Liew

1

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

เพียงแค่เรียกใช้จาก commandline แม้ว่ามันจะดูดีขึ้นด้วยบรรทัดใหม่ แต่ค่าใช้จ่าย 1 ถ่าน

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

รุ่นที่ยาวกว่านี้จะจัดการความยาวที่ไม่ตรงกันได้อย่างถูกต้อง


/-/,$_=$`cmp$'จะง่ายขึ้นและคุณสามารถข้ามไป-aF-เล็กน้อย นอกจากนี้ฉันนับสิ่งนี้เป็น 20 (16 สำหรับ$_=$F[1]cmp$F[0]และ 4 สำหรับpaF-บันทึกไว้ในไฟล์และเรียกใช้เป็นperl -paF- file.pl)
primo

1
ขณะที่ผมตั้งข้อสังเกตเกี่ยวกับคำตอบของเอริค , ไม่ทำงานเมื่อสองสตริงที่มีความยาวแตกต่างกันเช่นเดียวกับcmp 11-Z
ThisSuitIsBlackNot

@ThisSuitIsBlackNot ไม่ได้รับการแก้ไข
hildred

ดี คุณสามารถกอล์ฟลงไปที่ 39 ด้วยและ/-/;$_=length$'<=>length$`||$' cmp$` -p( $`เก็บทุกอย่างก่อนการจับคู่ regex $'เก็บทุกอย่างไว้หลัง) การใช้mapจริงจะมีค่าใช้จ่ายมากกว่าไบต์เพียงแค่เรียกlengthสองครั้ง
ThisSuitIsBlackNot ไม่

0

F #, 53

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

นี่คือในรูปแบบฟังก์ชั่นที่ไม่ระบุชื่อ (แลมบ์ดา) ดังนั้นคุณต้องวางมันและให้พารามิเตอร์โดยตรงหลังจากนั้นก็คือ (หรือโดยใช้สัญกรณ์ท่อ) ตัวอย่าง (ใน 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 ไบต์

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 การเปลี่ยนจากพฤติกรรมที่ไม่ได้กำหนดเป็นคำจำกัดความเปลี่ยนไป ไม่มีอะไรที่ไม่ใช่ตัวละคร ยกเว้นว่ามันจะเป็นตัวละคร null ซึ่งมันจัดการ
George Reith


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.