7 l8r 9'dan büyük mü? (Yedi dokuzdan sonra mı?)


10

Bu oldukça basit bir kod golf meydan okumadır. ASCII dizesi verilen programınız, bu dizeyi değerlendireceği iki dizeye ayrıştırmaktır. İkinci dize birinciden "geç" ise, bir 1 döndürür, birinciden "daha erken" ise -1 döndürür ve eğer aynıysa 0 döndürür. "later" ve "early" kelimelerinin ne anlama geldiğini açıklığa kavuşturalım, ASCII karakter kodlarına bakalım. Dizenin her karakterini karşılaştırmalı ve her birine bir sayının rakamları olarak davranmalısınız. Daha sonra, daha küçük bir sayıdan sonra ortaya çıkan daha büyük bir sayı anlamına gelir. Dizeler, iki giriş grubunu ayırmak için kısa çizgi karakteri ile biçimlendirilir.

Bu örneğe bir göz atın:

7-9bir girdi olarak dönmelidir 1.

7ASCII koduna 55ve 9ASCII koduna dönüştürür 57.

Gibi 57sayısal sonra gerçekleşir 55, 9daha sonra daha 7.

Başka bir örnek:

LKzb-LKaj bir girdi dönmesi gerektiği gibi -1

Bunun için ASCII kod dizileri 76-75-122-98ve76-75-97-106

Bu bir kod golf meydan okumadır ve bayt sayısı girişlerin nasıl puanlanacağıdır.

Yazdırılabilir 95 ASCII karakterden herhangi bir girdi, boşluklar ve girişi ayırmaktan başka herhangi bir şey için tireler hariç kabul edilir. Ayrıca, dizelerin aynı uzunlukta olacağı garanti edilmez.

İyi şanslar!

DÜZENLEME: Daha açık olmak gerekirse, her karakter bir sayıdaki rakam gibi ele alınmalıdır. Örnekte LKzb-LKaj, gerçi jdaha geç b, zdaha sonra daha ave daha önemli bir basamak olduğu için, bu önceliklidir. Sağlanan bir dize her zaman en az 3 karakterden oluşur ve boş dizeleri bu sorunun kapsamından çıkarır.

EDIT: Yardımınız için bazı test örnekleri:

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

1
İki dizenin aynı uzunlukta olması garanti ediliyor mu?
es1024

5
Test durumu 11-Z-> -1sorunun şu andaki ifadesi dikkate alındığında hiçbir anlam ifade etmiyor. Z(90), 1(49) ' dan büyüktür ve en önemli harftir. Lütfen farklı uzunluktaki dizelerin nasıl karşılaştırıldığını netleştirin.
George Reith

2
Peki ya A-AA?

2
@SamWeaver En soldaki en önemli basamak olduğunu biliyorum, bu nedenle 11>Zörneklerinizde neden ne zaman olduğu konusundaki karışıklığım 1<Z. Farklı uzunluktaki dizelerle ilgili tanımlanmamış bir davranış olmalıdır veya örnek yanlıştır.
George Reith

3
Daha önce açıklandığı gibi: her bir dize, baz-127 sayısında bir rakam olarak ele alınmalıdır. Bu sistemde sayacak olsaydınız, bir karakterle başlayacak, onu yazdırılabilir karakterlerin bariyerine kadar ~artıracak, 126'da, ardından bir sonraki basamağı birer birer artıracak ve ilk basamağı döndürecektiniz !. En önemli basamaktaki her artış, ikinci en önemli basamaktaki rakamı 127 arttırır.
Sam Weaver

Yanıtlar:


11

Pyth - 11 bayt

Kolay, ._işareti almak ve Cchar kodları almak için işareti kullanır .

._-F_CMcz\-

Burada çevrimiçi deneyin .

Test takı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

Çok hoş! Beklendiği gibi çalışır.
Sam Weaver

7

CJam, 12 bayt

l'-/esfb~\-g

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

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.

Mükemmel! Bu tüm test senaryolarını geçer.
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));}  

Dizeleri karşılaştırmanın çok garip bir yolu. Ek test durumlarını geçmesi için hızlı bir düzeltme yapıldı, daha sonra daha fazla golf arar.

signumÖneri için yorumlarda Vartan'a teşekkürler


