Які примари відсутні?

У цьому виклику, з огляду на список примар від Pac-Man, ви повинні вивести, які примари відсутні. Ви повинні зробити це в кілька байт, як можете

Вхідний

Вхідний will consist of a string or list, which will include a number ghosts, which could include;

  • Blinky
  • чорнило
  • Pinky
  • Клайд

However, Вхідний may also include Pac-Man (with that punctuation). So, the maximum amount of items in a list will be five, in any order. It can be assumed that no invalid items will be in the list

Output

Output will consist of a string, or list. This will include of all the ghosts that are not in the Вхідний, in any order. However, if Pac-Man is in the Вхідний, all ghosts will be considered missing (because he eats them).

Test cases

Вхідний: Clyde
output: Blinky, Inky, Pinky
alternate output: Inky, Pinky, Blinky
or one of the other 4 permutations

Вхідний: Clyde, Blinky # or however you delimit it
output: Inky, Pinky
alt: Pinky, Inky

Вхідний: Pac-Man, Clyde
Output: Blinky, Inky, Pinky, Clyde
or you could output one of the other 23 permutations

Вхідний:[null]
Output: Blinky, Inky, Pinky, Clyde
or you could output one of the other 23 permutations

This is codegolf, so the lower the bytecount, the better.

25
Чи формати введення та виводу строго строкових типів, чи ми можемо використовувати список? Специфікації говорять, що вони рядки, але потім вони називаються списками.
додано Автор Ryan, джерело
Чи не помиляється вихід з Pac-Man? ти можеш уточнити? Дякую
додано Автор boxoft, джерело
це порожня рядок.
додано Автор Kevin Laity, джерело
Ні, він не буде, Мега Людина
додано Автор Kevin Laity, джерело
Це такий зворотний зв'язок, який я хотів у пісочниці: \. Я не знаю, чи змінити це зараз, коли люди відповіли. Я називаю їх списками, оскільки рядок містить елементи, відформатовані як список. Ви, мабуть, матимете краще уявлення про те, що робити. Ви можете редагувати його, якщо це правильний вибір
додано Автор Kevin Laity, джерело
В цілому це перша велика задача. Хороша робота!
додано Автор Alex A., джерело
Загальний консенсус полягає в тому, що слід уникати громіздких/суворих форм введення та виведення . Розбивання і приєднання слів лише робить код довшим, і це дійсно не додає нічого основного завдання.
додано Автор Dennis, джерело
Чи буде Pac-Man завжди першим у вході?
додано Автор Mega Man, джерело
Те ж саме. Лол а
додано Автор Christopher, джерело
Якщо жодних примар не існує, чи вводиться порожня рядок, або [null] ?
додано Автор user1783544, джерело

11 Відповіді

Retina, 45 bytes

A`-
$
,;BliNClyde,INPiN
N
nky,
D`\w+,
.*;|,$

Позахідний лінійний харчування є значним. Вхід і вивід розділені комами.

Try it online! (The first line enables a linefeed-separated test suite.)

Пояснення

Я не очікував, що зможу показувати останнє додавання Retino (етапи дедупликації) так скоро, але це дійсно корисно для цього виклику. :)

Етап 1: антигрип

A`-

Anti-grep stages discard all lines that match the given regex. The regex is just - and the input is always a single line, so this discards all ghosts if the input contains Pac-Man.

Stage 2: Substitution

$
,;BliNClyde,INPiN

This simply appends the fixed string ,;BliNClyde,INPiN. This will be the list of ghosts in the output after some clean-up.

Стадія 3: Заміна

N
nky,

Зверніть увагу, що ми написали трьох * nky примарів з N на попередньому етапі (і після них було виключено комою), і ми розширимо цю стенографію, яка економить пара байт. За кожним примаром тепер є кома, і у нас є вхідні примари та список всіх примар, розділених точкою з комою.

Етап 3: дедуплікація

D`\w+,

