ソウルメイトを探して


40

整数の空でない有限リストが与えられた場合、正確に2つの等しいエントリがあり、他のすべてのエントリが明確な場合は真実の値を出力し、そうでない場合は偽の値を出力します。

truthy:
[1,1]
[1,2,1]
[1,6,3,4,4,7,9]

falsey:
[0]
[1,1,1]
[1,1,1,2]
[1,1,2,2]
[2,1,2,1,2]
[1,2,3,4,5]

整数が常に10未満になるとは想定できないと思いますか?
マーティンエンダー

1
ご使用の言語がより大きな整数をサポートしていない場合を除きます。
flawr

1
一貫性という意味を詳しく説明できますか?
-flawr

33
これをHNQの上で見て、interpersonal.seの最後の質問に到達したと思った
gntskn

3
@Walfrat独自の課題として投稿してください。また、そのようなフィードバックは通常、サンドボックスで評価されます。
flawr

回答:


22

Pythonの3、30の 28バイト

lambda m:len({*m})+1==len(m)

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

{*m}リストをsetオブジェクト、重複のないアイテムの順不同リストにキャストします。これを行うと、リスト内の重複の数だけリストの長さが常に減少します。長さがどれだけ変化したかを計算することで、リストに単一の重複があるかどうかを簡単に判断し、テストの結果を返すことができます。

ovsのおかげで-2バイト。


まさに私が持っていた解決策でしたが、{*m}代わりにショートカットを忘れてしまいましたset
-FlipTack

否定の場合は27バイト。(真実であるはずのときのファルシーなど)
mbomb007

3
次に、別の奇妙な方法(否定)を示しますlambda m:~-len(m[len({*m}):])
。– mbomb007


7

MATL7、6つのバイト

&=sp4=

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

@Guiseppeのおかげで1バイト節約できました!

説明:

&=  % Table of pair-wise equality comparisons
    %
    % [1 0 0 0 0 0 0
    %  0 1 0 0 0 0 0
    %  0 0 1 0 0 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 0 0 1 0
    %  0 0 0 0 0 0 1]
    %
s   % Sum each Column. Stack:
    %
    % [1 1 1 2 2 1 1]
    %
p   % Product of the array. Stack:
    %
    % [4]
    %
4=  % Compare the stack to '4'

1
ためsであるsumsum合計最初の非シングルトン次元(列)に沿って、そしてマトリックスは対称であり、これはただであることができなかったsの代わりにXs
ジュゼッペ

1
@Giuseppe Ah、TIL。ありがとうございました!
DJMcMayhem


6

ゼリー8 5バイト

QL‘=L

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

説明

QL‘=L  - Main link, argument L (a list)   e.g [1,6,3,4,4,7,9]
Q      - Deduplicated elements                [1,6,3,4,7,9]
 L     - Length                               6
  ‘    - Increment                            7
    L  - Length of the input                  7 ([1,6,3,4,4,7,9])
   =   - Are they equal?                      1

出力値に一貫性のある値を設定できる場合、正常に機能し、その他の非正の値は偽にQL_L出力さ-1れます(ありがとう@JonathanAllan)


QL_L考え出力-1truthy未満、いくつかの数のため-10falseyのための(例えば、[1,6,3,4,4,7,9,9,9]戻ってくる-3一方で、[1,6,3,4,7,9]返します0)。
ジョナサンアラン

@JonathanAllanそうそう。私がそれをテストした例は、たまたま戻ってきたと思い-2ます。
coinheringaahing caird


4

Pushy、8バイト

かどうかをチェックする簡単な実装len(set(list)) == len(list)-1

LtvuL^=#

説明:

       \ Implicit: Put all input on stack
Ltv    \ Get the stack length - 1, save in auxiliary stack
u      \ Remove non-unique elements
L      \ Get the new length
^=     \ Compare with the previously saved length
#      \ Print result

これは、最初のリストに明確でない整数が1つしかなかった場合に長さが1だけ減少するために機能します。

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


1
うわー、プッシュ式の答えを見たことがありません!+1
ケアード・コマンリンガー

1
@cairdcoinheringaahing Pushyは決して死なないでしょう。強くなるだけです。
FlipTack

4

オクターブ、25バイト

これは、他の多くの回答と同じように、groupまたはuniqueアプローチを使用するのではなく、可能なすべての比較の「デカルト積」を使用しています。

