Отдельные сита

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]быть добавлены в список допустимых результатов?
атласолог
Имеет собственные определения truthy и falsy значений относятся к языку , или мы можем свободно выбирать? Должны ли они быть последовательными?
Деннис
@atlasologist Спасибо за ловить опечатку
мили
@Dennis Вы можете сами определять свои логические значения, они не обязательно должны совпадать с выбранным вами языком, но вы должны соответствовать вашим собственным определениям. Вместо 1 и 0 для true и false в моих примерах я мог бы сделать отрицательные значения как false, а неотрицательные (ноль или положительные) значения как true.
миль
ОК, спасибо за разъяснения. Под последовательным я имел в виду, должно ли быть одно истинное значение или может быть несколько.
Деннис

Ответы:

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
Suever
источник
На 1 байт меньше:&=Rs1=
Луис Мендо
@ LuisMendo Ха, я буквально просто играл с таким подходом!
Suever
2
ОП разъяснила, что означает правдивость и ложь в этом вызове. Если вы определяете 1 как правдивое, а все остальное как ложное, вы можете отбросить l=.
Деннис
Отличное использование. Намерение состояло в том, чтобы избежать добавления шага фильтрации, и теперь вы подходите к решению Dennis '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.
Деннис
источник
Разве это не отрубит нули в конце?
Утренняя монахиня
2
В конце не может быть ноля, потому что мы выбираем последнее вхождение каждого уникального целого числа.
Деннис
Это умно.
Утренняя монахиня
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)]

Попытайся

atlasologist
источник
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

Выводит список bools ( 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

Проверьте это здесь.

busukxuan
источник
6

J , 2 байта

~:

Это было то, откуда идея для этого вызова возникла. Встроенный ~:вызывается Nub-Sieveв J и создает логический список, который выполняет операцию, описанную в вызове. Здесь 1представляет trueи 0представляет false.

миль
источник
6

05AB1E , 8 байтов

Код:

v¹ykN>Qˆ

Объяснение:

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 . Попробуйте онлайн! ,

Аднан
источник
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
Woofmao
источник
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();
    }
downrep_nation
источник
если вы определяете truey как 0, а falsy как что-либо еще, вы можете заменить == n на -n и вернуть int []
raggy
это отличная идея
downrep_nation
также используйте выражение bodied function int [] l (List <int> i) => i.Select ((m, n) => i.IndexOf (m) -n) .ToArray ();
грязный
Боже мой, это спасает так много байтов в моих ответах отныне. Большое спасибо
downrep_nation
Можете ли вы привести пример на .NetFiddle?
aloisdg переходит на codidact.com
3

Python, 35 байт

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

Пользы True как ложное значение иFalse истинное значение. Отмечает последнее появление каждого элемента.

Выбирает первый элемент, только если он не отображается среди оставшихся элементов, а затем возвращается к остальной части списка, если он не пуст. l.pop(0)Извлекает первый элемент , а также его удаления.

XNOR
источник
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
AdmBorkBork
источник
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);
Kaundur
источник
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.

Проверьте все тестовые случаи .

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

На самом деле, 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
Mego
источник
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;}

Ungolfed:

(и далее обобщено)

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

скрипка

t-clausen.dk
источник
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;
  • +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 и trueдля 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>';
Titus
источник
1

Haskell, 29 27 байт

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

Используется Falseкак true, Trueкак false:

λ> 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 не может назвать это без скобок. но дать ему имя работает, спасибо большое.
Уилл Несс
Мне не очень нравится это оправдание исключения import Data.List. а. это очень скользкий путь, так как вы можете поместить любое количество импорта (или даже определения!) в вашу конфигурацию GHCi. б. рассматривает tryhaskell.org как авторитетную реализацию языка Haskell, но на самом деле это не так. (Опять же, что, если я создам свою собственную онлайн-среду try-Haskell, которая поставляется со всеми импортами и определениями, которые гольфисты могут когда-либо захотеть? Это все еще действительно «Haskell»?)
Линн
Мне здесь однажды сказали, что если есть какая-либо платформа, которая выполняет код как есть, то этот код является приемлемым. Я не знаю, какие именно правила, я следую тому, что мне говорят. Я думаю, что да, если ваш сайт доступен 24/7 и работает на стандартном Haskell, почему бы и нет. Но вы правы насчет первого, я его убрал. Благодарю.
Уилл Несс
1

Perl 5 + Perligata , 343 байта

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

Использовать как perl -MLingua::Romana::Perligata foo.pl; input (from stdin) и output (to stdout) - это разделенные подчеркиванием строки десятичных целых чисел. Протестировано на Strawberry 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..
msh210
источник