明確なふるい


17

整数のリストが与えられたら、真のインデックスを使用してリストから個別の値をフィルターできるようにブールマスクを作成します。真のインデックスとして選択されるインデックスは、同一の値に対応するインデックスのセットごとに1つだけが選択されている限り、重要ではありません。

入力は、ご使用の言語に適した形式の負でない整数の空でないリストになり、出力は上記の仕様に従ったブール値のリストになります。出力リストでは、真偽値と偽値の独自の定義を使用できます。

以下の例では、私は1真実であり0、虚偽であると定義しています。

[5, 4, 7, 1]  Input
[1, 1, 1, 1]  Output
              Select only the values with with true indicies in the sieve
[5  4  7  1]  Contains zero duplicate values

[5, 9, 7, 5, 6, 0, 5]
[0, 1, 1, 1, 1, 1, 0]
[   9, 7, 5, 6, 0   ]

テストケース

がある場合or、有効な出力が複数あることを意味します。末尾に省略記号がある場合は...後にor、それはないすべての可能な出力のが表示されていたことを意味します。

[0] = [1]

[55] = [1]

[32, 44] = [1, 1]

[0, 0] = [1, 0] or [0, 1]

[9001, 9001, 9001] = [1, 0 , 0] or [0, 1, 0] or [0, 0, 1]

[5, 4, 7, 1] = [1, 1, 1, 1]

[1, 2, 3, 4, 3, 5] = [1, 1, 1, 1, 0, 1] or
                     [1, 1, 0, 1, 1, 1]

[5, 9, 7, 5, 6, 0, 5] = [1, 1, 1, 0, 1, 1, 0] or
                        [0, 1, 1, 1, 1, 1, 0] or
                        [0, 1, 1, 0, 1, 1, 1]

[0, 8, 6, 6, 3, 8, 7, 2] = [1, 1, 1, 0, 1, 0, 1, 1] or
                           [1, 0, 0, 1, 1, 1, 1, 1] or
                           [1, 0, 1, 0, 1, 1, 1, 1] or
                           [1, 1, 0, 1, 1, 0, 1, 1]

[45, 47, 47, 45, 24, 24, 24, 8, 47, 41, 47, 88]
= [1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1] or ...

[154, 993, 420, 154, 154, 689, 172, 417, 790, 175, 790, 790, 154, 172, 175, 175, 420, 417, 154, 175, 172, 175, 172, 993, 689, 993, 993, 790]
= [1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] or ...

ルール

  • これはので、最短のソリューションが勝ちます。
  • 組み込みが許可されています!
  • 出力リストでは、真偽値と偽値の独自の定義を使用できます。そうすることを選択した場合は、定義を明記してください。
  • 入力は、負でない整数の空でないリストになります。
  • ふるいのうちの1つのみを出力するか、複数またはすべてを出力するかを自由に選択できます。各ふるいが有効である限り、受け入れられます。

2
の場合[0, 8, 6, 6, 3, 8, 7, 2][1, 0, 0, 1, 1, 1, 1, 1]有効な出力のリストに追加する必要がありますか?
アトラロジスト

truthyとfalsy値の独自の定義は、言語を参照するか、私たちは自由に選ぶことができますか?一貫性が必要ですか?
デニス

@atlasologistタイポをキャッチしていただきありがとうございます
マイル

@Dennis独自のブール値を自由に定義できます。それらは選択した言語と同じである必要はありませんが、独自の定義と一致している必要があります。私の例ではtrueとfalseの1と0の代わりに、負の値をfalseとして、非負の(ゼロまたは正の)値をtrueにすることができました。
マイル

わかりました、ありがとうございます。一貫して、単一の真実の値が必要な場合、または複数の値が存在する場合があることを意味しました。
デニス

回答:


11

MATL、7 6 4バイト

@Luisのおかげで1バイト節約@Dennisのおかげで
2バイト節約

&=Rs

1真実であると定義し、他のすべての値を偽と定義する

オンラインで試す

すべてのテストケース

説明

    % Implicitly grab input array
&=  % 2D array of equality comparisons
R   % Get the upper triangular portion
s   % Sum down the columns
    % Implicitly display the result

1バイト少ない:&=Rs1=
ルイスメンドー

@LuisMendo Ha私は文字通りそのアプローチで遊んでいました!
-Suever

