7 l8rは9よりもですか?(7は9より遅いですか?)


10

これはかなり単純なコードゴルフの挑戦です。ASCII文字列が与えられたプログラムは、その文字列を2つの文字列に解析し、評価します。2番目の文字列が最初の文字列より「遅い」場合は1を返し、最初の文字列より「早い」場合は-1を返し、同じ場合は0を返します。 「後」と「前」の意味を明確にして、ASCII文字コードを見てみましょう。文字列の各文字を比較し、それぞれを数値の数字として扱う必要があります。後で大きい数を指し、小さい数の後に発生します。文字列は、2つの入力グループを区切るためにハイフン文字でフォーマットされます。

この例を見てみましょう:

7-9入力として返す必要があり1ます。

7ASCIIコード55に変換し、ASCIIコードに9変換します57

57数値の後に発生し559後でより7

もう一つの例:

LKzb-LKaj 入力として返されるように -1

このためのASCIIコードシーケンスは76-75-122-9876-75-97-106

これはコードゴルフチャレンジであり、バイトカウントはエントリのスコアリング方法です。

スペースとハイフンを除いて、95の印刷可能なASCII文字からのすべての入力が受け入れられます。また、文字列が同じ長さであるとは限りません。

幸運を!

編集:より明確にするために、各文字は数字の数字のように扱われます。この例LKzb-LKajjbzはより遅いa、より遅いであり、より有効な数字であるため、優先されます。提供される文字列は常に3文字以上であり、空の文字列はこの問題の範囲から除外されます。

編集:あなたの助けのために、ここにいくつかのテストケースがあります:

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

1
2つの文字列は同じ長さであることが保証されていますか?
es1024 2015

5
テストケース11-Z-> -1は、質問の現在の言い回しを考えると意味がありません。Z(90)は1(49)より大きく、最も重要な文字です。異なる長さの文字列を比較する方法を明確にしてください。
ジョージリース2015

2
そして、どうA-AAですか?

2
@SamWeaver左端が最上位の桁であることを知っているので、11>Z例でなぜなのか混乱しています1<Z。異なる長さの文字列を処理するには、未定義の動作が必要です。そうでない場合、例は間違っています。
ジョージリース2015

3
前述のとおり:各文字列は、base-127番号の数字として扱われます。このシステムでカウントする場合は、文字から始めて、印刷可能な文字のバリアまで~126でインクリメントし、次に次の桁を1つインクリメントして、最初の桁をに戻し!ます。最上位桁の各増加は、127で2番目に上位桁をインクリメントすると等価である
サム・ウィーバー

回答:


11

Pyth-11バイト

簡単です。signを使用して、._signを取得し、Ccharコードを取得します。

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

文字列を比較する非常に奇妙な方法。追加のテストケースに合格するようにクイックフィックスを行い、後でより多くのゴ​​ルフを探します。

signum提案のコメントでVartanに感謝


とにかくJavaの比較は1,0、-1を返しませんか?保証されていないことはわかっていますが、保証されていないケースはありますか?その場合return s[0].compareTo(s[1]);
Vartan 2015

これはいいですが、それはのテストケース通らない11-Zの復帰を-1、それが返されます1
サムウィーバー

ああ、これらのテストケースが追加される前は、これははっきりしていませんでした。修繕。
Geobits 2015

@Vartanいいえ、一致しない最初の位置での値の差(または、1つとすべての文字が一致する場合は長さの差)を返します。たとえば、を"A".compareTo("Z") 返します-25残念ながら。
ジオビット2015

この行を説明できますか?i = a!=b ? b-a : s[1].compareTo(s[0]);理解できないようです...また、Math.signumを使用して、iを宣言する手間を省くことができます。
Vartan 2015

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\0nullのバイトです)。ただし、次のように配置する必要があります。

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

そのようにchicken> egg

これを行うために、我々は一回、それらを連結chickenする前eggで1回eggの前にchicken

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