Java'nın karşılaştırması yine de 1,0, -1 döndürmüyor mu? Garantili olmadığını biliyorum, ama bunun bir örneği yok mu? bu durumdareturn s[0].compareTo(s[1]);
Vartan

Bu güzel, ama 11-Zgeri dönen test durumunu geçmez, geri -1döner 1.
Sam Weaver

Ah, bu test senaryoları eklenmeden önce bu benim için net değildi. Sabit.
Geobits

@Vartan Hayır, ilk eşleşmeyen konumdaki değer farkını (veya bir ve tüm karakterler eşleşiyorsa uzunluk farkını) döndürür. Örneğin, "A".compareTo("Z") döndürür-25 . Ne yazık ki.
Geobits

Bu çizgiyi açıklayabilir misiniz? i = a!=b ? b-a : s[1].compareTo(s[0]);Anlamadım ... Ayrıca, belki de Math.signum'u kullanabilir ve kendinizi i bildirerek kurtarabilirsiniz;
Vartan

4

Perl, 31 bayt

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

İçin 30 bayt + 1 bayt -p. STDIN girişini kabul eder.

açıklama

İşlenen için zaman cmpfarklı uzunluklara gibi olan chickenve egg, bunlar aşağıdaki şekilde hizalanır:

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

böylece egg> chicken( \0boş bir bayttır). Ama onların şu şekilde hizalanmasını istiyoruz:

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

böylece chicken> egg.

Bunu yapmak için, biz bir kez, onları bağlamak chickenönce eggve bir kez eggdaha önce chicken:

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

Artık iki dizemiz aynı uzunlukta olduğundan, elde etmek için XOR kullanarak baştaki kelimeyi kaldırıyoruz:

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

Ve şimdicmp hangisinin önce geldiğini bulmak için kullanabiliriz . (Orada söyledim!)


Çok zekice 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))

cmpiki farklı uzunluk dizeleri olduğunda doğru olanı yapmaz, bu yüzden her ikisi de bu durumda işlemek için null karakteri ( orddönüştürür 0) ile doldurmak zorunda. Ne yazık ki, bu yaklaşık 35 karakter ekledi, hem şimdi hem de yerine iki satır var çünkü hem girişin uzunluğuna hem de yinelemeye ihtiyacım var.


Ne yazık ki, bu geçerli bir çözüm değil. Aşağıdaki test durumu: 1-2, dönmelidir 1döner -1. Zeki bir iş olsa.
Sam Weaver

Hata! İşlenenlerin yer değiştirdiği anlaşılıyor. Bu çok garip, birkaç test vakası ile test ettim ve işe yaradığını düşündüm! Olursa olsun, karakter sayısını değiştirmeden değiştirebilirim. Şimdi bir şans ver.
Alex Van Liew

Düzenlemeniz bu durumu düzeltti, ancak şimdi bu örnekte 11-Adönmek -1yerine geri dönmesi gereken vakayı başarısızlığa uğrattı 1.
Sam Weaver

Kurallarınızı uzunluktan hoşlanmıyorum. Yaklaşık 35 karakterle sabitledim ve daha iyi yapabileceğimi sanmıyorum.
Alex Van Liew

1
Dizeyi onaltılık biçime kodlayıp daha sonra int olarak ayrıştırarak sizinkinden daha kısa bir yanıt almayı başardım. Python 2'de, bunun için büyük endianiteye varsayılan olarak benziyor. Bu nedenle, 0 dolgu artık gerekli değildir.
Dunes

2

R, 54 Bayt

Bu pracma kütüphanesini gerektirir. Girdi dizesini -. Sağ dizeleri haklı çıkarır. Onları sıralar ve bir fark yapar.

Böylece 11-7 için "11" ve "7" dizeleriyle karşılaşıyoruz. Bunların sırası [2, 1]. Fark -1'dir. 3h ~ J * -3h ~ J * için "3h ~ J *" ve "3h ~ J *" elde edilir. Bunların sırası, 0 farkıyla [1.5, 1.5] 'dir.

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

Test örnekleri

> 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

Zeki. İyi iş :)
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)`

İşte sonuçları olan bir jsfiddle (konsola bakın)


2

PERL, 46 36 Bayt

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

Argv listesini bir dizeye dönüştürür, kısa çizgi ile sol ve sağ taraflı boşluk argümanına böler, sonra bir cmp çağrısı döndürür.


Birkaç boşluktan kurtulabileceğinizden şüpheleniyorum ve;
MickyT

"@ARGV"=~/-/;print$`cmp$'
İle

