Сваха, сваха, сделай мне спичку

21

(мы не будем находить Findили ловить tryCatch, хотя)

Это вторая часть серии из нескольких частей реализации некоторых интересных R-функций. Часть первая можно найти здесь .

Задание:

Вы должны реализовать функцию Rmatch как можно меньше байтов.

Входные данные:

  • xвозможно пустой список / массив целых чисел
  • tableвозможно пустой список / массив целых чисел
  • nomatchодно целое значение
  • incomparablesвозможно пустой список / массив целых чисел

Выход:

  • один массив / список целых чисел Oравной длины x, где каждое значение O[i]представляет либо:
    • Индекс jот первого значения в tableкоторомtable[j]==x[i]
    • nomatch, указывая, что никакое значение в tableне равно x[i] ИЛИ, который x[i]находится в списке incomparables.

Тестовые случаи

All in the form x, table, nomatch, incomparables -> output
outputs 

[], [1,2,3], 0, [5] -> []

[1, 2, 3], [], 0, [5] -> [0, 0, 0]

[9, 4, 3, 6, 3], [9, 8, 7, 6, 5, 4, 3, 2, 1], -1, [4] -> [1, -1, 7, 4, 7]

[8, 6, 7, 5, 3, 0, 9], [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6, 2, 6], 1000, [1] -> [12, 8, 14, 5, 1, 1000, 6]

При необходимости можно создавать больше тестовых случаев.

Дополнительные правила:

  • R имеет индексы на основе 1, но приемлемы последовательные альтернативные индексы. Таким образом, вы можете использовать индексы, которые начинаются с 3 или 17 или как угодно, но это должно быть согласовано, и вы должны указать это в своем ответе.
  • Если у выбранного вами языка есть встроенная функция, которая делает это, пожалуйста, также внедрите свое собственное решение.
  • Пояснения приветствуются.

Это , поэтому выигрывает самое короткое решение в байтах!

Giuseppe
источник
Должен ли он поддерживать отрицательные числа? Я предполагаю, что в этом нет необходимости, так как только пример предполагает это, и я почти уверен, что есть стандартное правило для этого.
wizzwizz4
@ wizzwizz4 нет, потому что 4в incomparables, так что это не может быть сопоставлено. Если ваш язык не может поддерживать отрицательные числа, тогда можно потребовать неотрицательные числа, но укажите это предположение в своем представлении.
Джузеппе
1
Дополнение к заголовку комментария: мы тоже не будем делать make.
Вэл говорит восстановить Монику
1
@val, на самом деле это довольно плохая ссылка на Фиддлера на крыше ; все эти испытания были названы тематическими после различных выставок, потому что этот подходит так идеально, что я подумал, что он станет хорошей темой.
Джузеппе

Ответы:

8

Желе ,  10  8 байт

-2 благодаря Эрику Аутгольферу

,⁷y⁵iⱮ⁶o

Полная программа, принимающая четыре аргумента командной строки, incomparables nomatch table xкоторая печатает представление Jelly * списка matchрезультатов функции R.

Попробуйте онлайн!

Как?

например, с incomparables nomatch table x= [1,4], 2, [2,4], [4,3,2,1,0]:

,⁷y⁵iⱮ⁶o - Main Link: list, incomparables; list, nomatch
 ⁷       - newline character                                '\n'
,        - pair (incompararables) with (right)              [[1,4],'\n']
   ⁵     - 5th argument (3rd input = table)                 [2,4]
  y      - translate (right) with lookup (left)             [2,'\n']             
      ⁶  - 6th argument (4th input = x)                     [4,3,2,1,0]
     Ɱ   - map with:
    i    -   first index of (right) in (left)               [0,0,1,0,0]
       o - logical OR                                       [2,2,1,2,2]

* Пустой список представлен как ничто, список длиннее представлен как просто элемент, в то время как другие списки заключены в []и разделены,

Джонатан Аллан
источник
6

R , 55 байт

В этом случае код не использует matchего с полной функциональностью, он просто используется как indexфункция. Первый ответ R, так что, вероятно, невероятно неэффективно!

Примечание (спасибо Giuseppe за информацию) : %in% и setdiffоба они реализованы внутриmatch , поэтому полное избавление от этой удивительно полезной функции приведет к путанице . Таким образом, есть награда в 150 представителей без крайнего срока для этого! (обратите внимание, что setdiffэто разрешено, хотя)

function(x,t,n,i)ifelse(x%in%setdiff(t,i),match(x,t),n)

Попробуйте онлайн!

или...

R , 5 байт

match

Попробуйте онлайн!

Мистер Xcoder
источник
Я не уверен, что смог бы добиться большего успеха, хотя я отказался от использования %in%и match; если вы хотите найти хороший ответ для игры в гольф без какой-либо из этих функций (вероятно, это будет ужасно), я щедро вознагражу это.
Джузеппе
Ах, лол, я только что прокомментировал в GolfR об этом ...
Мистер Xcoder
Голосовали исключительно за язвительное matchподчинение
наказано
Вы можете сократить ifelseэтот совет: codegolf.stackexchange.com/a/97826/59530
JAD
2
Кроме того, ваше более длинное представление на самом деле использует match: S
JAD
4

