На тему клавіатур


15

Продовжуйте говорити і ніхто не вибухає - це локальна багатокористувацька гра, в якій один гравець має контроль над віртуальною «бомбою», і повинен керуватися іншим гравцем, «експертом», який має доступ до посібника з заборони бомб. Одним із модулів, які потрібно обеззброїти в грі, є модуль клавіатури, саме з цим ми будемо мати справу у цьому виклику.

Завдання

Введення почнеться з одного рядка друкованих символів ASCII, за винятком пробілу (0x21 до 0x7E). Вони представляють видимі вам кнопки клавіатури.

Наступні рядки представлятимуть "ключі" - лише один рядок буде містити всі символи першого рядка, не обов'язково в порядку. Ваше завдання - вивести символи клавіатури у порядку відповідного рядка клавіш.

Наприклад, якщо вхід був

5~Fy
HrD7K!#}
Ui%^fHnF
)Tf;y~I5
~Fi(&5gy
,'Xd#5fZ

то клавіатура кнопки 5, ~, Fі y. Тільки 4-й рядок клавіш ~Fi(&5gyмістить усі ці символи, тому ми виводимо символи клавіатури в тому порядку, в якому вони відображаються, тобто ~F5y.

Правила та роз’яснення

  • Вхід повинен бути єдиним багаторядковим рядком, а кнопки клавіатури та клавіші на окремих рядках.
  • Буде рівно один рядок клавіш, який містить усі символи клавіатури.
  • Кожен рядок, тобто початкова лінія клавіатури та наступні рядки клавіш, не матимуть жодних повторюваних символів.
  • На відміну від гри, ви можете не припускати нічого про кількість символів клавіатури, довжину кожного клавішного рядка або кількість ключових рядків. Однак гарантується, що всі ключові лінії однакової довжини.
  • Вихід може містити один необов'язковий кінцевий новий рядок. Аналогічно, ви можете припустити будь-який спосіб щодо необов'язкового зворотного нового рядка на вході, але, будь ласка, вкажіть у своїй відповіді, якщо вам потрібно припущення.
  • Хоча це вже здається звичайною практикою , я чітко зазначу: закінчення з помилкою нормально для цього виклику, якщо STDOUT вихід правильний (якщо це обрана форма виводу). Сподіваємось, це полегшить обробку даних.

Тестові справи

7
4?j01C3"ch
KP.OG>QB)[
z#)Kn"I2&.
]#,D|sBFy5
Qzj*+~7DLP

Вихід: 7 . Лише останній рядок містить а 7.

0b~
Ob+hy{M|?;>=dtszPAR5
*8rCfsw|3O9.7Yv^x>Hq
$ip.V@n}|La:TbIt^AOF
jZ[Ec4s0|%b*$id',~J6
z*#b}-x$Ua&!O2;['T+?
NVj_X8rlhxfnS\.z}];c
bykscf.w^dnWj+}-*2g_
VP`AJH|&j5Yqmw/"9IMc

Вихід : 0b~. 4-й рядок ключів вже містить символи в потрібному порядку.

MTuz
bIAr>1ZUK`s9c[tyO]~W
oMGIi/H&V"BeNLua%El=
j*uYbplT:~);BM|_mPZt
Q}z5TC@=6pgr<[&uJnM%
YOA(F~_nH6T{%B7[\u#5
y&t"8zQn{wo5[Idu4g:?
[0tZG"-fm!]/|nqk,_2h
dA&C.+(byo6{7,?I}D@w

Вихід : zTuM. Ключовий рядок - 4-й, хоча 3-й ключовий рядок - це близький промах.

o@nj<G1
f]?-<I6h2vS*%l=:}c8>LK5rMdyeon,;sE[@m(73
ibhp+2Hq6yKzIf_Zo}EO3-[*0/e&Fvd]wQU=|%`C
;}>d'cg~CPtQG&%L\)MUl419bkTZ7@]:[*H"RyYj
L^<:zXJ#kj$EFlwN%B`Dd,Cs?]xRZ*K9-uQ.@&f+
i1v'7:90R-l}FMxj`,DTWK+(n32Z4Vs[p@%*eS!d
B|^Ti/ZG$}ufL9*wE[AVt]P7CrX-)2JpD<sYxd6O
ex.$4#KarS^j+'_!B"]H[\83:(DCXUgI*Lct?qAR
^GXQoy*KW&v}n']Em~\N9)fxP(qC=7#4sRdcD6%5
;inr[&$1j_!F~@pzo#blv]}<'|fRds6OW%tEg"G2
e;0T#gfo^+!:xHDN&4V=In?AwhEv$2Fd~ZLz_\81

Вихід : n1j@o<G. Ключовий рядок - другий останній рядок.

Оцінка балів

Це , тому виграє код у найменших байтах.


Чи є STDOUT єдиним прийнятним методом виводу, або також повертається значення повернення функції?
Згарб

@ Zgarb Функція введення та виведення нормально
Sp3000

зітхання У мене є рішення, яке працює для одного тестового випадку ... занадто багато символів втечі в інших тестових випадках. Що ж, добре.
Кайл Канос

Відповіді:


11

CJam, 13 12 байт

qN/(f&{,}$W=

Тестуйте це тут.

Пояснення

q     e# Read all input.
N/    e# Split into lines.
(     e# Pull off the keypad buttons.
f&    e# Take the set intersection of each key line with the keypad, preserving the order
      e# order in the key line.
{,}$  e# Sort the results by length.
W=    e# Pick the last (longest) one.

8

Піта, 10

@zhf!-zT.z

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

Пояснення

@zhf!-zT.z         ##  z = first line of input, .z = list of rest of lines
   f    .z         ##  Filter .z as T based on
    !-zT           ##  Whether removing all the letters from z that appear in T leaves an
                   ##  Empty string or not (keep the ones that give empty strings)
  h                ##  Take the first such line (necessary indexing, shouldn't ever matter)
@z                 ##  @ is setwise intersection. Pyth implements this by iterating over
                   ##  each element of the second argument and keeping values that appear
                   ##  in the first argument, which gives the intended result

7

Pyth, 9 байт

eolN@Lz.z

Демонстрація

@Lz.z: Фільтруйте всі лінії для перетину з першою лінією.

olN: Порядок по довжині

e: Візьміть найдовше.


3

Хаскелл, 49 байт

g(!)(a:b)=[c|d<-b,all(!d)a,c<-d,c!a]
g elem.lines

Перший рядок визначає функцію помічника g , неназвана функція у другому рядку - моя відповідь.

Пояснення

Алгоритм очевидний: розділіть введення на рядки, знайдіть рядок, який містить усі символи першого рядка, і відфільтруйте всі інші символи в цьому рядку.

g(!)(a:b)=                            -- g gets a binary function ! and list of strings a:b
          [c|                         -- and returns the string of characters c where
             d<-b,all(!d)a,           -- d is drawn from b and x!d holds for all x in a,
                           c<-d,c!a]  -- and c is drawn from d and c!a holds.
g elem.lines                          -- The input is split into lines and fed to g elem;
                                      -- then x!d means x `elem` d in the above.

3

Пролог, 204 190 байт

Це могло б стати приємним викликом для Prolog, якби не комбіновані вимоги багаторядкових входів та нерозміщених символів "та" на вході. Існує великий фрагмент коду (p і r), щоб прочитати файл як символ коди, які я повинен був зробити, щоб взяти вхід в нерозмірний ряд в декількох рядках.

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

r(I,[H|T]):-read_line_to_codes(I,H),H\=end_of_file,r(I,T).
r(_,[]).
q(_,[]).
q(E,[H|T]):-subset(E,H),intersection(H,E,X),writef("%s",[X]);q(E,T).
p:-open("t",read,I),r(I,[H|T]),q(H,T),!.

Як це функціонує

  1. Відкриває файл t (який містить увесь вхід) для читання
  2. Прочитайте всі рядки як символьні коди та розмістіть у списку списків (1 список у рядку)
  3. Повторюється над списками хвостів і перевіряє, чи існує список заголовків як підмножина цього списку
  4. Перетинає зібраний список із головою, щоб отримати потрібні символи у правильному порядку
  5. Друкує розчин

Як запустити
Програма виконується за допомогою команди:
p.
Файл, названий t, що містить вхід, повинен знаходитися в одному каталозі.

Редагувати: збережено 14 байт, об'єднавши 2 q-клавіші з АБО.


2

MATLAB, 107 байт

b=char(strsplit(char(inputdlg),' '));[~,x]=ismember(b,b(1,:));[~,f]=min(abs(1./sum(~x')-1));b(f,(~~x(f,:)))

Це в кінцевому підсумку було дуже неохайним кодом ...

Під час запуску відкривається діалогове вікно введення, куди можна вставити багаторядковий рядок (нові рядки перетворюються на пробіли, а вихідним буде клітинка з 1 дуже довгою строкою). Я вирішив перетворити отриману клітинку в char, що дає змогу розділити пробіли (результат - масив комірок), а потім знову перетворити на char для отримання наміченої форми. Тут вбудована функція ismember MATLAB робить хорошу роботу в порівнянні нашого першого рядка з іншими лініями.

Після цього стає неприємно ... Я перепробував багато способів виключити перший рядок із моєї перевірки на "найкращу відповідність" і закінчив це. Ми шукаємо рядок, а потім використовуємо цю інформацію, щоб схопити індекси (перетворивши наш вихідний показник у логіки ), з яких ми хочемо отримати наші вихідні символи.


2

Мова Вольфрама 106 байт

c=Characters[InputString[]~StringSplit~"\n"];o=c[[1]];t=Select;t[t[Rest@c,#~SubsetQ~o&][[1]],o~MemberQ~#&]

Приклад введення:

вхідне спливаюче вікно

Вихід:

вихідний результат

Пояснення коду: Спочатку за допомогою InputString ми отримуємо повний рядок введення, потім отримуємо перший набір букв, розділяючи рядок на новий рядок і зберігаючи всі символи першого в змінній o. Далі ми вибираємо з решти рядків введення ті рядки, у яких символи першого рядка (збережені як змінна o) як підмножина. Потім вибраним рядком ми захоплюємо членів цього рядка, що знаходяться в оригінальному наборі.

Редагувати: Дякую Мартіну Бюттнеру за поради щодо використання позначень інфіксів та моїх непотрібних змінних


Так, Математика. Деякі натяки на гольф: Наскільки я можу вам сказати, ви користуєтесь cі iлише один раз, тому немає ніякої користі в призначенні їх змінним. Напевно, ви можете зберегти кілька байт з цієї підказки . Не даючи oімені. s[[1]]є #&@@s(те саме для вашого другого використання [[1]]). Ви можете використовувати StringSplitбез другого параметра (оскільки він за замовчуванням розбивається на пробіли). SubsetQі MemberQможе використовувати позначення інфіксації для збереження байта, наприклад #~SubsetQ~o.
Мартін Ендер

Я змінив його деякі, і не помітив , як я змінив його , що я тільки використовується iі cодин раз, спасибі за підказку! Крім того, мені потрібно мати другий параметр StringSplit, оскільки відбулися деякі дивацтва, коли деякі персонажі трактуються як пробіли (це насправді не пробіли)
Іван Джонсон

Цікаво. У цьому випадку ви можете все-таки вставити буквальний новий рядок замість написання \n, щоб зберегти один байт і використовувати позначення інфіксації для збереження іншого.
Мартін Ендер

Так, не зовсім впевнений, що відбувається з StringSplit у такому випадку, це насправді може бути наслідком використання InputString
Ian Johnson

1

Python 2, 112 байт

import sys
i=sys.stdin.readlines()
print[''.join(c for c in l if c in i[0])for l in i[1:]if set(i[0])<set(l)][0]

Приклад запуску: Ideone


1

Javascript (ES6), 107 104 102 байт

Демонстраційний фрагмент для підтримки браузерів.

f=x=>([a]=x.split`
`).map(y=>[...y].filter(z=>~a.indexOf(z)-x).join(x='')).find(z=>z.length==a.length)
<textarea id="i" rows="6" cols="45">o@nj<G1
f]?-<I6h2vS*%l=:}c8>LK5rMdyeon,;sE[@m(73
ibhp+2Hq6yKzIf_Zo}EO3-[*0/e&Fvd]wQU=|%`C
;}>d'cg~CPtQG&%L\)MUl419bkTZ7@]:[*H"RyYj
L^<:zXJ#kj$EFlwN%B`Dd,Cs?]xRZ*K9-uQ.@&f+
i1v'7:90R-l}FMxj`,DTWK+(n32Z4Vs[p@%*eS!d
B|^Ti/ZG$}ufL9*wE[AVt]P7CrX-)2JpD<sYxd6O
ex.$4#KarS^j+'_!B"]H[\83:(DCXUgI*Lct?qAR
^GXQoy*KW&v}n']Em~\N9)fxP(qC=7#4sRdcD6%5
;inr[&$1j_!F~@pzo#blv]}<'|fRds6OW%tEg"G2
e;0T#gfo^+!:xHDN&4V=In?AwhEv$2Fd~ZLz_\81</textarea><br /><input type="button" onclick="o.value=f(i.value)" value="Run"> Output: <input type="text" id="o" readonly />

Прокоментував:

f=x=>
([a]=x.split('\n')) // split input by newlines, assign first value to a
.map(y=> // map function to each line
    [...y].filter(z=> // filter characters
        ~a.indexOf(z)-x // a has character z and not the first item (x is still set)
    ).join(x='') // join characters with empty string, reset x flag
).find(z=>z.length==a.length) // return string with same length as a
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.