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


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.