Python 3 , 60 байт

lambda x,t,n,i:[v in{*t}-{*i}and-~t.index(v)or n for v in x]

Попробуйте онлайн!

Мистер Xcoder
источник
Какие особенности этого специфичны для 3.8? Похоже, это может работать для любой подрывной деятельности в Python 3.
Тео
Ну, это не специфично для 3.8. Я просто скопировал автоматически сгенерированный шаблон на TIO, поэтому я не заметил, что использовал 3.8. Спасибо за хедз-ап, наладим.
г-н Xcoder
1
R has 1-based indices, but a consistent alternative-based indices are acceptable.Таким образом, вы можете удалить -~и использовать 0-индексирование для -1 байта.
Стоимость чернил
1
@ValueInk Сбой для 3-го тестового примера (и в целом, когда соответствующий элемент находится в начале списка), так как 0 в Python ложно.
г-н Xcoder
1
Ах, честное шоу. Между прочим, t.index(v)if v in{*t}-{*i}else nимеет точно такой же байтовый счет, что и ваше текущее v in{*t}-{*i}and-~t.index(v)or nрешение, хаха
Value Ink
3

Perl 6 , 45 байт

->\b,\c,\d{*>>.&{$_d&&~b.first($_,:k)||c}}

Попробуйте онлайн!

Блок анонимного кода, который принимает ввод curry, like f(table, nomatch, incomparables)(x)и возвращает индексированные совпадения 0.

Объяснение:

->\b,\c,\d{                               }    # Anonymous code block taking 3 inputs
           *           # Return an anonymous Whatever lambda
            >>.&{                        }  # Mapping input to
                 $_d                       # If the element is not an uncomparable
                     && b.first($_,:k)      # Return the first index in the table
                       ~                    # Stringified so Nils are false
                                      ||c   # Else the nomatch element
~~
Джо Кинг
источник
+1 Я работал над этим кратко, но делал $_∉d&&b.antipairs.Map{$_}||cто, что работало бы хорошо, но при значении Falsey, равном 0. Первое ($ _: k) - отличное решение, позволяющее избежать длинных антипар. Принуждение к карте.
user0721090601
2

Древесный уголь , 14 байтов

IEθ∨∧¬№ει⊕⌕ηιζ

Попробуйте онлайн! Ссылка на подробную версию кода. 1-индексироваться. Объяснение:

  θ             First input (x)
 E              Map over elements
       ε        Fourth input (incomparables)
      №         Count occurrences of
        ι       Current element
     ¬          Is zero
    ∧           Logical And
           η    Second input (table)
          ⌕     Find 0-based index of
            ι   Current element
         ⊕      Convert to 1-indexed
   ∨            Logical Or
             ζ  Third input (nomatch)
I               Cast to string
                Implicitly print on separate lines
Нил
источник
2

C (gcc) , 125 байт

1-индексироваться.

Учитывая, что я не могу использовать значение Sentinel в переданных массивах, мне нужно дать границы массивов для каждого массива.

f(x,c,t,d,n,i,e,j,f)int*x,*t,*i;{for(;f=0,c-->0;x[c]=--f?n:j){for(j=e;!f&j;x[c]-i[--j]||--f);for(;!f&j<d;x[c]-t[j++]||++f);}}

Попробуйте онлайн!

ErikF
источник
2

Атташе , 39 байт

${{[_,y][nil=_or x@_in z]}=>x&Index@_4}

Попробуйте онлайн!

Довольно простая проверка. Обратите внимание, что порядок аргументов отличается от порядка соответствия; в частности, xявляется последним аргументом, а не первым, и соответствует _4приведенному фрагменту.

объяснение

${{[_,y][nil=_or x@_in z]}=>x&Index@_4}
${                                    }   named lambda, taking parameters x, y, z, and _4
                            x&Index@_4    short for Index[x, _4];
                                              calculates where each element in _4 occurs in x
                                              returns `nil` for no match
  {                      }=>              over each index:
   [_,y][               ]                     choose y (`nomatch`) if
         nil=_                                    the index is nil
              or x@_in z                          or the element is in `incomparables`
    _                                         otherwise, choose the index
Конор О'Брайен
источник
2

05AB1E , 7 байтов

õ:Ik®I:

0 индексированные. Входы в следующем порядке: incomparables, table, x, nomatch.

Попробуйте онлайн.

Объяснение:

õ:       # Replace all values of the (implicit) first incomparables-list in
         # the (implicit) second table-list with an empty string
         #  i.e. incomparables=[4] and table=[9,8,7,6,5,4,3,2,1] → [9,8,7,6,5,"",3,2,1]
  Ik     # Get the index of each value in the third x-list in this list (-1 if not found)
         #  i.e. x=[9,4,3,6,3] → [0,-1,6,3,6]
    ®I:  # Replace all -1 with the fourth input-integer
         #  i.e. nomatch=-99 → [0,-99,6,3,6]
         # (and output the mapped list implicitly as result)
Кевин Круйссен
источник