Це нова частина. Етапи дедупликації містять всі екземпляри даного регулярного виразу та відкидають всі підрядки, що співпадають, які дорівнюють раніше підібраній підрядці. Регулярний вираз просто збігається з усіма примарами як у вводі, так і в списку потенційних виходів. Якщо вхід містить привид, то той же привид буде знову збігатися з другим списком і відкидається. В іншому випадку привид вперше буде зіставлений у другому списку і зберігається. Тому після цього список після крапки з крапкою - наш бажаний результат. Все, що залишилося, трохи почистить:

5 етап: заміщення

.*;|,$

Ми просто підбираємо все до крапки з комою, а також комою в кінці рядка та видаляємо їх.

15
додано
@ KevinLau-notKenny Подивіться пояснення першого етапу.
додано Автор Marc, джерело
Як щодо випадку Pac-Man?
додано Автор Value Ink, джерело

JavaScript ES6, 85 78 байт

Як анонімна функція

a=>["Blinky","Inky","Pinky","Clyde"].filter(c=>!a.includes(c)|a.some(v=>v[6]))

Сьогодні я дізнався про цю функцію filter . Весело!

15 байтів збережено завдяки Нейлу.

Використання:

(a=>["Blinky","Inky","Pinky","Clyde"].filter(c=>!a.includes(c)||a.includes("Pac-Man")))(["Pac-Man"])
> ["Blinky","Inky","Pinky","Clyde"]
(a=>["Blinky","Inky","Pinky","Clyde"].filter(c=>!a.includes(c)||a.includes("Pac-Man")))(["Pinky"])
> ["Blinky","Inky","Clyde"]
(a=>["Blinky","Inky","Pinky","Clyde"].filter(c=>!a.includes(c)||a.includes("Pac-Man")))([])
> ["Blinky","Inky","Pinky","Clyde"]
6
додано
@apsillers О, це чудово, ніколи б не думав перевірити довжину. Я змінив побітовий або і додав, що спасибі!
додано Автор Matthew McCullough, джерело
@Нелі Велика ідея. Я зміг вирізати return і () і зберегти тону байт, дякую!
додано Автор Matthew McCullough, джерело
Я думаю, що ви можете додати його як a.includes ("Pac-Main"), а не спеціальний корпус Pac-Man . ||. A.includes (c) у фільтрі, у якому ви маєте лише одне використання g , і тому може вбудовувати його і перетворити ваш блок у вираз, таким чином уникнути заяви return .
додано Автор Luke Bennett, джерело
Ви також можете зберегти один байт, замінивши свої виклики на a.includes з a [z = "includes"] (спочатку) і a [z] (другий). Крім того, я думаю, що ви можете зберегти інший байт, використовуючи побітовий АБО ( | ) на логічні результати замість логічного OR ( || ).
додано Автор apsillers, джерело
Насправді, оскільки Pac-Man - це найдовший можливий ввід (і недійсні входи неможливі), ми можемо перевірити існування сьомого символу для тестування на Pac-Man : c =>! a.includes (c) || ​​a.some (v => v [6]) . Використовуючи це за допомогою побітового АБО, оцінка дорівнює 78.
додано Автор apsillers, джерело

Jelly, 25 22 bytes

Ff”-ȯ⁸“JLKqḤṢ&F⁻ı»ṣ⁶¤ḟ

This is a monadic function. I/O is in form of lists. Try it online!

Як це працює

Ff”-ȯ⁸“JLKqḤṢ&F⁻ı»ṣ⁶¤ḟ  Monadic link. Argument: A (list of strings)

F                       Flatten A.
 f”-                    Filter it with the string "-" to detect "Pac-Man".
    ȯ⁸                  Flat logical OR with A. This yields A if there is no '-'
                        in the input, the string "-" otherwise.
                    ¤   Combine the three links to the left into a niladic chain.
      “JLKqḤṢ&F⁻ı»        Yield "Blinky Inky Pinky Clyde", using Jelly's built-in
                          English dictionary.
                  ṣ⁶      Split at spaces to yield
                          ["Blinky", "Inky", "Pinky", "Clyde"].
                     ḟ  Filter-false; removing all elements from that list that
                        appear in A or "-". This is a noop if A contains "Pac-Man".
