文字列が等しいかどうかを判別


29

あなたの仕事は簡単です。1つの文字列が等価演算子(などを使用せずに、他の(ないアドレス、値)に等しいかどうかを判断し=====または.equal())または不等号(!=!==)他の言語についても同様のもの。これはどこでも意味します!これらの演算子はコード内のどこでも使用できません。ただし、を!exp直接比較していないなどのトグルを使用できますexp != with something else

また、strcmpstrcasecmpなどの関数は使用できません。

比較演算子については(>=<=><)、彼らもされている禁止します。いくつかの答えにはこれが含まれていることに気づきますが、等式演算子を境界にしない答えをもっと見たいです。


PHPを使用した例を示します。

<?php

$a = 'string';
$b = 'string';

$tmp = array_unique(array($a, $b));

return -count($tmp) + 2;

単にtrueまたはfalse(または言語で0または1などのtrueまたはfalseに評価されるもの)を返して、文字列が一致するかどうかを示します。上記の例に見られるように、文字列はハードコーディングする必要があります。ゴルフでは文字列をカウントしないでください。そのため、変数を事前に宣言する場合は、宣言をカウントしないでください。


1
結果を出力する必要がありますか、それとも単にブール値を返す関数を作成する必要がありますか?完全なプログラムの作成が必要な場合、JavaやC#のような機能する実行可能ファイルを作成するための(比較的)重要な定型文を使用した言語で回答を作成または分割することができます(獣の性質ですが、この課題はほとんどありません解釈/選択に多くを残して、具体的なガイドラインの)。そして、どのように文字列を取得するのですか?ハードコーディング、STDINからの読み取り、コマンドライン引数として渡しますか?
トニーエリス

これは[code-golf]または[popularity-contest]ですか?両方にすることはできません。
ガレス

申し訳ありませんが、両方のコメントを反映するように質問を修正しました。
デビッドチェン

だから不平等は許されますか?
user80551

文字列を複数回(各)ハードコーディングする場合、長さを数える必要がありますか?
user80551 14年

回答:


34

Python 49 45 18 22 15 14

(文字列変数が考慮される場合は+ 3)

print{a:0,b:1}[a]

文字列は、引用符ab囲まれた2つのオカレンスと1 つのオカレンスでハードコーディングする必要があります。

aそしてb文字列に事前に初期化する必要があります。


Pythonシェル、9

(文字列変数が考慮される場合は+ 3)

{a:0,b:1}[a]

シェルでの出力

>>> a = 'string'
>>> b = 'string'
>>> {a:0,b:1}[a]
1
>>> a = 'string'
>>> b = 'stringgg'
>>> {a:0,b:1}[a]
0
>>> {'string':0,'string':1}['string']
1
>>> {'stringggg':0,'string':1}['stringggg']
0
>>> 

説明

1番目と2番目の文字列のキーでdict(hash table)を作成します。2番目の文字列が同じ場合、firstの値はsecondの値に置き換えられます。最後に、最初のキーの値を出力します。

編集:OPは、False / Trueの代わりに0/1を許可し、事前に初期化された変数を使用しました。


@manatwork Golfscriptと以下のperlは0/1を使用していますが、使用できませんか?
user80551 14年

完了@manatwork
user80551

2番目の解決策として、13ではなく16をカウントしています。
アビジット2014年

@Abhijit ab含まれるようにされていない、文字列は、私は+ 2を追加した理由だと、ハードコーディングされたがなければならない* LEN(STR1)+ LEN(STR2)+ 6( ')
user80551

賢さのために+1ですが、これはもはや最短ではありません;)
avalancha

20

Python(17 11):

b in a in b

(bがaに含まれているか、aがbに含まれているかを確認します(コードから明らかでない場合)。)

代替Python:(8 7)

Tom VerelstのGoソリューションから派生:

b in[a]

ボーナス:これはどのタイプでも機能します。

編集:

