Виразні сита


17

Давши список цілих чисел, створіть булеву маску таким чином, щоб справжні індекси можна було використовувати для фільтрації різних значень зі списку. Індекс, обраний як істинний, не має значення, доки для кожного набору індексів, що відповідають однаковим значенням, вибрано лише один.

Вхід буде не порожнім списком невід’ємних цілих чисел у форматі, що підходить для вашої мови, а вихід буде списком булевих значень відповідно до вищезазначеної специфікації. Ви можете використовувати власні визначення правдоподібних і хибних значень у списку вихідних даних.

У наведених нижче прикладах я визначаю, що 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 ...

Правила

  • Це тому найкоротше рішення виграє.
  • Вбудовані дозволені!
  • Ви можете використовувати власні визначення правдоподібних і хибних значень у списку вихідних даних. Якщо ви вирішите це зробити, будь ласка, вкажіть свої визначення.
  • Вхід буде не порожнім списком невід’ємних цілих чисел.
  • Ви можете вибирати між виведенням лише одного сита або декількох або навіть усіх. Поки кожне сито діє, воно буде прийняте.

2
Бо [0, 8, 6, 6, 3, 8, 7, 2]чи [1, 0, 0, 1, 1, 1, 1, 1]слід додати до списку дійсних результатів?
атласолог

Чи ваші власні визначення правдивих і хибних значень стосуються мови чи ми можемо вільно вибирати? Чи повинні вони бути послідовними?
Денніс

@atlasologist Дякую, що зловив друкарський помилок
миль

@Dennis Ви можете вільно визначити власні булеві значення, вони не повинні бути такими, як обрана вами мова, але ви повинні відповідати власним визначенням. Замість 1 і 0 для істинних і хибних у моїх прикладах я міг би зробити негативні значення як хибні, так і негативні (нульові або позитивні) значення як істинні.
милі

Добре, дякую за уточнення. Послідовно, я мав на увазі, чи має бути одне значення трититу або якщо їх може бути кілька.
Денніс

Відповіді:


11

MATL, 7 6 4 байти

1 байт збережено завдяки @Luis
2 байти збережено завдяки @Dennis

&=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
ОП роз'яснила, що в цьому виклику означають хитрість і хибність. Якщо ви визначите 1 як простий, а все інше - як хибне, то його можна скинути l=.
Денніс

Прекрасне використання. Наміром було уникнути необхідності додавати крок фільтрування, і тепер ви підібрали рішення Jelnis Jelly.
миль

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.

Хіба це не рубає нулі наприкінці?
Leaky Nun

2
В кінці не може бути нуля, оскільки ми вибираємо останнє виникнення кожного унікального цілого числа.
Денніс

Це розумно.
Leaky Nun

8

Python 3, 47 35 39 36 байт

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

Спливає перший елемент зі списку, перевіряє, чи існує він ще в іншому списку, і вставляє його Trueчи Falseв новий список.

Для цієї функції 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
ОП уточнила, що фактична цінність не обов'язково повинна бути правдою, тому вона також lambda n:[n.pop()in n for x in n*1]працює.
Денніс

Нова версія мене трохи втратила, поки я не зрозумів, що використовує заперечні значення, як xnor робив для правдивих і помилкових.
милі

Вам потрібно зробити .pop(0)або маска вийде перевернутою.
xnor

Це не те, що означав xnor. Спочатку .pop()обробляє останній елемент, тож вони перебувають у зворотному порядку.
Денніс

7

Pyth, 6 байт

.eqxQb

Виводить список булів ( Trueі False). Перевіряє кожен елемент на вході, якщо його індекс дорівнює індексу першого виникнення значення. Іншими словами, це перевірка того, чи кожен елемент є першим.

У пітонічному псевдокоді:

.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-Sieveв J і створює логічний список , який виконує операцію , описаної у виклику. Тут, 1представляє trueі 0представляє false.



4

APL, 6 байт

⍳∘⍴∊⍳⍨

Спробуй це

Пояснення:

   ⍳⍨  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 байти

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

Я також міг би зробити так, щоб він повернув 1 або 0, і тербій зробив параметр і тип повернення тим самим тербієм, що дозволяє мені зробити це вираз лямбда?

деякі вказівки будуть вдячні

код одного типу

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

якщо ви визначите, що truthy має значення 0, а фальшивий - будь-що інше, ви можете замінити == n на -n і повернути інт []
raggy

