文字列として指定された2つの数値を比較する


21

仕事で問題があります。2つの異なるデータベースから文字列として送られる2つの数値を比較する必要があります。数字には、先行ゼロや先行/末尾スペースが含まれる場合があります。そのため"0001 "、あるデータベースと" 1 "別のデータベースの両方を使用できます。

私は次のコードでC#の問題を解決しました:

Func<string, string, bool> f = (a,b) => int.Parse(a.Trim()) == int.Parse(b.Trim())

チャレンジ

これは本当に簡単な挑戦であり、初心者やあらゆる難解な言語に適しています。先行ゼロや先行/末尾スペースが含まれる可能性のある文字列として2つの数値が与えられた場合、2つの文字列が同じ数値を表すかどうかをチェックする最短のコードを記述します。

  • 入力は、2つの文字列または言語の同等の文字列(char配列でも構いません)である必要があり、常にゼロより大きい整数値を表します。
  • 出力は、真理値と偽値を表す2つの一貫した値である必要があります。

A          B          Result
----------------------------
"0001"     "1    "    true
"1450"     "1450 "    true
"0010001 " " 10001  " true
"0010000"  "  10  "   false
"101023"   "101024"   false

これはなので、各言語の最短コードが勝つかもしれません!



8
少なくとも今回はあなたの子供に触発されたものではありません...
ケアニアンコマーリンガーイング

2
自分の作品を@cairdcoinheringaahingすることは、私の2番目のインスピレーションの源です。これは非常に単純な挑戦であることは知っていますが、これらの簡単な挑戦も時々必要だと思う 次回はもっと難しいことを考えてみます。
チャーリー

ちなみに、私の仕事に触発された課題は、簡単すぎるか、難しすぎるかのいずれかです
チャーリー

@JonathanAllanいいえ、各入力文字列は1つの数値のみを表します。文字列の間にスペースはありません。
チャーリー

回答:


22

Javascript、11バイト

a=>b=>+a==b

Javascriptのキャスティングルールを少し乱用します。数値型に+a強制aします。

ShaggyMartin Enderのおかげで-6バイト

LiefdeWenによるクールなテイク:

a=>b=>~~a==~~b

2
PPCGへようこそ。あなたは、カリー化を使用して11バイト単位でのみ整数への入力のいずれかを変換することによってこれを行うことができます。tio.run/##y0osSyxOLsosKNHNy09J/...の注意を同様に関数の参照自体がない限り、あなたは変数を含める必要はありません、ということバイト数の割り当て。
シャギー

2
PPCGへようこそ!名前のない関数はあなたが必要としないので素晴らしいですc=、そして、あなたがa=>b=>...代わりに使うことができるようにカリー化も素晴らしいです(a,b)=>。最後に、私のJavaScriptは少し錆びていますが、何か!(a-b)がうまくいくと思いますか?
マーティンエンダー

1
ソリューションからバイトを絞り出すためのその他のトリックについては、ES6でのゴルフのヒント(および一般的なJSゴルフのヒント)を参照してください。
シャギー

1
クールなバージョンはクールですが、範囲が制限されています。「9123456789」と「533522197」を入力してみてください。これらは整数値の文字列表現であり、JavaScriptの整数の有効範囲内(32ビット以上)にあります
-edc65

1
テキストはコードと一致しなくなりました。減算はありません。a単項を使用して数値型に強制しています+
ピーター


18

Operation Flashpointスクリプト言語、33バイト

f={call format(["%1==%2"]+_this)}

で呼び出す:

hint format["%1\n%2\n%3\n%4\n%5",
    ["0001", "1    "] call f,
    ["1450", "1450 "] call f,
    ["0010001 ", " 10001  "] call f,
    ["0010000", "  10  "] call f,
    ["101023", "101024"] call f]

出力:

代替バージョン(41バイト):

f={{t=call _x;r=t==s;s=t}forEach _this;r}

さらに簡単なものよりも5バイト短い f={t=_this;call(t select 0)==call(t select 1)}

39バイト:

f={{t=call _x;r=t==s;s=t}count _this;r}

count(配列のサイズを返す)はの代わりに機能しforEachます。これは、条件に使用される「ラムダ」を与えて、その条件を満たす配列要素のみをカウントできるためです。この場合に使用される「条件」は有効な条件ではありませんが、エラーを引き起こさず、の戻り値はcount必要ないため、ここでは重要ではありません。


