Apakah 7 l8r dari 9? (Apakah tujuh lebih dari sembilan?)


10

Ini adalah tantangan golf kode yang cukup sederhana. Program Anda, diberi string ASCII, adalah untuk mengurai string itu menjadi dua string, yang akan dievaluasi. Jika string kedua "kemudian" dari yang pertama, itu akan mengembalikan 1, jika "lebih awal" dari yang pertama, itu akan mengembalikan -1, dan jika mereka sama, itu akan mengembalikan 0. Ke mengklarifikasi apa yang dimaksud "nanti" dan "sebelumnya", mari kita lihat kode karakter ASCII. Anda perlu membandingkan setiap karakter string, memperlakukan masing-masing sebagai digit angka. Kemudian mengacu pada jumlah yang lebih besar, terjadi setelah jumlah yang lebih kecil. String akan diformat dengan karakter tanda hubung untuk memisahkan dua kelompok input.

Lihatlah contoh ini:

7-9sebagai input harus kembali 1.

7mengkonversi ke kode ASCII 55, dan 9mengkonversi ke kode ASCII 57.

Seperti yang 57terjadi secara numerik setelah 55, 9lebih dari 7.

Contoh lain:

LKzb-LKaj sebagai input harus kembali -1

Urutan kode ASCII untuk ini adalah 76-75-122-98dan76-75-97-106

Ini adalah tantangan kode golf, dan jumlah byte adalah bagaimana entri akan dinilai.

Setiap input dari 95 karakter ASCII yang dapat dicetak diterima, tidak termasuk spasi, dan tanda hubung untuk apa pun selain memisahkan input. Selain itu, string tidak dijamin memiliki panjang yang sama.

Semoga berhasil!

EDIT: Agar lebih jelas, setiap karakter harus diperlakukan seperti angka dalam angka. Dalam contoh LKzb-LKaj, meskipun jlebih lama dari b, zlebih lambat dari a, dan karena ini adalah digit yang lebih signifikan, ia harus diutamakan. String yang disediakan akan selalu minimal 3 karakter, menghilangkan string kosong dari ruang lingkup masalah ini.

EDIT: Berikut adalah beberapa kasus uji lagi, untuk bantuan Anda:

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

1
Apakah kedua string dijamin memiliki panjang yang sama?
es1024

5
Test case 11-Z-> -1tidak masuk akal mengingat kata-kata saat ini dari pertanyaan. Z(90) lebih besar dari 1(49) dan merupakan huruf paling signifikan. Harap jelaskan bagaimana string dengan panjang yang berbeda dibandingkan.
George Reith

2
Dan bagaimana A-AA?

2
@ SamWeaver Saya tahu paling kiri adalah digit paling signifikan maka kebingungan saya mengapa 11>Zdalam contoh Anda kapan 1<Z. Harus ada beberapa perilaku tidak terdefinisi untuk dilakukan dengan string dengan panjang yang berbeda atau contohnya salah.
George Reith

3
Seperti yang dijelaskan sebelumnya: setiap string harus diperlakukan sebagai angka dalam nomor basis-127. Jika Anda menghitung dalam sistem ini, Anda akan mulai dengan karakter, menambahkannya hingga batas karakter yang dapat dicetak, ~pada 126, kemudian akan menambah digit berikutnya dengan satu, mengembalikan digit awal ke !. Setiap peningkatan dalam digit paling signifikan sama dengan peningkatan digit kedua paling signifikan dengan 127.
Sam Weaver

Jawaban:


11

Pyth - 11 byte

Mudah, gunakan ._tanda untuk mendapatkan tanda dan Cuntuk mendapatkan kode char.

._-F_CMcz\-

Cobalah online di sini .

Suite uji .

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

Sangat bagus! Berperforma seperti yang diharapkan.
Sam Weaver

7

CJam, 12 byte

l'-/esfb~\-g

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

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.

Luar biasa! Ini melewati semua kasus uji.
Sam Weaver

6

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

Cara yang sangat aneh untuk membandingkan string. Membuat perbaikan cepat sehingga melewati test case tambahan, akan mencari golfiness lebih banyak nanti

Terima kasih kepada Vartan dalam komentar untuk signumsarannya