3
додано
За замовчуванням, що поставляється з моєю ОС. Pinky означає маленький палець iirc, тому він повинен бути присутнім у більшості словників. Мені довелося побудувати Blinky як B + linky , хоча. Не впевнений, що таке посилання ...
додано Автор Dennis, джерело
У якому словнику ви користуєтеся тим, у кого є "Pinky" тощо? XD
додано Автор Conor O'Brien, джерело

Perl, 51 байт

50 байт для коду + 1 для -n

[email protected](Blinky,Inky,Pinky,Clyde){[email protected]/-/|!/[email protected]/}g}

Використання

perl -ne '[email protected](Blinky,Inky,Pinky,Clyde){[email protected]/-/|!/[email protected]/}' <<< 'Pac-Man, Clyde'
BlinkyInkyPinkyClyde

Я можу внести зміни до виводу, якщо потрібно, додавши пробіл після кожного примату, для + 3 байтів замінивши print $ @ з print <$ @> .

-6 байтів завдяки @MartinEnder !


Perl, 53 bytes

51 байт код + 2 для -na

Альтернативне рішення, за допомогою оператора smartmatch:

print grep/-/[email protected]|!([email protected]),Blinky,Inky,Pinky,Clyde

Використання

Потрібно розділений пробілом список вхідних даних:

perl -nae 'print grep/-/[email protected]|!([email protected]),Blinky,Inky,Pinky,Clyde' <<< 'Clyde Pinky Inky'
Blinky
perl -nae 'print grep/-/[email protected]|!([email protected]),Blinky,Inky,Pinky,Clyde' <<< 'Clyde Pinky Inky Pac-Man'
BlinkyInkyPinkyClyde'
3
додано

C 171 байт

Пропустіть масив рядків NULL на f() , і він надрукує відсутні імена.

*a[]={"Blinky","Inky","Pinky","Clyde",0},**s,**r,n;f(int**p){for(r=p;*p;)r=strcmp(*p++,"Pac-Man")?r:a+4;for(s=a;*s;++s){for(p=r,n=1;n&&*p;)n=strcmp(*s,*p++);n&&puts(*s);}}

Спробуйте це на ideone.

3
додано

Ruby, 55 49 байт

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

-6 байтів від @MartinEnder

->a{%w"Blinky Inky Pinky Clyde"-(a*''=~/-/?[]:a)}

Рубінові масиви можуть піддаватися встановленому віднімання, що дозволяє дуже легко видалити відповідні примари.

3
додано
Як це стосується Pac-Man?
додано Автор Luke Bennett, джерело
@ Не приєднується до масиву, використовуючи a * '' і regex - порівнює його з - у назві Pac-Man . Якщо вона присутня, вона нічого не віднімає від списку привидів, а якщо ні, то вона віднімає список вхідних (таким чином, кожен елемент у списку вхідних даних буде видалений зі списку примар)
додано Автор Value Ink, джерело

Pyth - 45 38 35 Bytes

=GwI!:G"a")j-["inky""pinky""blinky""clyde")cG
I!:=Gw"a")j-c:" p bl clyde"d"inky "dcG
j-c:" p bl clyde"d"inky "d?:z\aZYcz

Ще 1,1 байт завдяки витікаючій Нуну!

Вхідний сигнал повинен бути пробілами, усі літери; виводи відсутніх примар на окремих рядках, якщо пак-людина знаходиться на вході.