7
コードのスクリーンショットを撮るさまざまな状況が気に入っています
。–

11

タクシー、488バイト

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Equal's Corner.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:n 1 l 1 l 1 l.Switch to plan "b" if no one is waiting.'1' is waiting at Writer's Depot.[b]'0' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

オンラインでお試しください!

ゴルフをしていない:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Equal's Corner.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: north 1st left 1st left 1st left.
Switch to plan "b" if no one is waiting.
'1' is waiting at Writer's Depot.
[b]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

文字列のみが許可される入力または出力タイプであるため、タクシーは(比較的)この課題に適しています。The Babelfishery文字列を数値に変換し(逆も同様)、すべてのスペースと先行ゼロを除去します。-が最初の数字の直前にある場合、負の数も処理します。その後Equal's Corner、2つの値を互いに比較しWriter's Depot、文字列形式で出力を提供します。出力は1、真実と0偽りです。


1
良いですね!好奇心から、デバッグウィンドウにメッセージが表示されるのはなぜerror: The boss couldn't find your taxi in the garage. You're fired!ですか?
チャーリー

6
@Charlie Taxiでは、ルートが完了したらタクシーガレージに戻る必要があります。車を戻さないと、解雇されます。(また、時々停止して燃料を補給する必要があります。または、ガソリンが足りなくなることもあります。)STDERRへの出力を許可しないコードゴルフの質問では、一般的に解雇される心配はありません。あなたの仕事を失いたくない場合は、エラーを取り除くためにこれを追加することができますGo to Taxi Garage:n 1 r 1 l 1 r.
エンジニアトースト

この答えとそのコメントは完全にシュールです。私はこのコミュニティが大好きです。
右脚

@RightLeg私が書いた私のお気に入りのタクシープログラムは、2週間と多くのデバッグを要しました。あなたは本当に旅行がしたいですか?シェークスピアをご覧ください。
エンジニアトースト

10

C(gcc)、27バイト

f(s,t){s=atoi(s)==atoi(t);}

With -O0(デフォルト設定)。

オンラインでお試しください!

C、32バイト

f(s,t){return atoi(s)==atoi(t);}

オンラインでお試しください!


2
@Charlie Cでは、文字列はの配列でありchar、関数に配列を渡すとき、実際には配列の最初の要素へのポインタを渡すだけです。ここで、char配列へのポインターは、関数に渡されると暗黙的に整数に変換され、を呼び出すと整数がポインターに戻されますatoi
Steadybox

1
ポインタがintよりも広いプラットフォームで恐ろしく爆発する可能性があります...もちろん、ここでサイトの標準としては問題ありません:)
Felix Palmen

2
このようなコードは実装アーティファクト以外の値を返さないため、「C」だけでなく、「最適化を無効にしたx86 gcc」というラベルを付ける必要がs=foo;ありreturn foo;ます。
ピーター

2
実際に壊れたのではs=retval;なく、アーキテクチャが存在するかどうかを調べに行きましたreturn retval;。gccの内部ロジック(-O0のみ)が実際に最後の式を戻り値として処理しているように見えます。GNUCのstatement-expressionが機能するのと同じ方法でしょう。(ただし、必須ですs=)。ARM32では、で==結果を計算r3し、余分なmov r0, r3値を使用して戻り値にします!したがって、これはx86固有のハックではなく、gcc -O0gccがサポートに向かわないように見えるハックです。
ピーター

2
@ KenY-Nあなたはcコードゴルフのすべてのポイントを見逃しています。ポータブルなエクスペリエンスを提供するのではなく、最小限のコードを入力して必要な結果を得ることができる特定のハッキーエッジケースを見つけることです。


6

網膜、11バイト

.+
$*
D`
¶$

オンラインでお試しください!

入力は改行で区切られていますが、テストスイートでは便宜上コンマ区切りを使用しています。1平等と0不平等のために印刷します。

説明

.+
$*

各行を単項に変換します。これは、先行ゼロとスペースを無視します。

D`

重複排除:両方が同じ場合、2行目をクリアします。

¶$

文字列が改行で終わっていることを確認してください。




3

三角度、17バイト

..)..
.Ii).
@Ii=.

オンラインでお試しください!

三角形性は、かつては競争力があります!

使い方

