Farklı Elekler


17

Tamsayıların bir listesi verildiğinde, boole maskesi, gerçek indekslerin listeden farklı değerleri filtrelemek için kullanılabileceği şekilde oluşturun. Gerçek değer olarak seçilen dizin, aynı değerlere karşılık gelen her bir dizin kümesi için yalnızca bir tanesi seçildiği sürece önemli değildir.

Giriş, dilinize uygun bir biçimde boş olmayan negatif olmayan tam sayıların bir listesi olacak ve çıktı, yukarıdaki spesifikasyona göre boole değerlerinin bir listesi olacaktır. Çıktı listesinde kendi doğruluk ve tahribat değerleri tanımlarınızı kullanmanıza izin verilir.

Aşağıdaki örneklerimde, 1doğruluk ve 0sahte olmayı tanımlarım.

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

Test Durumları

Bir olduğunda, orbirden çok geçerli çıktı olduğu anlamına gelir. Bir arka üç nokta varsa ...sonra or, bu tüm olası çıkışların listelenen anlamına gelir.

[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 ...

kurallar

  • Bu bu yüzden en kısa çözüm kazanır.
  • Yapılara izin verilir!
  • Çıktı listesinde kendi doğruluk ve tahribat değerleri tanımlarınızı kullanmanıza izin verilir. Bunu yapmayı seçerseniz, lütfen tanımlarınızı belirtin.
  • Girdi, negatif olmayan tam sayıların boş olmayan bir listesi olacaktır.
  • Eleklerden sadece birini veya birden fazlasını veya hatta tümünü çıktılamak arasında seçim yapabilirsiniz. Her bir elek geçerli olduğu sürece kabul edilecektir.

2
İçin [0, 8, 6, 6, 3, 8, 7, 2], [1, 0, 0, 1, 1, 1, 1, 1]geçerli çıktılar listesine eklenmeli mi?
atlasologist

Does truthy ve falsy değerlerin kendi tanımları diline başvurmak veya serbestçe seçebilir? Tutarlı olmaları gerekiyor mu?
Dennis

@atlasologist Yazım hatası yakalamak için teşekkürler
miles

@Dennis Kendi boolean değerlerinizi tanımlamakta özgürsünüz, seçtiğiniz dil ile aynı olmak zorunda değiller, ancak kendi tanımlarınızla tutarlı olmak zorundasınız. Örneklerimde true ve false için 1 ve 0 yerine, false olarak false ve negatif olmayan (sıfır veya pozitif) değerler true olarak yapabilirdim.
mil

Tamam, açıkladığın için teşekkürler. Tutarlı olarak, tek bir doğruluk değeri olup olmadığı veya birkaç tane olabileceği anlamına geliyordum .
Dennis

Yanıtlar:


11

MATL, 7 6 4 bayt

@Luis sayesinde 1 bayt kaydedildi @Dennis sayesinde
2 bayt kaydedildi

&=Rs

Biz tanımlamak 1truthy olmak ve diğer tüm değerler Falsey olarak

Çevrimiçi Deneyin

Tüm test örnekleri

açıklama

    % 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 bayt daha az:&=Rs1=
Luis Mendo

@LuisMendo Ha Kelimenin tam anlamıyla bu yaklaşımla oynuyordum!
Suever

2
OP bu meydan okumada doğruluk ve sahteliğin ne anlama geldiğini açıklığa kavuşturdu. Eğer tanımlarsanız 1 olarak falsy truthy ve her şeyin olduğu gibi, bırakın l=.
Dennis

Büyük kullanım. Amaç, bir filtreleme adımı eklemek zorunda kalmaktan kaçınmaktı ve şimdi Dennis'in Jelly çözümünü eşleştirdiniz.
mil

9

Jöle , 4 bayt

ĠṪ€Ṭ

Son olayları destekler. Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

ĠṪ€Ṭ  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.

Bu sonunda sıfırları kesmez mi?
Leaky Nun

2
Sonunda sıfır olamaz, çünkü her bir benzersiz tam sayının son tekrarını seçiyoruz .
Dennis

Zekice .
Leaky Nun

8

Python 3, 47 35 39 36 bayt

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

Çekler başka bir yerde listede olup olmadığını ve ekler, listeden ilk öğeyi Pops Trueveya Falseyeni bir liste halinde.

Bu işlev Falseiçin ayrı bir değeri belirtir ve Trueaksi halde ( True=0ve False=1)

Bir ton bayt için Dennis'e teşekkürler

Orijinal, 47 bayt:

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

Dene


lambda n:[1-(n.pop()in n)for x in n*1]birkaç bayt kaydeder.
Dennis

3
OP, doğruluk değerinin aslında doğru olmak zorunda olmadığını açıkladı, bu yüzden de lambda n:[n.pop()in n for x in n*1]işe yarıyor.
Dennis

Yeni sürüm, xnor'ın doğruluk ve falsi için yaptığı olumsuzlanmış değerleri kullandığını fark edene kadar beni biraz kaybetti.
mil

Yapman lazım .pop(0) veya maske tersine döner.
xnor

Xnor'ın anlamı bu değildi. .pop()önce son elemanı işler , böylece ters sıradadırlar.
Dennis

7

Pyth, 6 bayt

.eqxQb

Bir bools ( Trueve False) listesi çıkarır . Dizini değerin ilk gerçekleştiği dizine eşitse, girdideki her öğeyi denetler. Başka bir deyişle, bu her öğenin ilk oluşum olup olmadığını kontrol eder.

Pythonic sözde kodunda:

.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

Burada test edin.


6

J , 2 bayt

~:

Bu meydan okuma fikrinin kaynağı budur. Yerleşik J'de ~:çağrılır Nub-Sieveve meydan okumada açıklanan işlemi gerçekleştiren bir boole listesi oluşturur. Burada, 1temsil eder trueve 0temsil ederfalse .


6

05AB1E , 8 bayt

Kod:

v¹ykN>Qˆ

Açıklama:

y         # For each in the array
 ¹yk      # Get the index of that element in the array
    N>Q   # And see if it's equal to the index
       ˆ  # Add to the global array and implicitly output

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .


4

APL, 6 bayt

⍳∘⍴∊⍳⍨

Dene

Açıklama:

   ⍳⍨  For each character in the string, get the index of its first occurrence
⍳∘⍴     Make a list 1 .. length of input
  ∊    Check if each index is present

4

C #, 63 bayt

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

Ayrıca 1 veya 0 dönüş yapabilir ve parametre ve dönüş türü aynı bir yapmak bana bu lambda ifade tek başına yapmak için izin?

bazı rehberlik takdir edilecektir

aynı tip kodu

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

doğruluk değerini 0 ve yanlış olan başka bir şey olarak tanımlarsanız, == n yerine -n
yazıp

harika bir fikir
downrep_nation

ayrıca gövdeli işlevini kullan int [] l (Liste <int> i) => i.Select ((m, n) => i.IndexOf (m) -n) .ToArray ();
16'da raggy

Aman tanrım, bundan sonra cevaplarımda çok fazla bayt tasarrufu. çok teşekkür ederim
downrep_nation

NetFiddle'da bir örnek verebilir misiniz?
aloisdg taşınma codidact.com

3

Python, 35 bayt

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

TrueYanlış değeri ve doğruluk değeri olarak kullanır False. Her öğenin son görünümünü işaretler.

İlk öğeyi yalnızca kalan öğeler arasında görünmüyorsa seçer, ardından boş olmadığı sürece listenin geri kalanına geri çekilir. l.pop(0)Ayrıca kaldırma Birinci eleman ayıklar.


3

Retina , 23 bayt

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

Girdi, boşlukla ayrılmış bir listedir. (Aslında, gibi diğer formatlar [1, 2, 3]da, her sayı önünde birincisi dışında bir boşluk olduğu sürece çalışacaktır.)

Çevrimiçi deneyin! (Aynı anda birden fazla satır besleme ile ayrılmış test senaryosunda çalışır.)

Daha 0sonra girişte başka bir kopyası varsa ve 1aksi takdirde her öğeyi dönüştürürüz .


2

PowerShell v2 +, 40 bayt

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

Boş bir dizi oluşturur $a. Sonra giriş listesini $args[0]alıp bir döngüye aktarıyoruz |%{...}. Geçerli öğenin içinde olup olmamasına bağlı olarak bir sahte üçlüden 1veya seçtiğimiz her yineleme . Bu seçimler ardışık düzende bırakılır. Ardından, geçerli öğeyi diziye ekleriz0$a$a . Boru hattı elemanları toplanır ve bir dizi olarak çıktı örtüktür.

Misal:

(burada .ToString()bir dizinin varsayılanı olduğundan yeni satır ayırıcıyla çıktı alın )

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 bayt

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

Sıfır doğrudur ve diğer sayılar yanlıştır.


1

Mathematica, 53 31 bayt

Bana 22 bayt tasarruf sağlayan bir fikir verdiğiniz için kilometrelerce teşekkürler.

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

MapIndexedÖnceki alt listelerin üzerinde kullanmaya ne dersiniz ? MapIndexed[s[[;;#-1&@@#2]]~FreeQ~#&,s=#]&41 byte alır.
mil

@miles Ohh, bu çok daha iyi (ve biraz daha geliştirdim;))
Martin Ender

Oo MapIndexedbu dava için kısaltmak için güzel bir yol ve hatta endeksi çıkarmak veya azaltmak zorunda değilsiniz
mil

1

Perl 5

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

1. ..skaler bağlam sağlar, bu yüzden gerekmez ~~. 2. grepdoğruluk / falsy döndürür, bu yüzden gerekmez ?1:0. 3. grep/.../,@adaha kısadır grep{/.../}@a. 4. Finale ihtiyacınız yok ;. 5. Etrafta parantezlere ihtiyacınız olmamalıdır 1..@a. 6. Girişin nereden geldiğini veya çıktının nereye gittiğini göstermiyorsunuz: bkz. Meta.codegolf.stackexchange.com/q/2447
msh210

1

Java, 96 bayt

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;}

Diziyi yerinde değiştirir. Son olayı destekler.

Truthy değerdir 1Falsey değeri ise 0.

Tüm test vakalarını doğrulayın .

Ungolfed:

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

Aslında 11 bayt

;╗ñ`i@╜í=`M

Çevrimiçi deneyin!

Açıklama:

;╗ñ`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 bayt

Kuşkusuz , herhangi bir sıralı tipte herhangi bir standart konteyner üzerinde çalıştığı için aşırı doldurma çözümü :

#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;}

Ungolfed:

(ve ayrıca genelleştirilmiş)

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;
}

Test odası:

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

PHP, 66 62 39 bayt

  • tüm atomik değerleri kabul eder (boolean, integer, float, string)
    false (false, 0, "") ve sayısal dizeleri ("1" 1'e eşittir) olarak değerlendirilen değerler dışında
  • bayraklar ilk oluşum

yeni sürüm (program, 37 + 2 bayt)
Java ve (şimdi tekrar) C # yener. Artık neredeyse Python'u yeniyor. Mutlu.

<?foreach($a as$v)$u[$v]=print$u[$v]|0;
  • PHP için +6> = 5.4, bir işlev için + 16-3
  • ait baskılar undelimited listesi 0(true) ve 1(yanlış)
    insert !sonraprint invert için
  • kullanımı: set register_globals=On, short_open_tags=Onve error_reporting=0içinde php.iniiçin php-cgi
    daha sonra çağrıphp-cgi -f <filename> a[]=<value1> a[]=<value2> ...;echo"" ;
  • PHP için> = 5.4: (+6) $aile değiştirin $_GET[a], ayarlayın short_open_tags=Onveerror_reporting=0
  • veya (+19) $aile değiştirin array_slice($argv,1), kaldırın <?(-2)
    ve arayınphp -d error_reporting=0 -r '<code>' <value1> <value2> ...;echo""

eski sürüm (işlev, 62 bayt)

function f($a){foreach($a as$v)$u[$v]=1|$m[]=$u[$v];return$m;}
  • falsetrue ve truefalse için dizi döndürür ; (boş dize olarak çıkış veya 1) ters çevirdikten sonra
    ekleme!$m[]=
  • 55 bayt ile nitelikli bir işlev için başka bir yol daha var.

testleri (eski sürümde)

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 bayt

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

FalseTrue olarak, Truefalse değeri olarak kullanır :

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

Sen gerekebilir import Data.Listkullanmak tailsancak, tryhaskell.org olduğu gibi kod çalışır.


Dış parantezlere gerek yoktur. \a->[...]uygun bir işlevdir. Şüpheniz varsa, bir ad verin: f a=[...].
nimi

@nimi parantez olmadan arayamazdı. ama adını vermek işe yarıyor, çok teşekkürler.
Ness Ness

Bu ihmalin gerekçesini import Data.Listpek sevmiyorum . a. GHCi yapılandırmanıza herhangi bir miktarda ithalat (hatta tanım!) koyabileceğiniz için çok kaygan bir eğimdir. b. tryhaskell.org'a Haskell dilinin yetkili bir uygulaması olarak davranır, ancak gerçekten bir dil değildir. (? I zamanda istemek tüm ithalat ve tanımlar golfçüler ile gelir kendi deneyin-Haskell-online ortam oluşturmak Yine, böyle mi yine de hala “Haskell”?)
Lynn

Burada bir kez kod olduğu gibi herhangi bir platform varsa, o zaman bu kod kabul edilebilir söylendi. Kuralların tam olarak ne olduğunu bilmiyorum, söylediklerime uyuyorum. Bence evet, eğer siteniz 7/24 mevcutsa ve standart Haskell çalıştırıyorsa, neden olmasın. Ama ilkinde haklısın, kaldırdım. Teşekkürler.
Ness

1

Perl 5 + Perligata , 343 bayt

315 bayt, artı 28 -MLingua::Romana::Perligata

Olarak kullanın perl -MLingua::Romana::Perligata foo.pl; girdi (stdin'den) ve çıktı (stdout'a) ondalık tam sayıların alt çizgi ile ayrılmış dizeleridir. Perligata 0.6 sürümü ile Çilek 5.20.2'de test edilmiştir; Perligata sürüm 0.50 ile çalışıp çalışmadığını bilmiyorum.

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

Açıkçası bu bir çan gibi açık. Değilse, ile çalıştırın-MLingua::Romana::Perligata=converte yerine -MLingua::Romana::Perligatave perlirade yerine komut, çıktılı düzenli Perl tercümeyi çalışan:

 $_ = 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 $_, '_')}

Bir belirteç analizi için kullanın -MLingua::Romana::Perligata=discribe.


Golf ile ilgili notlar:

  • Belgelenmemiş (ama şaşırtıcı olmayan), daha sonra bir alana ihtiyacınız yok . .
  • (Ayrıca şaşırtıcı,) scinde ikinci bir argümana ihtiyaç duymaz ve kullanırhoc .
  • Kullanmak zorundaydım ao aum tum nullum addementum da çünkü alamadımmorde işe .
  • Benzer şekilde kullandım per ium in qis... ro I da çünkü alamadımvanne iş .
  • Bunun yerine huic vestibulo perlegementum dadenedim -pMLingua::Romana::Perligata, ama çalışamadım.

Sadece vuruşlar için (tüm cevap sadece vuruşlar için olmasına rağmen):

  • 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 Translate, temizledikten sonra verir 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..
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.