ось чудова ідея
downrep_nation

також використовуйте функцію bodhed вираження int [] l (Список <int> i) => i.Select ((m, n) => i.IndexOf (m) -n) .ToArray ();
raggy

о, мій Боже, ось тепер заощаджую стільки байтів у моїх відповідях. велике дякую
downrep_nation

Чи можете ви навести приклад на .NetFiddle?
aloisdg переходить на codidact.com

3

Пітон, 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

Математика, 53 31 байт

Завдяки милям за те, що ви дали мені уявити, що зберегли 22 байти.

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

Як щодо використання MapIndexedнад попередніми списками? MapIndexed[s[[;;#-1&@@#2]]~FreeQ~#&,s=#]&займає 41 байт.
миль

@miles Ох, це набагато краще (і я його трохи більше покращив;))
Мартін Ендер

О, це приємний спосіб скоротити MapIndexedцей випадок, і вам навіть не доведеться витягувати або зменшувати індекс
милі

1

Perl 5

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

1. ..надає скалярний контекст, тому вам не потрібно ~~. 2. grepповертає правду / хибність, тому вам не потрібно ?1:0. 3. grep/.../,@aкоротше, ніж grep{/.../}@a. 4. Вам не знадобиться фінал ;. 5. У вас не знадобляться дужки навколо 1..@a. 6. Ви не показуєте, куди надходить вхід або збирається вихід: див. Meta.codegolf.stackexchange.com/q/2447
msh210

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

Змінює масив на місці. Віддає перевагу останньому явищу.

Ціннісна цінність - 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

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

PHP, 66 62 39 байт

  • приймає всі атомні значення (булеві, цілі числа, плаваючі, рядкові),
    за винятком значень, що оцінюються на помилкові (хибні, 0, "") та числові рядки ("1" дорівнює 1)
  • перші прапори

нова версія (програма, 37 + 2 байти)
перемагає Java і (зараз знову) C #. Навіть майже б'є Python зараз. Щасливі.

<?foreach($a as$v)$u[$v]=print$u[$v]|0;
  • +6 для PHP> = 5,4, + 16-3 для функції
  • друкує невизначений список 0(true) та 1(false)
    вставки !після printінвертування
  • використання: встановити register_globals=On, short_open_tags=Onі error_reporting=0в php.iniпротягом php-cgi
    потім викликуphp-cgi -f <filename> a[]=<value1> a[]=<value2> ...;echo"" ;
  • для PHP> = 5.4: замініть $aна $_GET[a](+6), встановіть short_open_tags=Onіerror_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;}
  • повертає масив falseдля true та truefor false; (випустити як порожній рядок або 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так і хибне значення:

λ> 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.List. а. це дуже слизький схил, оскільки ви можете поставити будь-яку кількість імпорту (або навіть визначення!) у своєму конфігурації GHCi. б. розглядає tryhaskell.org як авторитетну реалізацію мови Haskell, але насправді це не одна. (Знову ж таки, що, якщо я створити власне онлайн-пробне Haskell-середовище, яке поставляється з усіма імпортами та визначеннями гравців, яких можна було б хотіти? Це все-таки справді "Haskell"?)
Лінн

Мені одного разу сказали, що якщо є якась платформа, яка працює таким кодом, то цей код є прийнятним. Я не знаю, які точні правила, я переходжу до того, що мені кажуть. Я думаю, що так, якщо ваш сайт доступний цілодобово і працює стандартний Haskell, чому б ні. Але ти маєш рацію щодо першого, я його зняв. Спасибі.
Буде Несс

1

Perl 5 + Perligata , 343 байт

315 байт, плюс 28 для -MLingua::Romana::Perligata

Використовувати як perl -MLingua::Romana::Perligata foo.pl; input (від stdin) та output (to stdout) - це рядки, розділені підкресленням, з десяткових цілих чисел. Тестували на Полуниці 5.20.2 з версією 0.6 Perligata; Я не знаю, чи працює це з версією 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 не потрібен другий аргумент і використовуєтьсяhoc .
  • Мені довелося користуватися ao aum tum nullum addementum da тому що я не міг дістатиmorde до роботи.
  • Точно так само я і використовував per ium in qis... ro I da тому що не міг потрапитиvanne до роботи.
  • Замість цього 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 Translate 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..
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.