三角法では、コードがドットの三角形分布を持つ必要があります。つまり、各行の長さは、行数に2を掛けて減らし、等しくする必要があり、各行には(両側に)プログラム内の位置と同じ数のドットが必要です(一番下の行は行0、上の行は行1などです)。これを念頭に置いて、コードの動作を分析しましょう。

..).. || Push a 0 onto the stack.
.Ii   || Get the 0th input and cast it to an integer.
   ). || Push another 0 onto the stack.
@I    || Increment the ToS => 1. Get the first input.
  i=. || Then cast it to an integer and compare their equality.

3

アリス、7バイト

X/n
o@i

オンラインでお試しください!

数字以外の区切り記号は機能します。1平等のために印刷し0ます。

説明

X   XOR, does nothing.
/   Switch to Ordinal mode.
i   Read all input as a string.
/   Switch to Cardinal mode.
X   XOR. Implicitly finds all integers in the string and pushes them separately
    onto the stack. The XOR gives 0 if the values are identical.
n   Logical NOT. Gives 1 for equal inputs and 9 otherwise.
/   Switch to Ordinal.
o   Print the 0 or 1 as a string.
/   Switch to Cardinal.
@   Terminate the program.





3

PowerShell、20バイト

param($a,$b)+$a-eq$b

JavaScriptの答えに似ていますが、PowerShellにはカレーがないため、長くなります。を使用+して最初の文字列を整数に-eqキャストします。その後、ualsは2番目の文字列を自動的に整数にキャストします。出力はTrue / Falseです。

オンラインでお試しください!


3

PowerShell、19バイト

$args-join'-eq'|iex

オンラインでお試しください!

-join引数配列($args比較演算子(の文字列表現を有する)が-eq)を用いて式を評価しますInvoke-Expressioniex)。


面白い。整数にキャストする必要なく、どのように取得するのか疑問に思いますが、+文字列の等価性チェックを行っているので削除すると壊れます。
AdmBorkBork

@AdmBorkBorkは、基本的にPowerShellコードを生成して実行するためです。また、先行ゼロと先行/末尾スペースはインタープリターにとって重要ではないため、「正常に動作します」。2つの数値がで00009 あり077 、結果のコードが00009 -eq077 である場合、完全に有効なコードです。実行時に文字列を直接処理するため、最初にキャストして、数値に対して操作が行われるようにする必要があります。
-briantist

そうです、それは理にかなっています。説明してくれてありがとう。
AdmBorkBork

3

Q(Kdb +)、13バイト

=/["J"$(x;y)]

説明

(x; y):2つの入力のリスト。

"J" $:各入力を文字列(10c)からlong(7j)型にキャストします。これにより、
空白と先行0を正しく解釈できます。

= /:リスト内の要素(後続の各ペア)の等価性をチェックします。
ペアは1つしかないため、単一のブーリアン0b / 1bを返します。


PPCGへようこそ!通常、オンラインの通訳者/コンパイラへのリンクは歓迎されますが、明白でない場合は説明もあります。
FantaC

ありがとう!説明が追加されました。qにはオンラインインタープリターがいるのではないかと疑っています。簡単に調べてみましたが、見つかりませんでした。
シドニー

私は、これはすなわち、中括弧を含むラムダのように記述されるべきであると言う{=/["J"$(x;y)]}ための15バイト 8バイトのためにあなたがこれを持っている可能性がありますが...:(~/)"J"$あなただけのREPLを使用し、文字列のリストとして入力を渡している場合.. 。あるいは{(~/)"J"$x}ための11の関数として。
ストリートスター

3

T-SQL、35バイト

私たちの標準では、データはフィールドとをt持つ既存のテーブルを介して入力されvarcharます。ab

    SELECT IIF(ABS(a)=ABS(b),1,0)FROM t

1一致する場合は一致し、一致0しない場合は返します。

いくつかのSQLの数学関数(ABSFLOORおよびを含むCEILING)は、文字列パラメーターを指定すると暗黙的に数値に変換します。これは明示的なCAST(a AS INT)or よりも短くCONVERT(INT,b)、入力値が常に正であることがわかっているため、この場合に機能します。

IIF MS SQL 2012以降に固有であるため、他の実装に関する保証はありません。


3

Excel VBA、27 16バイト

-9 @Nayrbと@TaylorScottに感謝

[C1]=[A1]-[B1]=0

でセルに値を入力する場所'string

どこxy入力文字列であり、zブール出力されます。

CInt(x)= CInt(y)の場合、z = 1