2
OPは、この課題における真実と偽りの意味を明確にしました。1を真実として定義し、他のすべてを偽として定義する場合、をドロップできますl=
デニス

素晴らしい使用。その目的は、フィルタリングステップを追加する必要を回避することであり、デニスのゼリーソリューションに一致しました。
マイル

9

ゼリー、4 バイト

ĠṪ€Ṭ

最後の出現を優先します。オンラインでお試しください!または、すべてのテストケースを確認します

使い方

ĠṪ€Ṭ  Main link. Argument: A (array)

Ġ     Group; paritition the indices of A according to their corresponding values.
 Ṫ€   Tail each; select the last index of each group.
   Ṭ  Untruth; generate a Boolean array with 1's at the specified indices.

これは最後にゼロを切り捨てないでしょうか?
リーキー修道女

2
各一意の整数の最後の出現を選択するため、末尾にゼロを含めることはできません。
デニス

それは賢いです。
リーキー修道女

8

Pythonの3、47 35 39 36バイト

lambda n:[n.pop(0)in n for x in n*1]

リストから最初の項目をポップし、それがリストの他の場所に存在するかどうかを確認し、新しいリストに挿入するTrueFalse、新しいリストに挿入します。

この関数の場合False、個別の値を示し、Trueそれ以外の場合(True=0およびFalse=1

大量のバイトを寄せてくれたデニスに感謝

オリジナル、47バイト:

lambda n:[(1,0)[n.pop()in n]for x in[1]*len(n)]

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


lambda n:[1-(n.pop()in n)for x in n*1]数バイト節約します。
デニス

3
OPは、真実の値が実際に真実である必要はないことを明らかにしたのでlambda n:[n.pop()in n for x in n*1]、同様に機能します。
デニス

新しいバージョンでは、xnorが真偽や偽りのように否定した値を使用していることに気付くまで、少しの間失っていました。
マイル

あなたがする必要がある.pop(0)か、マスクが逆に出てきます。
-xnor

それはxnorの意味ではありません。最後の要素を最初に.pop()処理するため、順序は逆になります。
デニス

7

Pyth、6バイト

.eqxQb

ブール(TrueおよびFalse)のリストを出力します。インデックスが値の最初の出現のインデックスと等しい場合、入力の各要素をチェックします。つまり、各要素が最初に出現するかどうかを確認しています。

pythonic擬似コードの場合:

.e      enumerated_map(lambda b,k:    # maps with b as value and k as index
  q       equal(
   xQb      Q.index(b),
            k),                       # implicit lambda variable
          Q)                          # implicit argument to map

ここでテストしてください。


6

J、2バイト

~:

これが、このチャレンジのアイデアの起源でした。ビルトイン~:Nub-SieveJ で呼び出され、チャレンジで説明されている操作を実行するブールリストを作成します。ここで、を1表しtrue、を0表しfalseます。




4

C#、63バイト

int[]l(List<int> i)=>i.Select((m,n)=>i.IndexOf(m)-n).ToArray();

また、1または0を返すようにすることもできます。また、therbyはパラメーターを作成し、同じ型を返すことで、これをラムダ式にすることができますか?

いくつかのガイダンスをいただければ幸いです

同じ型コード

    public static List<int>l(List<int>i){
        return i.Select((m,n)=>i.IndexOf(m)==n?1:0).ToList();
    }

あなたがtruthyを定義する場合は、] [-nと== nを交換し、int型を返すことができない何かであることを0とfalsyされるように
raggy

いい考えだ
-downrep_nation

式を使用する関数int [] l(List <int> i)=> i.Select((m、n)=> i.IndexOf(m)-n).ToArray();
ぼろぼろの

なんてこった、これからの答えにたくさんのバイトを保存してくれた。どうもありがとうございます
-downrep_nation

.NetFiddleで例を提供できますか?
aloisdgは回復モニカ言う

3

Python、35バイト

f=lambda l:l and[l.pop(0)in l]+f(l)

True偽の値として、および真実の値として使用しFalseます。各要素の最後の外観をマークします。

残りの要素の中に表示されない場合にのみ最初の要素を選択し、空でない限りリストの残りの部分に再帰します。はl.pop(0)、最初の要素を抽出すると同時に削除します。


3

網膜、23バイト

(\d+)((?!.* \1\b))?
$#2

入力はスペースで区切られたリストです。(実際、[1, 2, 3]最初の数字を除く各数字の前にスペースがあれば、他の形式も機能します。)

オンラインでお試しください!(一度に複数の改行で区切られたテストケースで動作します。)

0入力に後で別のコピーがある場合は、各要素を単純に変換し、1それ以外の場合は単純にします。


2

PowerShell v2 +、40バイト

$a=@();$args[0]|%{(1,0)[$_-in$a];$a+=$_}

空の配列を作成します$a。次に、入力リストを経由$args[0]してループにパイプします|%{...}。各繰り返しは、我々は、いずれかを選択1または0現在の要素がであるかどうかに基づいて、擬似三元から$a。これらの選択はパイプラインに残ります。次に、現在の要素を配列に追加します$aます。パイプライン要素はまとめられ、配列としての出力は暗黙的です。

例:

(これ.ToString()は配列のデフォルトであるため、改行セパレータ付きでここに出力します)

PS C:\Tools\Scripts\golfing> .\distinct-sieves.ps1 1,2,3,4,1,3,5,7
1
1
1
1
0
0
1
1

1

JavaScript(ES6)、31バイト

f=a=>a.map((e,i)=>i-a.indexOf(e))

ゼロは真実であり、他の数字は偽です。


1

Mathematica、53 31バイト

22バイト節約したアイデアをくれてありがとう。

s[[;;x++]]~FreeQ~#&/@(x=0;s=#)&

MapIndexed以前のサブリストの上で使用してはどうですか?MapIndexed[s[[;;#-1&@@#2]]~FreeQ~#&,s=#]&41バイトかかります。
マイル

@マイルああ、それははるかに良いです(そして私はそれをもう少し改善しました;))
マーティン・エンダー

MapIndexedこの場合は短縮するのが良い方法であり、インデックスを抽出またはデクリメントする必要さえありません
マイル

1

Perl 5

push@o,map{$b=pop@a;(grep{/^$b$/}@a)?1:0}(1..~~@a);

1. ..スカラーコンテキストを提供するため、は必要ありません~~。2. greptrue / falsyを返しますので、必要はありません?1:0。3. grep/.../,@aは、よりも短いgrep{/.../}@a。4.最終版は必要ありません;。5.括弧は必要ありません1..@a。6.入力の送信元
q /

1

Java、96バイト

void s(int[]a){for(int i=0,j,n=a.length,b=1;i<n;a[i++]=b,b=1)for(j=i+1;j<n;)b=a[i]==a[j++]?0:b;}

配列をその場で変更します。最後の出現を優先します。

真実の値はfalseで1あり、偽の値は0です。

すべてのテストケースを検証します

ゴルフをしていない:

void sieve(int[]a){
    int n = a.length;
    for(int i=0;i<n;i++){
        int b = 1;
        for(int j=i+1;j<n;j++){
            if(a[i] == a[j]){
                b = 0;
            }
        }
        a[i] = b;
    }
}

1

実際には、11バイト

;╗ñ`i@╜í=`M

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

説明:

;╗ñ`i@╜í=`M
;╗           save a copy of input in reg0
  ñ          enumerate
   `i@╜í=`M  for each (index, value) pair:
    i@         flatten, swap
      ╜í       first index in input of value
        =      compare equality


1

C ++、242バイト

確かに過剰なソリューションです。あらゆる順序のタイプの標準コンテナで機能します

#include<algorithm>
#include<list>
#include<set>
template<class T>auto f(T a){using V=typename T::value_type;std::set<V>s;std::list<bool>r;std::transform(a.begin(),a.end(),std::back_inserter(r),[&](V m){return s.insert(m).second;});return r;}

ゴルフをしていない:

(さらに一般化)

template<class T>
auto f(T a)
{
    using std::begin;
    using std::end;
    using V=typename T::value_type;
    std::set<V>s;
    std::list<bool>r;
    std::transform(begin(a),end(a),std::back_inserter(r),[&](V m){return s.insert(m).second;});
    return r;
}

テストスイート:

int test(const std::list<bool>& expected, const auto& x) { return f(x) != expected; }
#include<array>
#include<chrono>
#include<forward_list>
#include<initializer_list>
#include<string>
#include<vector>
using namespace std::literals::chrono_literals;
int main()
{
    return 0
        + test({},            std::vector<short>{})
        + test({1},           std::array<int,1>{})
        + test({1},           std::vector<char>{55})
        + test({true,true},   std::vector<unsigned>{32,44})
        + test({1,0},         std::list<std::string>{"zero", "zero"})
        + test({1,0,0},       std::vector<long>{9001,9001,9001})
        + test({1,1,1,1},     std::array<char,4>{5,4,7,1})
        + test({1,1,1,1,0,1}, std::initializer_list<std::string>{"one","two","three","four","three","five"})
        + test({1,0,1,0,0},   std::forward_list<std::chrono::seconds>{60s, 1min, 3600s, 60min, 1h});
}

1

TSQL 52バイト

DECLARE @ TABLE(i int identity, v int)
INSERT @ values(1),(2),(3),(4),(3),(5)

SELECT i/max(i)over(partition by v)FROM @ ORDER BY i

フィドル


1

PHP、66 62 39バイト

  • すべてのアトミック値(ブール、整数、フロート、ストリング)を受け入れます
    false(false、0、 "")および数値文字列( "1"は1に等しい)に評価される値を除くを
  • フラグの最初の発生

新しいバージョン(プログラム、37 + 2バイト)
はJavaと(今も)C#に勝っています。今でもPythonにほとんど勝っています。ハッピー。

<?foreach($a as$v)$u[$v]=print$u[$v]|0;
  • PHPの場合は+6> = 5.4、関数の場合は+ 16-3
  • プリント区切り文字のないリスト0(真)と1(false)を
    挿入!した後print反転
  • 使用法:set register_globals=Onshort_open_tags=Onおよびerror_reporting=0in php.inifor php-cgi
    then呼び出しphp-cgi -f <filename> a[]=<value1> a[]=<value2> ...;echo""
  • PHP> = 5.4のために:置き換える$a$_GET[a](6)、セットshort_open_tags=Onerror_reporting=0
  • または交換$aしてarray_slice($argv,1)(19)、削除<?(-2)
    と呼php -d error_reporting=0 -r '<code>' <value1> <value2> ...;echo""

古いバージョン(関数、62バイト)

function f($a){foreach($a as$v)$u[$v]=1|$m[]=$u[$v];return$m;}
  • falsetrueおよびtruefalseの配列を返します。(空の文字列として出力または1)後に
    挿入!$m[]=反転に
  • 55バイトの修飾された関数には別の方法もあります。

テスト(古いバージョン)

function out($a){if(!is_array($a))return$a;$r=[];foreach($a as$v)$r[]=out($v);return'['.join(',',$r).']';}
function test($x,$e,$y){static $h='<table border=1><tr><th>input</th><th>output</th><th>expected</th><th>ok?</th></tr>';echo"$h<tr><td>",out($x),'</td><td>',out($y),'</td><td>',out($e),'</td><td>',(strcmp(out($y),out($e))?'N':'Y'),"</td></tr>";$h='';}
$samples=[
    [0],[1],    [55],[1],    [32,44],[1,1],    [9001,9001,9001],[1,false,false],
    [5,4,7,1],[1,1,1,1],    [1,2,3,4,3,5],[1,1,1,1,false,1],
    [5,9,7,5,6,0,5],[1,1,1,false,1,1,false],    [0,8,6,6,3,8,7,2],[1,1,1,false,1,false,1,1],
    [45,47,47,45,24,24,24,8,47,41,47,88],[1,1,'','',1,'','',1,'',1,'',1],
    [154,993,420,154,154,689,172,417,790,175,790,790,154,172,175,
        175,420,417,154,175,172,175,172,993,689, 993,993,790],
        array_merge([1,1,1,false,false,1,1,1,1,1],array_fill(0,18,false))
];
for($i=count($samples);$i--;--$i)for($j=count($samples[$i]);$j--;)$samples[$i][$j]=!$samples[$i][$j];
while($samples)
{
    $a=array_shift($samples);
    $em=array_shift($samples);
    test($a,$em,$ym=s($a));
    $eu=[];foreach($em as$i=>$f)if($f)$eu[]=$a[$i];
    $yu=[];foreach($ym as$i=>$f)if($f)$yu[]=$a[$i];
#   sort($eu); sort($yu);
    test('unique values',$eu,$yu);
}
echo '</table>';

1

Haskell、29 27バイト

f a=[elem x t|x:t<-tails a]

偽値Falseとして、true Trueとして使用します。

λ> let f a=[elem x t|x:t<-tails a] in f [5, 9, 7, 5, 6, 0, 5]
[True,False,False,True,False,False,False]

import Data.List使用する必要tailsがあるかもしれませんが、 tryhaskell.orgはコードをそのまま実行します。


外側の括弧は必要ありません。\a->[...]適切な機能です。疑問がある場合は、名前を付けますf a=[...]
nimi

@nimiは括弧なしでは呼び出せませんでした。名前を付けるとうまくいきます、ありがとう。
ウィルネス

私はこの省略の正当化が好きではありません import Data.Lista。GHCi configにインポート(または定義さえ)を入れることができるので、非常に滑りやすい斜面です。b。tryhaskell.orgをHaskell言語の正式な実装として扱いますが、実際にはそうではありません。(繰り返しますが、ゴルファーが望むすべてのインポートと定義を備えた独自のtry-Haskell-online環境を作成するとどうなりますか?それはまだ本当に「Haskell」ですか?)
Lynn

ここで、コードをそのまま実行するプラットフォームがあれば、そのコードは受け入れられると言われました。私は正確なルールが何であるか分かりません、私は言われた通りに行きます。あなたのサイトが年中無休で利用可能で、標準のHaskellを実行しているなら、そうだと思います。しかし、あなたは最初のものについては正しいです、私はそれを削除しました。ありがとう。
ウィルネス

1

Perl 5 + Perligata、343バイト

315バイト、プラス28 -MLingua::Romana::Perligata

として使用perl -MLingua::Romana::Perligata foo.pl; 入力(標準入力から)および出力(標準出力へ)は、アンダースコアで区切られた10進整数の文字列です。Perligataのバージョン0.6でStrawberry 5.20.2でテスト。Perligataバージョン0.50で動作するかどうかはわかりません。

huic vestibulo perlegementum da.qis _ scindementa da.dum qis fac sic
ao qis decumulamentum da.ao aum tum nullum addementum da.meo io.meo ro.per ium in qis fac sic
si ium tum aum aequalitas fac sic ro I da cis cis
ro nullum tum non rum addementum da.capita bis rum cis
per in bis fac sic hoc tum _ egresso scribe cis

明らかにこれは鐘のように明確です。そうでない場合は、-MLingua::Romana::Perligata=converte代わりに-MLingua::Romana::Perligata、とperl意志、代わりに通常のPerlのスクリプトに、出力変換を実行します:

 $_ = Lingua::Romana::Perligata::getline (*STDIN );
 @q = split ( '_');
while (@q) { $a = pop (@q );
 $a =  ($a + 0);
my $i ;
my $r ;
for $i (@q) {if ( ($i eq $a)) { $r = 1}
}
;
 $r =  (0 +  ! ($r));
unshift (@b, $r)}
;
for $_ (@b) {print (STDOUT $_, '_')}

トークンごとの分析には、次を使用します -MLingua::Romana::Perligata=discribe


ゴルフノート:

  • 文書化されていない(当然のことですが)後にスペースは必要ありません .
  • (当然のことですが) scinde 2番目の引数は不要で、を使用しhocます。
  • 私は使わなければなりませんでした ao aum tum nullum addementum damorde仕事に行けなかったのでませんでした。
  • 同様に、私は使用しました per ium in qis... ro I davanne仕事ができなかったのでしました。
  • の代わりにhuic vestibulo perlegementum da、私は試してみましたが-pMLingua::Romana::Perligata、それを動作させることもできませんでした。

キックのみ(この全体の答えはキックのみでしたが):

  • それをきれいにした後Huic vestibulo perlegementum da. Qis lacunam scindementa da. Dum qis fac sic ao qis decumulamentum da. Ao aum tum nullum addementum da. Meo io. Meo ro. Per ium in qis fac sic si ium tum aum aequalitas fac sic ro I da cis cis. Ro nullum tum non rum addementum da. Capita bis rum cis. Per in bis fac sic hoc tum lacunam egresso scribe cis.、Google翻訳は与えるThis court perlegementum grant. QIS gap scindementa grant. While QIS QIS decumulamentum do so ao da. Ao sum and no addementum grant. My io. My ro. Through ium in QIS do so if the sum ium equality do so ro 1 from cis. Ro was not any rum addementum grant. The heads of the bis side. Write, do so as soon as he at that time that in the gap by the Kish was taken.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.