Сваха, свата, зробіть мені сірник


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 або що завгодно, але це повинно бути послідовно, і ви повинні вказати це у своїй відповіді.
  • Якщо ви вибрали мову, яка має це вбудована версія, будь ласка, також реалізуйте власне рішення.
  • Пояснення цінуються.

Це , тому найкоротше рішення в байтах виграє!


Чи повинен він підтримувати негативні числа? Я припускаю, що це не потрібно, оскільки тільки приклад передбачає це, і я впевнений, що для нього є стандартне правило.
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

Спробуйте в Інтернеті!


Я не впевнений, що міг би зробити краще, хоча я ухилявся від використання %in%та match; якщо ви хочете знайти гарну відповідь без жодної з цих функцій (швидше за все, це буде жахливо), я з цим поблажую.
Джузеппе

Ах хаха , я щойно прокоментував у GolfR про це ...
Містер Xcoder

Upvoted виключно для елегантного matchуявлення
Punintended

Можна скоротити, 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]

Спробуйте в Інтернеті!


Які особливості цього властиві 3,8? Мені здається, що це може працювати для будь-якої диверсії Python 3.
Theo

Ну, це не специфічно для 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}}

Спробуйте в Інтернеті!

Блок анонімного коду, який приймає вхід з викривленням, як 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що працював би добре, але за значення фальси 0. Перший ($ _: k) - це чудове рішення, що дозволяє уникнути тривалого антипару.
користувач0721090601

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-індексований.

Зважаючи на те, що я не можу використовувати дозорне значення у пройдених масивах, мені потрібно вказати межі масиву для кожного масиву.

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

Спробуйте в Інтернеті!


2

Attache , 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.