CIntを使用する


1
なぜいけないのか:z = xy = 0?
-Nayrb

残念ながら、この解決策は、それが入力を取らないとして無効であり、むしろ(事前定義された値を持つに依存しているコミュニティのルール違反とみなされていた)と、(変数にoutputing コミュニティのルール違反もある
テイラー・スコット

など恐らくVBEイミディエイトウィンドウ関数有効なソリューションとしては ?[Int(A1)=Int(B1)]それが範囲からの入力を受け取りA1そしてB1VBEイミディエイトウィンドウに出力
テイラースコット




2

Gema、21文字

*\n*=@cmpn{*;*;0;1;0}

Gemaにはブール値はありません。@get-switch{}/ @set-switch{}機能は、スイッチの状態を表すために0と1を使用し、また、0と1を使用します。

2つの文字列は別々の入力行で渡されます。

サンプル実行:

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010001\n10001  '
1

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010000\n  10  '
0



2

Attache、11バイト

Same@Map&:N

オンラインでお試しください!

これは、などの文字列の配列を取りますV["0001", "1 "]。簡単に言うと、引数Map&:NをマップNSame、配列に等しいメンバーのみが含まれていることをチェックする関数です。(面白い事実:この関数は3つ以上の文字列引数に対して機能します。)


2

SNOBOL4(CSNOBOL4)、42バイト

	OUTPUT =EQ(EVAL(INPUT),EVAL(INPUT)) 1
END

オンラインでお試しください!

真実の場合は1、偽の場合は何も出力しません。以来(空間)、SNOBOLに連結演算子であり、EVAL主要/末尾のスペースを持つ数をINGの数自体を得、そしてそれはまたきちんと任意の先行ゼロの世話をします。EQ条件付きでOUTPUT1に設定して、数値の等価性をテストしSuccessます。


2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC、〜29トークン化されたBASICバイト

Neilのおかげで新しいソリューションが提供されました(ヒントをありがとう)。

 1 INPUT A$
 2 INPUT B$
 3 PRINT VAL A$=VAL B$

このソリューションにはユーザー入力が必要なので、空白や先行ゼロを含む2つの文字列を入力するか、数値が等しくない2つの文字列を入力します。行3が入力された各文字列の値を比較すると、0falseと1trueになります。

古いソリューション:Sinclair ZX81 / Timex TS1000 / 1500 BASIC、〜46トークン化されたBASICバイト

 1 LET A$=" 001 "
 2 LET B$="1"
 3 PRINT (VAL A$=VAL B$)

実際のチェックは3行目で行われます。これは、トークン化されたBASICバイトが最大16バイトです。ダイレクトモードを使用して各テストケースペアを入力すると、リストから最大30バイトが節約されます。このバイトカウントにはが含まれないことに注意してくださいvar stack


1
INPUT A$and を使用してはいけませんINPUT B$か?また、私はあなたが必要だとは思わない()
ニール

はい、私もそれを使用することができます-私はちょうど概念実証を望んでいた
ショーンBebbers

2

APL(NARS2000)、7バイト

=⍥⍎

ええ、はい、NARS2000はUnicodeを使用しているため、ここでDyalogに対抗できないことを知っていますが、(実際には関数構成とは無関係ですが、NARS2000ではCompositionと呼ばれます)ビルトインとして使用し、ここで使用されるのを見たことがありません。Dyalogでは、として実装する必要があります{(⍵⍵⍺)⍺⍺⍵⍵ ⍵}。それは、左引数と右引数の両方で右オペランドの単項関数を呼び出し、次に結果に対して左オペランドの二項関数を呼び出します。

ここで、右側のオペランドはExecute、つまりeval)で、左側のオペランドは=Equal To、つまり引数が等しいかどうかを確認します)です。


構成と実行は空白としてレンダリングされることになっていますか?
ジョンドヴォルザーク

@JohnDvorakええ、いや?それらは空白ではなく、2番目の文字はU + 2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS、3番​​目はU + 234E APL FUNCTIONAL SYMBOL DOWN TACK JOTです。
エリックアウトゴルファー

@JohnDvorakこれを表示しているフォントには、それらのコードポイントのシンボルがない場合があります。
Οurous

@Οurous私もそうだと非常に疑っていますが、よく更新されたソフトウェアを使用している場合は、そのような文字を表示しても問題はないはずです。
エリックアウトゴルファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.