3
додано
} \ az також перевіряє, чи z містить літеру a . 1 байт коротше
додано Автор Jakube, джерело
@JacquesMarais Моя помилка. Виправлено.
додано Автор KoreanwGlasses, джерело
@JacquesMarais Ні, це працює. The: z \ a виявляє, чи на вході є "a", і на вході iff з'явиться "a", pac-man знаходиться на вході
додано Автор KoreanwGlasses, джерело
Я натиснув Pyth , і він не працював, коли я ввів" Pac-Man ". Коли вводиться "Pac-Man", він повинен показувати всі імена, а не їхні жодні з них.
додано Автор Jacques Marais, джерело
Ви забули "Pac-Man"
додано Автор Jacques Marais, джерело

Python 2, 66 61 96 байт

g={"Blinky","Inky","Pinky","Clyde"};i=set(input());print",".join(g-i if not"Pac-Man"in i else g)

Вхідний файл повинен бути списком, вихідний - це рядок імен, розділених , .

61 байт версія, яка не обробляє Pac-Man:

print",".join({"Blinky","Inky","Pinky","Clyde"}-set(input()))
2
додано
Pac-Man не обробляється в цьому вході.
додано Автор Kevin Laity, джерело
Вам не потрібні set [...] . Просто використовуйте {...} встановлену літературу.
додано Автор Dennis, джерело
Я дійсно не помітив речі Pac-Man, навіть прочитавши цей випадок 3 рази ... Я виправив свій код.
додано Автор acrolith, джерело

05AB1E, 47 44 байтів

•1g!Z~÷kÅ]°%Ï0›K/•35B0¡™svy'-åi,q}}v¹ykÌiy)˜

Пояснення

•1g!Z~÷kÅ]°%Ï0›K/•35B0¡™                      # push list of the 4 ghosts
                        svy'-åi,q}}           # if Pac-Man is in input, quit and output list of all 4 ghosts
                                  v¹ykÌiy)˜   # otherwise, generate the list of ghosts missing from input

Try it online

2
додано

Haskell, 91 байт

import Data.List
p l=(if elem"Pac-Man"l then id else(\\l))["Blinky","Inky","Pinky","Clyde"]

Вхід - це список рядків. Він вирішує, чи використовувати список як такий, або зробити різницю в списку, залежно від присутності "Pac-Man".

Для додаткової забави, тут немає Pac-Man:

import Data.List
(["Blinky","Inky","Pinky","Clyde"]\\)

Скоріше буде покращувати цю відповідь, чи пізно вночі.

2
додано

PHP програма, 84 байти

<?print_r(array_diff([Blinky,Inky,Pinky,Clyde],in_array('Pac-Man',$argv)?[]:$argv));
  • приймає аргументи з командного рядка, друкує результат як масив.
  • ім'я файлу не повинно бути жодним з привидів або "Pac-Man"!
  • короткий розподіл: видалити (якщо "Pac-Man" знаходиться в аргументах: нічого, інакше всі аргументи) з усіх примар; Результат друку рекурсивно

приклади:

>php -d error_reporting=0 ghosts.php Clyde
Array
(
    [0] => Blinky
    [1] => Inky
    [2] => Pinky
)
>php -d error_reporting=0 ghosts.php Clyde Blinky
Array
(
    [0] => Inky
    [1] => Pinky
)
>php -d error_reporting=0 ghosts.php Pac-Man Clyde
Array
(
    [0] => Blinky
    [1] => Inky
    [2] => Pinky
    [3] => Clyde
)

Функція PHP, 90 байт

function p($a){return array_diff([Blinky,Inky,Pinky,Clyde],in_array('Pac-Man',$a)?[]:$a);}

приймає і повертає масив, використовуйте порожній масив для порожнього вводу, ніякого іншого фальшивого значення!

подальші думки

  • replace in_array(...) with strstr(join($argv),'-') to detect - instead of Pac-Man (-2)
  • use ereg('-',join($argv)) instead (another -2)
  • program could lose another 6 bytes in PHP<5.4 with register_globals on
  • to make the program print a comma-separated list: replace <?print_r( with <?=join(',', (+2). You may want to add ;echo"" to the call for a line break
1
додано