Tidakkah java membandingkan pengembalian 1,0, -1? Saya tahu itu tidak dijamin, tetapi apakah ada kasusnya? dalam hal inireturn s[0].compareTo(s[1]);
Vartan

Ini bagus, tetapi tidak lulus ujian 11-Zkembali -1, ini kembali 1.
Sam Weaver

Ah, ini tidak jelas bagi saya sebelum kasus uji ditambahkan. Tetap.
Geobits

@Vartan Tidak, ini mengembalikan selisih nilai pada posisi pertama yang tidak cocok (atau selisih panjang jika ada satu dan semua karakter cocok). Misalnya, "A".compareTo("Z") kembali-25 . Sayangnya.
Geobits

Bisakah Anda menjelaskan baris ini? i = a!=b ? b-a : s[1].compareTo(s[0]);Saya sepertinya tidak mengerti ... Juga, Anda mungkin bisa menggunakan Math.signum dan simpan sendiri dengan menyatakan saya;
Vartan

4

Perl, 31 byte

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

30 byte + 1 byte untuk -p. Menerima input pada STDIN.

Penjelasan

Ketika operan cmpmemiliki panjang yang berbeda, suka chickendan egg, mereka disejajarkan seperti ini:

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

sehingga egg> chicken( \0adalah byte nol). Tapi kami ingin mereka disejajarkan seperti ini:

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

jadi itu chicken> egg.

Untuk melakukan ini, kami menggabungkan mereka, sekali dengan chickensebelumnya eggdan sekali dengan eggsebelumnya chicken:

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

Sekarang setelah dua string kami memiliki panjang yang sama, kami menghapus kata utama menggunakan XOR untuk mendapatkan:

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

Dan sekarang kita dapat menggunakan cmpuntuk menemukan yang lebih dulu. (Di sana, saya mengatakannya!)


Sangat pintar- Bravo!
Sam Weaver

3

Python 2, 88 karakter

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

cmptidak melakukan hal yang benar ketika Anda memiliki dua string panjang yang berbeda, jadi saya harus mengisi keduanya dengan karakter nol (yang orddikonversi ke 0) untuk menangani kasus itu. Sayangnya, itu menambahkan sekitar 35 karakter, ditambah itu sekarang dua baris, bukan satu karena saya membutuhkan panjang input dan untuk beralih di atasnya.


Sayangnya, ini bukan solusi yang valid. Kasus uji berikut:, 1-2yang harus mengembalikan 1pengembalian -1. Tapi kerja pintar.
Sam Weaver

Ups, tampaknya operan ditukar. Itu sangat aneh, saya mengujinya dengan beberapa test case Anda dan saya pikir itu bekerja dengan baik! Tidak masalah, saya bisa mengubahnya tanpa mengubah jumlah karakter. Cobalah sekarang.
Alex Van Liew

Suntingan Anda benar-benar memperbaiki kasing itu, tetapi sekarang kasing itu gagal 11-A, yang seharusnya kembali -1, bukannya kembali 1dalam contoh ini.
Sam Weaver

Saya tidak suka aturan Anda lama. Saya memperbaikinya dengan biaya sekitar 35 karakter, dan saya tidak berpikir saya bisa membuatnya lebih baik.
Alex Van Liew

1
Saya berhasil mendapatkan jawaban yang lebih pendek dari milik Anda dengan menyandikan string ke dalam format hex kemudian mem-parsing string itu sebagai int. Dalam python 2, tampaknya default ke big-endianness untuk ini. Dengan demikian, 0 padding tidak lagi diperlukan.
Bukit pasir

2

R, 54 Bytes

Ini membutuhkan perpustakaan pracma. Ini membagi string input pada -. Benar membenarkan string. Beri peringkat mereka dan lakukan diff.

Jadi untuk 11-7 kita berakhir dengan string "11" dan "7". Peringkat ini adalah [2, 1]. Perbedaannya adalah -1. Untuk 3h ~ J * -3h ~ J * kita mendapatkan "3h ~ J *" dan "3h ~ J *". Peringkat ini adalah [1.5, 1.5] dengan perbedaan 0.

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

Contoh Uji

> 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

Pintar. Kerja bagus :)
Alex A.

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

Ini adalah jsfiddle dengan hasilnya (lihat di konsol)


2

PERL, 46 36 Bytes

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