ちょっと待って、文字列を直接プログラムすることもでき、引用符を数える必要がないことを読んでください...(または少なくとも、golfscriptが行うこと)だから... golfscriptと同等のPython?ああ!

代替の代替Python(5 4):

(Claudiuに感謝)

"string"in["string"]

元の:

"string" in["string"]

代替代替代替Bendy-ruly Python(2):

"string"is"string"

比較キーワードについては何も言われていません(これは深刻な投稿ではなく、私に起こったことだけです...)


2
使用できますb in a in b。そして...必要はありません
ジョージ

2
これは、willemの回答の複製です。
マナトワーク14年

inとの間の空白を削除することで、7文字まで減らすことができます[a]。すなわち、動作するb in[a]はずです。
user3002473 14年

ああ、知らなかった。おかげで:)
ɐɔıʇǝɥʇuʎs

印象的!それも知らなかった
ウィレム14年

14

JavaScript、11 10

文字列はaとbに保存する必要があります。

!(a>b|a<b)

編集:指摘してくれたダニーに感謝、|代わりに十分です||


5
いいえ、大なり演算子と小なり演算子を使用しています。それらはコンテストで禁止されていませんでした。
アダムSzaboの

2
+1。これは、他の多くの言語でも同様に機能します。
原型のポール

3
間違っているかもしれませんが、削除できません|か?
ダニー14年

3
間違いなくルールの監視-比較関数は、等号演算子および不等号演算子と同様に禁止されていますが、比較演算子は言及されていません。
user2357112は

2
@philcolbournはい、ルールは昨日変更されましたが、答えは2日前です。
バクリウ14年


8

Python-11(文字列なし)

>>> a = 'ss'
>>> b = 's'
>>> a in b in a
False

同じ精神で:a<=b<=aこれはわずか7文字です。比較<=が「不平等」とみなされるかどうかはわかりませんが。質問から、同等性チェックではない比較は問題ないように見えます<=
バクリウ14年

ええ、それは@Bakuriuのすてきなものであり、規則に違反しているかどうかは完全には明らかではありません。また、「in」には、equalステートメントが含まれています。
ウィレム14年

6

GolfScript(5文字)

'string1''string1'].&,(

PHPリファレンス実装のかなり単純なポート。葉0スタック上(=偽)の文字列が同じ、またはある場合1(=真)彼らだと異なる場合。


私にとって12うまくいきません:文字列が同じであり、異なる場合。'string1''string1'].&,1&作品
guy777 14年

@ guy777、これはスタックが開始時に空であると仮定します。問題は、プログラムの断片についてはあいまいです。おそらく、プログラム全体としてテストし、stdinのスタック上の空の文字列から始めているのでしょう。
ピーターテイラー

5

Javascript(45バイト):

Javascriptの別のソリューションを次に示します。

var a='string',b='string',c=!a.replace(b,'');

スペースは重要です。

cする必要がありますtrue


のみ!a.replace(b,'') カウントされます。したがって、文字数は16でなければなりません。実際、文字列を直接指定できるため、一部の人は14数えています。
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

5

C ++、63 58 56

const char* a = "string";
const char* b = "string";
int main(){while(*a**b*!(*a^*b))++a,++b;return!(*a^*b);}

2
auto代わりに逃げてもらえますconst char*か?
アルド14年

そうだと思いますが、ルールでは文字列変数は文字数にカウントされないと言われているので、気にしませんでした。
mattnewport 14年

whileテストに増分を折り込み、本体を空のままにしておくことはできますか?また、c ++ではなくcを使用する場合は、最初にintを削除してください。
オリオン

AbhijitのCの答えで指摘した終わりを越えて文字列にアクセスするという同じバグにぶつかることなく、インクリメントをwhileテストに折り畳んで文字数を減らす方法はありません。両方のテストに合格した場合にのみ、aとbを増分します(aとbのいずれもヌルターミネーターを指しておらず、aはbと等しい)。おそらくこれを改善する方法はありますが、私はそれを見つけることができませんでした!
マットニューポート14年