@(x)nnz(triu(x==x',1))==1

説明

             x==x'        %create a matrix where the entry at (i,j) compares whether x(i) == x(ju)
        triu(x==x',1)     %only consider the strict upper triangular matrix
    nnz(triu(x==x',1))    %count the number of nonzero entries
@(x)nnz(triu(x==x',1))==1 %check whether this number is actually 1

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

そして、畳み込みなしでは完全なプログラムはないので(間違いを修正してくれた@LuisMendoに感謝します):

オクターブ、40バイト

@(x)nnz(~conv(sort(x),-1:2:1,'same'))==1

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


あなたは私にこのアプローチを思いつくよう促しました:)
Stewie Griffin

2
@StewieGriffin MATLの答えはあなたの正確なアプローチを使用したと思う:)
flawr


4

網膜15 12 11バイト

1バイトを節約してくれたNeilに感謝します。

D`
Mm2`^$
1

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

入力は改行で区切られます。(テストスイートでは、便宜上コンマ区切りを使用しています。)

説明

D`

入力の行を重複排除します。これにより、以前に表示されていた整数が削除されます(ただし、周囲の改行は残ります)。

Mm2`^$

削除した重複の数に等しい空の行の数をカウントしますが、最初の2つの一致のみを考慮します。そのため、出力は0(重複なし)、1(1つの重複)、2(2つ以上の重複)のみになります。

1

重複が1つだけ削除されたことを確認してください。


3行目の入力が常に0、1、または2になるように、改行の一致を2に制限してバイトを保存し、テストを簡素化します。(迷惑なことにA`.、最後の改行を削除するため、改行のカウントに使用できません。)
ニール

@Neilありがとう、制限はきちんとしたアイデアです。私もを使用してみましたA`.が、問題は、単一の空行とまったく行がないことを区別できないことです。行がある場合は、改行で終了AしてG出力することを検討する必要があります。他のシナリオでは改行が煩わしいと思うので、それはおそらくオプションでしょう。
マーティンエンダー

単一の空行を一致させるのは簡単です-それはちょうど^$¶です。
ニール

@Neilいいえ、1 Aつの空の行を保持するか、すべての行を破棄するかに関係なく、の出力は同じです。
マーティンエンダー

それが1つの少ない空行を返しますが、その後は0と1の間を区別することはできません-申し訳ありませんが、それは私が「最後の1をドロップ」によって意味したものだ
ニール・


3

ルビー、32バイト

->(s){s.uniq.length==s.length-1}

PPCGへようこそ!これはコードゴルフであるため、プログラムのバイト数を含める必要があります。今回は、あなたのためにそれを行う自由を取りました。
パベル

どうArray#size
トラビス

あなたは使用して26バイトに取り掛かることができます->s{s.uniq.size==s.size-1}
コナー・オブライエン


3

Excel、42バイト

デンマーク語版

=TÆLV(A:A)=SUM(--(FREKVENS(A:A,A:A)>0))+1

columnの個別のセルにあるリストの各整数を想定していますA
一貫性のないfalsey値が許可されている場合、3バイトを節約できます。

=TÆLV(A:A)+SUM(-(FREKVENS(A:A,A:A)>0))

英語版(44バイト)

=COUNTA(A:A)=SUM(--(FREQUENCY(A:A,A:A)>0))+1

3

R32 31バイト

@JarkoDubbeldamのおかげで-1バイト

cat(sum(duplicated(scan()))==1)

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

stdinから読み取り、stdoutに書き込みます。

duplicated値を置き換えるリストを反復処理する、lTRUEその値がリスト内の以前、および発生した場合にFALSEそうでありません。ソウルメイトのユニークなペアがあるTRUE場合、値は正確に1つである必要があるため、合計はである必要があります1



1
@JarkoDubbeldamああ、もちろん。またお会いできてうれしいです!久しぶりです。
ジュゼッペ

他のことで忙しくして、まだ完全に戻っているかどうかはわかりません。
JAD

@ジュゼッペ、私はこの質問を読んですぐにあなたのオリジナルのアプローチを考えました。私はこのscan()アプローチを考えたことがなかったでしょう。
ジョセフウッド

3

PowerShell40 37バイト

($args|sort -u).count-eq$args.count-1

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

Sort-Objectコマンド(別名sortで)-uniqueフラグは入力のみユニークな構成要素を引き出します。たとえば、inputの@(1,3,3,2)場合、これはになり@(1,2,3)ます。

したがって、.countこのオブジェクトの(つまり、要素の数)が入力配列の値と-eq一致することを確認する必要があります(つまり、重複するエントリが1つだけあります)。.count-1

Sinusoidのおかげで3バイト節約されました。
TessellatingHecklerのおかげでバグが修正されました。


同じ結果を得るために、グループの代わりにget-uniqueエイリアス 'gu'を使用できますか?
正弦波

@Sinusoidはい、できます。ありがとう!
AdmBorkBork

これは、第二のテストケースでの作業はしない1,2,1- get-uniqueだけ事前ソートされた入力で動作します。どの程度($args|sort -u).count-eq$args.count-1あなたのようにそれを呼び出す場合、また37ですが、すべてのテストケースのために仕事をしているf 1 2 1代わりにf 1,2,1
-TessellatingHeckler

@TessellatingHecklerああ、いいキャッチ。私が行ったすべてのテストは、事前に仕分けされた入力で行われました。ありがとう!
AdmBorkBork



2

Octave / MATLAB(Statisticsパッケージ/ツールボックス付き)、21バイト

@(x)nnz(~pdist(x))==1

匿名関数。入力は列ベクトルです。出力はtrue(として表示1)またはfalse(として表示0)です。

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

説明

pdist(x)からのすべての行のペア間のユークリッド距離のベクトルを計算しxます。各ペアを1回だけ考慮し(2行の順序は関係ありません)、同じ行で2回形成されたペアを考慮しません。

私たちの場合xは列ベクトルなので、2つの行の間のユークリッド距離は、2つの数値の絶対差になります。

~は論理(ブール)否定でnnzあり、非ゼロの数であり、と==1比較し1ます。したがって、結果はtrue、距離がゼロになるペアが1つしかない場合に限ります。



2

ジュリア、39 26バイト

!a=sum(a.==a')==endof(a)+2

説明

コードはブール値の2次元テーブルを生成します。これはsum関数を使用して収集され、Aのデカルト正方形の同じ要素のペアの数をカウントします。反復文字が1つだけある場合にのみ、数量は等しくなります。

このコードは、NOT演算子を再定義します。


!a=sum(a.==a')==endof(a)+2数バイト節約します。オンラインでお試しください!
デニス


2

オクターブ23 26バイト

@(x)prod(sum(x==x'))==4

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

このx==x'部分は、flawrの答えに触発されました。これはLuisの答えよりも長いですが、ツールボックスを使用しません。

説明:

これは、x入力としてベクトルを取り、転置されたそれ自体と比較する匿名関数です。これにより、すべての対角要素がである行列が得られ、すべての対角要素1が重複要素があることを示します。

特定の列に沿った合計は、その数の重複の数を示します。2つの数値に重複が必要なので、2つの値は2に等しく、残りは2に等しくありません。

この行列の積をとると、4等しい要素(2*2*1*1*1*1*...)が2つしか4なく、重複がない場合、または2つ以上ある場合以外のものが得られます。


2

PHP、46バイト

<?=count(array_unique($argv))==count($argv)-1;

のエントリの数をカウントし、$argv一意のエントリの数と比較します。前者が後者よりも1高い場合は、真実であり、そうでない場合は偽です。

eval.inで試してみてください!


変数名$ argvを使用する必要がありますか?
dading84

3
@ dading84 $argvは、コマンドラインパラメーターのリストです。だから、いいえ、彼は単に使用することはできません$a
タイタス

2

05AB1E6 5バイト

{¥>ΘO

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

{¥>ΘO   # example input:               [1, 6, 3, 4, 4, 7, 9]
{       # sort                      -> [1, 3, 4, 4, 6, 7, 9]
 ¥      # get deltas                -> [  2, 1, 0, 2, 1, 2 ]
  >     # increment                 -> [  3, 2, 1, 3, 2, 3 ]
   Θ    # truthify (only 1 gives 1) -> [  0, 0, 1, 0, 0, 0 ]
    O   # sum                       -> 1

105AB1Eで唯一の真理値であるため、ここでやめることができます。(指摘してくれた@Emignaに感謝します。)

2つの異なる値のみを取得するために、オプションで以下を追加できます。

     Θ  # equals 1?                 -> 1

1
falseyケースのいずれかのfalsey値を返しても大丈夫であれば、あなたはスキップすることができますΘよう、105AB1Eでのみtruthy値です。
エミグナ

@Emignaありがとう!OPによって承認されたかどうかはわかりませんでしたが、そうだと思います。
アーナルド

機能し¢ないため、以前のソリューションに戻す必要があると思います。inを検出するため[19,4,4,9]、falseおよび[19,9]true としてカウントされます。010
エミグナ

@Emignaそれを見つけてくれてありがとう。それは修正されたと思います。
アーナルド

{¥_O同様に大丈夫です。
エミグナ



1

Japt、7バイト

â ʶUÊÉ

それを試してみてください


説明

重複を削除(â)、長さ(Ê)を取得し、等値()とÊ入力の長さ(U)から1(É)を引いたものを比較します。


それは12バイトではありませんか?âÊɶマルチバイト文字ではありませんか?
RedClover


1

05AB1E、5バイト

gIÙg-

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

g     # Get number of elements in input
 IÙg  # Get number of unique elements in input
    - # Subtract

05AB1Eでは、1が唯一の真理値であるため、真理結果を得るには、uniquifyによって正確に1つの重複する要素を削除する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.