1
Kullanmak için iyi bir fikir cmp, ancak dize uzunlukları farklı olduğunda işe yaramaz. Her iki girişin de bu zorluk için aynı değeri döndürmesi gerekse de "A" cmp "9"1 "11" cmp "Z", -1 ise 1'dir.
ThisSuitIsBlackNot

1

Python 3, 84 bayt

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

Dize girişini bölün "-". Unicode dizelerini bayt dizelerine dönüştürün, ardından bu bayt dizelerini big-endian tamsayıları olarak yorumlayın. Son olarak, karşılaştırmayı yapın - (un) neyse ki cmpartık Python 3'te mevcut değil.

Python 2, 69 bayt

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

printVe arasındaki boşluğu kaldırarak bir karakteri tıraş edebilirsiniz cmp.
Alex Van Liew

1

Python 2, 79 bayt

Oldukça basit bir çözüm ve anlaşılması kolaydır. Dize uzunluklarını karşılaştırır, sonra dizeleri sözcüksel olarak karşılaştırır.

Burada deneyin

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

Sadece komut satırından çalıştırın. yeni bir çizgi ile daha iyi görünmesine rağmen, ama bu 1 char maliyeti.

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

Bu daha uzun versiyon, eşleşmeyen uzunlukları doğru şekilde işler.


/-/,$_=$`cmp$'daha kolay olurdu ve -aF-biraz atlayabilirsiniz . Ayrıca, bu bir 20 (16 için $_=$F[1]cmp$F[0]ve 4 için paF-bir dosyaya kaydedilmiş ve olarak çalıştırın perl -paF- file.pl) sayıyorum .
primo

1
Ben belirtildiği gibi Eric'in cevap , cmpiki dizeleri olduğu gibi, farklı uzunlukta olduklarından çalışmaz 11-Z.
ThisSuitIsBlackNot

@ThisSuitIsBlackNot, düzeltildi.
Hildred

Güzel. Şunları yapabilirsiniz golf aşağı için birlikte 39 olduğu /-/;$_=length$'<=>length$`||$' cmp$`ve -p. ( $`normal ifade eşleşmesinden önce her şeyi depolar, $'sonraki her şeyi depolar.) Kullanmak map, yalnızca lengthiki kez aramaktan daha fazla bayttır .
ThisSuitIsBlackNot

0

F #, 53

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

Bu formda anonim bir işlevdir (lambda), bu yüzden onu yapıştırmanız ve parametreyi hemen sonra (veya boru notasyonunu kullanarak) sağlamanız gerekir. Örneğin (FSI'da):

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

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

İyi iş, ama bu test örneği 2'yi gerçekleştirmiyor: 11-Zgeri dönmeli, -1ancak geri dönecek 1.
Sam Weaver

1
@SamWeaver Gerçekten, bu cevaptan sonra eklendi ve diğer cevapları da kırdı. Neden açıklayabilir '11'>'Z'ne zaman '11'<'ZZ'farklı uzunlukta dize veya ilgili düşüncelerimize boş bir dize vardır karşılaştırmak konusunda söz konusu hiçbir şey yoktur.
George Reith

Sorunun amacı hiç değişmedi, sadece bu test senaryolarını ve açıklamayı ekledim çünkü başlangıçta yeterince net olmadığımı fark ettim. Asla boş bir dizenin değerini tanımlamam hakkın var ve soruyu buna göre güncelleyeceğim. Bu test senaryoları sorunun davranışını veya amacını değiştirmedi, sadece açıklığa kavuşturdu. Fonksiyonu şöyle adlandırdığınız örnekler, çünkü her karakter, tabanı yazdırılabilir tüm ASCII karakterlerine eşdeğer bir sayıdaki ayrı bir "basamak" olarak ele alınmalıdır. Sorunun bu tamircisi hiç değişmedi, daha açık hale geldi.
Sam Weaver

1
@SamWeaver Tanımlanmamış davranıştan tanımlıya geçiş, onu değiştirir. Hiçbir şey bir karakter değildir. Sürece bu boş karakter, sürece.
George Reith

0

Ruby, 59 bayt

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

0

05AB1E , 12 11 9 bayt

'-¡₄ö¥0.S

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

'-¡          # 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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.