3

coreutils:uniq -d

パイプの標準入力として2つの文字列を入力するだけで、uniq -d | grep -q .何も出力されませんが、成功またはエラーの戻り値が返されます。ブール値を出力する場合は、単にuniq -d | grep -c .

何人のキャラクター?数えさせてください。uniq -d|grep -q .余分なスペースは17文字ありますが、ジョブ全体がuniqによって実行されるため、このソリューションは... uniq自分の言語での0文字のソリューションです!

実際にuniq -dは、2つの文字列が同じ場合は1行を出力し、異なる場合は何も出力しません。


3

文字列はaとbに保存する必要があります。どちらかが動作している場合は動作しませんnull

C#、53

string.IsNullOrEmpty(a.Replace(b,"")+b.Replace(a,""))

C#、28

a.Contains(b)&&b.Contains(a)

3

PHP-49文字

!(strlen($a)^strlen($b)|strlen(trim($a^$b,"\0")))

このようなことはできませんでした:!strlen(str_replace($a,'',$b));2つの文字列が等しい場合、1を返す必要がありますか?
ダミールカシポビッチ

@ D.Kasipovic興味深いですが、私はそれが失敗する$a == 'foo'と思う$b = 'foofoo':)
ジャック14年

確かに、これはどう!strlen(preg_replace("/{$a}/", '', $b, 1));ですか、置換は1 文字に制限され、45文字です。
ダミールカシポビッチ14年

代わりにアンカーを使用することもできますが、さらに重要なことにはpreg_quote()も必要になります:)
ジャック14年

3

APL(8 9)

更新:古いものは、長さが異なる文字列では機能しません。

{∧/∊⌿↑⍺⍵}
  • ↑⍺⍵1行目と2行目で行列を作成し、空白でスペースを埋めます。
  • ∊⌿:各列について、上の行に下の行が含まれているかどうかを確認します(以前のバージョンと同様)。
  • ∧/andすべての値の論理を取ります。

古いもの:

{∧/⍺∊¨⍵}
  • ⍺∊¨⍵およびの要素の組み合わせごとに、要素from に要素from が含まれているかどうかを確認します。文字列ではこれらはすべて単一の文字であり、文字列にはそれ自体が含まれるため、基本的には各文字のペアを比較します。
  • ∧/:論理値とすべての値を取ります(すべての文字が一致する場合、文字列は等しい)

3

Python-12

not({a}-{b})

このソリューションではセットを使用します。等しいセットを減算すると、空のセットになり、ブール値がFalseになります。これを否定すると、aとbが等しい文字列であるTrue値になります。

>>> a="string1"
>>> b="string2"
>>> not({a}-{b})
False

>>> a="string"
>>> b="string"
>>> not({a}-{b})
True

編集:不要な空白を指摘してくれたPeter Taylorに感謝します。


これはどのような出力を提供しa="s", b="ss"ますか?
ピーターテイラー

@PeterTaylor:以来"s"!="ss"、出力されますFalse。大文字と小文字の区別も保持されます。でも動作しa="", b="s"ます。コードは文字列をセットに変換しませんが、文字列を含むセットを作成します。
静脈瘤14年

ああ、{}とは違いset()ます。空白を削除することで1文字を節約できます。
ピーターテイラー

@PeterTaylor:不要な空白を指摘してくれてありがとう。 {a}はと同等set([a])です。
静脈瘤

どうnot {a}-{b}
ウィンストンユワート14年

3

C — 62

e(char*p,char*q){for(;*p&*q&&!(*p^*q);q++,p++);return!(*p^*q);}

テスト済み。として呼び出すe(str1, str2)

考えてみると、を数えないとchar*p,char*q、それは公平だと思われますが、49バイトです:)


サイトへようこそ!コードゴルフの課題については、できるだけ多くのバイトをコードから削除し、バイトカウントを回答ヘッダーに投稿することをお勧めします。良いアイデアについては、Cスレッドでのゴルフヒントを参照してください。
ジョナサンヴァンマトレ