2つの文字列が同じ長さになったので、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))

cmp2つの異なる長さの文字列がある場合、これは正しく動作しません。そのため、その場合に対処するために、両方にnull文字(これはにord変換されます0)を埋め込む必要があります。残念ながら、これにより約35文字が追加されました。さらに、入力の長さと反復処理の両方が必要なため、1行ではなく2行になりました。


残念ながら、これは有効な解決策ではありません。次のテストケース:1-2、これはreturnを1返します-1。賢い仕事も。
サムウィーバー

おっと、オペランドが入れ替わっているようです。それは非常に奇妙です、私はあなたのテストケースのいくつかでそれをテストしました、そしてそれはうまくいくと思いました!とにかく、文字数を変えなくても変更できます。今すぐ試してみましょう。
Alex Van Liew、2015

あなたの編集はそのケースを修正しましたが、今は11-Aケースに失敗し、この例では戻るの-1ではなく、を返すはず1です。
Sam Weaver

長さのルールは好きではありません。約35文字で修正しましたが、これ以上上手くいくとは思えません。
Alex Van Liew、2015

1
文字列を16進形式にエンコードし、その文字列をintとして解析することで、あなたよりも短い回答を得ることができました。Python 2では、デフォルトでビッグエンディアンに設定されているようです。したがって、0パディングは不要です。
砂丘2015

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

賢い。いい仕事です:)
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)`

これが結果を含むjsfiddleです(コンソールを見てください)


2

PERL、46 36バイト

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

argvリストを文字列に変換し、ハイフンでスペースargなしの左側と右側に分割してから、cmp呼び出しを返します。


いくつかのスペースと;を取り除くことができると思います。
MickyT 2015

逃げることができるようになります。"@ARGV"=~/-/;print$`cmp$' (未検証)
Jarmex

1
を使用することをお勧めしますcmpが、文字列の長さが異なる場合は機能しません。"A" cmp "9"一方、1で"11" cmp "Z"ある-1、両方の入力がこの挑戦のために同じ値を返す必要がありますにもかかわらず。
ThisSuitIsBlackNot 2015

1

Python 3、84バイト

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

入力文字列をで分割します"-"。Unicode文字列をバイト文字列に変換し、これらのバイト文字列をビッグエンディアン整数として解釈します。最後に、比較を行います-(不幸cmpなことに)Python 3では利用できなくなりました。

Python 2、69バイト

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

printとの間のスペースを削除することで、キャラクターを剃ることができcmpます。
Alex Van Liew、2015

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

コマンドラインから実行するだけです。新しい行を追加すると見栄えがよくなりますが、コストは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)。
プリモ2015

1
Ericの回答で述べたcmpように、のように2つの文字列の長さが異なる場合は機能しません11-Z
ThisSuitIsBlackNot

@ThisSuitIsBlackNot、修正されました。
2015

いいね。あなたができるゴルフダウンへと39もの/-/;$_=length$'<=>length$`||$' cmp$`-p。($`正規表現が一致する前に$'すべてを保存し、後はすべてを保存します。)を使用すると、map実際にlength2回呼び出すよりも多くのバイトがかかります。
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

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'
ジョージリース2015

質問の意図は変更されませんでした。最初は十分に明確ではないことに気付いたので、これらのテストケースと説明のみを追加しました。空の文字列の値を定義したことはないので、それに応じて質問を更新します。これらのテストケースでは、質問の動作や目的は変更されませんでした。名前を付けた例は、そのように機能します。各文字は、基数が数字の個々の「数字」として扱われる必要があるため、印刷可能なすべてのASCII文字と同等です。この質問の仕組みは変更されておらず、単により明確になっただけです。
Sam Weaver

1
@SamWeaver未定義の動作から定義済みの動作に変更すると、変更されます。何もキャラクターではありません。これが処理するnull文字でない限り。
ジョージリース2015


0

05AB1E12 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.