Mengonversi daftar argv menjadi string, membelah oleh tanda hubung menjadi arg sisi kiri dan kanan, tidak ada spasi arg, lalu mengembalikan panggilan cmp.


Saya menduga Anda dapat menyingkirkan sejumlah ruang dan;
MickyT

Harus bisa pergi dengan: "@ARGV"=~/-/;print$`cmp$' (belum diuji)
Jarmex

1
Ide bagus untuk digunakan cmp, tetapi tidak berfungsi saat panjang string berbeda. "A" cmp "9"adalah 1 sedangkan "11" cmp "Z"-1, meskipun kedua input harus mengembalikan nilai yang sama untuk tantangan ini.
ThisSuitIsBlackNot

1

Python 3, 84 byte

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

Pisahkan input string dengan "-". Ubah string unicode menjadi string bytes, lalu tafsirkan string byte ini sebagai bilangan bulat big-endian. Akhirnya lakukan perbandingan - (un) untungnya cmptidak lagi tersedia di Python 3.

Python 2, 69 byte

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

Anda dapat memotong karakter dengan menghapus spasi di antara printdan cmp.
Alex Van Liew

1

Python 2, 79 byte

Solusi yang cukup sederhana, dan mudah dimengerti. Bandingkan panjang string, lalu bandingkan string secara leksigrafis.

Coba di sini

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

Jalankan saja dari commandline. meskipun akan terlihat lebih baik dengan baris baru tetapi harganya 1 char.

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

Versi yang lebih panjang ini menangani panjang yang tidak cocok dengan benar.


/-/,$_=$`cmp$'akan lebih mudah, dan Anda bisa melewatkan -aF-bit. Juga, saya menghitung ini 20 (16 untuk $_=$F[1]cmp$F[0], dan 4 untuk paF-, disimpan ke file dan dijalankan sebagai perl -paF- file.pl).
Primo

1
Seperti yang saya perhatikan pada jawaban Eric , cmptidak berfungsi ketika kedua string memiliki panjang yang berbeda, seperti dengan 11-Z.
ThisSuitIsBlackNot

@ ThisSuitIsBlackNot, sudah diperbaiki.
hildred

Bagus. Anda bisa bermain golf hingga 39 dengan /-/;$_=length$'<=>length$`||$' cmp$`dan -p. ( $`menyimpan segala sesuatu sebelum pertandingan regex, $'menyimpan semua setelah.) Menggunakan mapsebenarnya biaya lebih banyak byte daripada hanya menelepon lengthdua kali.
ThisSuitIsBlackNot

0

F #, 53

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

Ini dalam bentuk fungsi anonim (lambda), jadi Anda harus menempelkannya dan memberikan parameter langsung setelahnya adalah (atau, menggunakan notasi perpipaan). Misalnya (dalam 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])

Kerja bagus, tetapi ini tidak menyelesaikan kasus uji 2: 11-Zharus kembali -1tetapi kembali 1.
Sam Weaver

1
@ SamWeaver Memang, itu ditambahkan setelah jawaban dan istirahat juga jawaban lain. Bisakah Anda menjelaskan mengapa '11'>'Z'ketika '11'<'ZZ'tidak ada dalam pertanyaan tentang bagaimana membandingkan string dengan panjang yang berbeda atau nilai apa yang dimiliki string kosong.
George Reith

Maksud pertanyaan tidak pernah berubah, saya hanya menambahkan kasus-kasus pengujian dan klarifikasi karena saya menyadari saya tidak cukup jelas pada awalnya. Anda benar bahwa saya tidak pernah mendefinisikan nilai string kosong, dan saya akan memperbarui pertanyaan yang sesuai. Kasus-kasus uji tidak mengubah perilaku atau tujuan pertanyaan, hanya mengklarifikasi. Contoh-contoh yang Anda beri nama berfungsi seperti itu karena setiap karakter harus diperlakukan sebagai "digit" individu dalam angka yang basisnya setara dengan semua karakter ASCII yang dapat dicetak. Mekanik pertanyaan ini tidak pernah berubah, menjadi lebih jelas.
Sam Weaver

1
@ SamWeaver Mengubah dari perilaku yang tidak terdefinisi ke didefinisikan tidak mengubahnya. Tidak ada yang bukan karakter. Kecuali itu karakter nol, yang menangani ini.
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

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

'-¡          # 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]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.