本当に必要npありませんnq。あるストリングの終わりに到達すると、別のストリングの値が異なるため、1つのループが実行されます。
ピーターテイラー

ありがとう。把握した。短縮版(上記)を作成していました。戻って、さらに短縮できるかどうかを確認します。
エメット

*p&*q早すぎる(例えばループを停止することがあります'0'&'A'==0
ugoren

@ugoren:*p=='0'&の場合、文字列が等しくないことがわかっているため、ループを早期に停止*q=='A'する必要があります。
エメット14年

2

ハスケル-9

elem a[b]

これは、ここの多くのエントリと同様に、単なる表現であることに注意してください。これはHaskellプログラムではありません。


2

Javaの- 162の 147文字

考え方は、各バイトの違いを比較することです。同じバイトには差0がありjava.lang.ArrayIndexOutOfBoundsExceptionます。バイトが異なる場合(負のインデックスにアクセスしようとする)、または文字列の長さが異なる場合、プログラムはスローします。例外をキャッチし、0(文字列が等しくない)を返すか、そうでなければ1(文字列が等しい)を返します。

圧縮された:

String a = "12345";
String b = "12345";
byte[]x=a.getBytes(),y=b.getBytes();int z,i=a.length()-b.length();try{for(byte d:x){z=d-y[i];z=x[-z*z];i++;}}catch(Exception e){return 0;}return 1;

通常:

String a = "12345";
String b = "12345";
byte[] byteArrA = a.getBytes();
byte[] byteArrB = b.getBytes();

int byteDifference = 0;
int i = a.length() - b.length();

try {
    for (byte aByte : byteArrA) {
        byteDifference = aByte - byteArrB[i];
        byteDifference = byteArrA[-byteDifference*byteDifference];
        i++;
    }
} catch (Exception e){
    return 0;
}

return 1;

ループには比較演算子が存在します。
–ζ

@hexafractionに感謝します。それらを含めないように回答を更新しました。
ホッパーハンター

2

PHP

    $string = 'string';
    isset( ${'string'} );

このスクリプトにはユーティリティはないかもしれませんが、少なくともこれは文字列を比較する方法を提供します。

PHP

もう一つ:

    $string = 'something';
    $text   = 'something';
    return count( array( $string => 1 , $text => 1 ) ) % 2;

1
とてもすてきです そして、このようにそれを行うと、それが可能(スペースとUnicodeとの)任意の文字列を使用することができます。
デビッドチェン14年

2

プロローグ7

e(A,A).

これは、Prologのパターンマッチング機能を使用して、述語への2つの引数を統合しますこれは、非バインド変数がない場合に、等価性を効果的にテストします

サンプル使用法:

?- e("abcd", "Abcd").
false.

?- e("abcd", "abcd").
true.

技術的に言えば、このソリューションの動作は、用語の等価性をチェックするの=/2ではなく、統一演算子の動作です==/2。違いは、バインドされていない変数が含まれる場合を示しています。このソリューションでは、バインドされていない変数が指定されたtrue場合、統合が成功すると述語が返されます。比較で==/2は、用語の順序を統一せずに比較します。


2

PHP、21

これは、変数の間接化を使用してジョブを実行しています。

$$a=$b;!!$$b;

または、boolにする必要がない場合

$$a=$b;$$b;

編集:私はあなたが2つの空の文字列を比較しようとするケースを処理するのを忘れていたので、コードは今

$$a=$b;!($a.$b)||$$b;

これは21文字です。


有効な識別子ではない文字列を指定すると、エラーが発生することが予想されていましたが、驚いたことにそうではありません。
ピーターテイラー

2つの問題:1.「0」と「」を比較するとtrueを返します。2. $ bがtrueに変換される値を持つ既存の変数の名前(現在のシンボルテーブル内)である場合にtrueを返します(例:グローバルスコープの「GLOBALS」または「_SERVER」、またはスコープの「b」)。 $ bが$ aと等しくない場合でも。
プリーズスタンド

2

CPython:6

a is b

>>> a = 'string'
>>> b = 'string'
>>> c = 'STRING'
>>> a is b
True
>>> a is c
False

の使用isは明らかにかなり疑わしいですが、タスクは参照の平等ではなく値の平等を決定することを明確に呼び、isオブジェクトの同一性を比較するだけなので、禁止されている演算子のリストに該当しないかもしれません。

もちろん、これが有効かどうかについても疑問があります。私のすべてのシステムで動作しますが、実装固有のものであり、対話型インタープリターで文字列が手動で定義されていない場合、おそらく常に動作するとは限りません。


2

Mathematica / Wolfram言語、15バイト

2 - Length[{a} ∪ {b}]

自明ですが、各文字列をセットとして設定し、2つのセットの結合の長さをチェックします。文字列が同じ場合は1を返し、そうでない場合は0を返します。「異なる」に対して「2」、「同じ」に対して「1」を返すことが許可されている場合、2バイトを減算します。


2

C 342ゴルフ

#include <stdio.h>
#define N 100
#define P(x) printf("%s\n",x)
#define G(x) gets(x)
void e(int x){x?P("y"):P("n");}
int main(){
char s[N],t[N];char *p,*q;int r=0; int n=0,m=0;int i=1;p=s,q=t;
if((p=G(s))&&(q=G(t))){while (*p){n+=i*(int)*p;m+=i*(int)*q;i++;p++;q++;if(!(*q)){break;}}
if(!*p&!*q){if(!(m-n)){r=1;}}e(r);}
return 0;
}

注:Visual Studioは、gets_sなどの安全なメソッドを使用しないと文句を言います。mingwを使用したCodeBlocksは警告なしでコンパイルされます。

C 655ゴルフされていない

コードは、各文字列の重み付き合計文字を作成します。差がゼロの場合、2つの空の文字列を含むそれらは等しくなります。

    #include <stdio.h>
#define N 100
#define P(x) printf(x)
#define G(x) gets_s(x)

void e(int x){ x ? P("equal\n") : P("not equal\n"); }
int main()
{
    char s[N], t[N];//words
    char *p = 0, *q = 0;
    int r = 0; //result 0=false
    int n=0, m=0; //weighted sums
    int i = 1; //char pos start at 1
    if ((p=gets_s(s)) &&
        (q=gets_s(t)))
    {
        while (*p)
        {
            n += i*(int)*p;
            m += i*(int)*q;
            i++;
            p++;
            q++;
            if (!(*q)){
                break;
            }
        }

        if (!*p && !*q){ //both same length strings
            if (!(m - n)){ r = 1; } //weighted sums are equal           
        }//else r=0, false=>not equal

        e(r);
    }
    else{
        P("error\n");
    }
    getchar();
}

いい仕事ですが、おそらくゴルフする必要があります。
Hosch250 14年

提出物を編集できません。「アーキテクチャx86_64の未定義シンボル: "_gets_s"から参照されます:_main in golf-310cf2.o ld:symbol(s)not found for architecture x86_64 "
スティーブンメルビン14年

2

Python

それは長く、美しくはありませんが、これは私の最初のエントリーです!

def is_equal(a,b):
    i=0
    a,b=list(a),list(b)
    if len(a)>len(b):
        c=a
        lst=b
    else:
        c=b
        lst=a
    try:
        while i<len(c):
            for j in c:
                if j not in lst[i]:
                    return False
                i+=1
    except IndexError:
        return False
    return True

2

PHP、68バイト

私はあなたが使用することを禁止していると仮定任意の比較演算子を。だから、<または>含まれています。

考え方は、ビット単位のXORを使用することです。異なる言語では、この演算子の構文は異なります-PHPの例を示します。で利用可能です^。残念ながら、文字列での動作は可能な限り良くないため、事前に文字列の長さを確認する必要があります。これは、PHPではxorが長い文字列を短い文字列の長さまで削除するためです。

次は、文字列を適切にxor操作することです。これは、PHPでのさらなる操作に使用できる結果を生成しないためです。それunpack()が使用された理由です。したがって、コードは次のようになります。

return !(strlen($a)^strlen($b)) & !array_filter(unpack('c*', $a^$b))

</を付け>たオプションよりも長いですが、使用しません。また、重要なことは、PHP型のジャグリングについてです(したがって、空の配列はにキャストされますfalse)。(それとも配列が非ゼロのメンバーが含まれているかどうかを確認するための簡単な方法があります編集:私はこれを入力してきた一方で、との良好なキャッチがありますtrim()、我々は配列操作を取り除くことができますので、別の答えで)

しかし、a ^ b文字通り結果を得ることができる言語があると信じています。それがいた場合0(すべての結果のバイトから治療) -その後、私たちの文字列が同じです。それは非常に簡単で、より一層簡単です<>もの。


1

grep 14文字

もちろん、grepコードのみを数えます。2つの文字列は、入力内の2つの連続した行にあります(パイプまたはファイル、さらには対話型セッション)。

$ echo -e 'string\nstring' | grep -cPzo "(?s)^(\N*).\1$"
1
$ echo -e 'string\nstring1' | grep -cPzo "(?s)^(\N*).\1$"
0
$ echo -e 'string1\nstring' | grep -cPzo "(?s)^(\N*).\1$"
0


1

非常にクレイジーな方法

ただの楽しみのためですが、考えてみると失敗する多くの方法が失敗します。さらに、文字列がシェルによって実行されることを忘れないでください。

$ echo -e 'string\nstring1' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true
$ echo -e 'string\nstring' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true
true
$ echo -e 'string1\nstring' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true

良い反例は、「string」を最初の文字列として、「rm -Rf /」を2番目の文字列として比較することです。ルートとして確認してください。両方の文字列は明らかに同じではありませんが、「true」と表示されます。


1

JavaScript [18バイト]

(_={})[a]=1,!!_[b]

または

!!((_={})[a]=_)[b]

これはtrueif a == bおよびfalseif を返しa =/= bます。背後のロジックはa、プロパティとしての値を持つオブジェクトを作成し、そのオブジェクトに値のプロパティが存在するか存在しない場合に返す1undefined、またはその場合に備えbてオブジェクトを作成します。


ルールは、あなたが真または偽と評価され、そのことをオブジェクトを返すことが許されていると言う!!必要はありません
James_pic

@James_picええ、しかしそうでない場合は、1またはundefined(またはundefined2番目の場合はobject /)を返します。
VisioN

ルールは、真と偽の値が真と偽の代わりに実行されると言っていると解釈したので、1またはundefinedで十分だと思います。
James_pic

@James_pic私はただ安全な側にいたかっただけです:)もしそうなら、それから18-2 = 16 bytes
ビジョン

1

JavaScript [15バイト]

![a].indexOf(b)

これはtrueif a == bおよびfalseif を返しa =/= bます。スクリプトは、の値のb単一要素を保持する配列内のの値を探していますa


1

C- 86 83

main(int i,char**v){return*v[1]&!(*v[1]++^*v[2]++)?main(3,v):!(*--v[1]^*--v[2]);}

最短ではありませんが、これは文字列変数では機能せず、代わりにコンソールからの入力として文字列を受け取ります。また、明らかに最短バージョンではありませんが、私は再帰メインのようなものです。しかし、確かに最もお勧めできません。


多くの演算子の周りにスペースは必要ありません。たとえば、char** vと書くことができますchar**v。いくつかの例外(など42 / *pointer)がありますが、ほとんどの場合、特殊文字の近くのスペースは安全に削除できます。
コンラッドボロウスキ

そして、アペルサンドが多すぎます。今日はトップではありません。
SBI
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.