Клавіатура однієї лінії


20

Змагання

Мета цього виклику - визначити, чи можна вводити певну рядок, використовуючи лише один рядок стандартної клавіатури Великобританії QWERTY.

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


IO

Вхід буде одним рядком з нуля або більше символів у десятковому діапазоні ASCII 32-126 включно. Ви можете припустити для цього виклику, що порожня рядок не потребує введення тексту, і тому вона може бути набрана за допомогою одного рядка.

Ви можете взяти введення як рядок, список символів або еквівалентну форму для вашої мови.

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


Розкладка клавіатури

Щоб з’ясувати будь-яку неоднозначність щодо того, що стандартна розкладка клавіатури, наведена нижче, наведено список клавіш, доступних у кожному рядку, включаючи альтернативні верхні клавіші (доступ до яких здійснюється за допомогою shift).

  • Рядок 1
    • Стандарт: `1234567890-=
  • Рядок 2
    • Стандарт: qwertyuiop[]
  • Рядок 3
    • Стандарт: asdfghjkl;'#
    • Верхня літера: ASDFGHJKL
    • Спеціальна: Caps Lock
  • Рядок 4
    • Стандарт: \zxcvbnm,./
    • Чергуйте: |<>?
    • Верхня літера: ZXCVBNM
    • Спеціальна: Зміна
  • Рядок 5
    • Спеціальна: пробіл

Альтернативні верхні клавіші можна натискати лише в тому випадку, якщо Shift також знаходиться на одній лінії, а великі клавіші доступні лише через Caps Lock або Shift. Ви дійсно можете використовувати лише одну лінію клавіатури!


Тестові кейси

            -> true     (empty string)
45-2=43     -> true     (line 1)
qwerty      -> true     (line 2)
tryitout    -> true     (line 2)
Qwerty      -> false    (no shift or caps on line 2)
#sad        -> true     (line 3)
AsDf        -> true     (caps lock used)
@sDF        -> false    (no shift for alternate upper)
zxcvbn?     -> true     (line 4)
zxc vbn     -> false    (spacebar on separate line)
123abc      -> false    (multiple lines)
            -> true     (just space bar)
!!!         -> false    (exclamation marks cannot be printed by a single line)

Так це суворо американські розкладки клавіатури? (У мене є макет Великобританії).
оуфлак

2
@ouflak Навпаки, це суто лише розкладка клавіатури QWERTY у Великобританії
Люк Стівенс

@Arnauld Так, я дякую, що помітили!
Люк Стівенс

Так, я почав дивитися на обидва, і помітив, що ваш макет, як видається, відповідає моїй розкладці клавіатури Великобританії, а не моїй у США. Гммм ... Цікаво, як виглядає мій австрійський у порівнянні.
ouflak

Чи дозволяється нам приймати дані як список символів, чи це повинен бути рядок?
Кевін Кройсейсен

Відповіді:


12

Python 2 , 130 123 121 115 байт

lambda s:any(set(s)<=set(l+l.lower())for l in["`1234567890-=","eqwrtyuiop[]","ASDFGHJKL;'#","ZXCVBNM\,./|<>?"," "])

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


Python 3 , 111 байт

lambda s:any({*s}<={*l+l.lower()}for l in["`1234567890-=","eqwrtyuiop[]","ASDFGHJKL;'#","ZXCVBNM\,./|<>?"," "])

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

-4 байти, завдяки nedla2004


1
Якщо ви готові використовувати Python 3, ви можете зменшити його до 111 байт .
nedla2004

9

Сітківка 0,8,2 , 72 71 байт

`^([-=\d`]+|[][eio-rtuwy]+|(?i)[adfghjkls;'#]+|[\\bcnmvxz,./|<>?]+| *)$

Спробуйте в Інтернеті! Пояснення: кожне чергування відповідає різному рядку клавіатури. (?i)В середині малюнка викликає все решта малюнка , щоб бути узгоджені регістронезавісімого. Редагувати: Збережено 1 байт завдяки @KirillL.


opqrможна змінити на o-r-1. Крім того, ви забули символ "backtick" для рядка 1, я цього не бачу?
Кирило Л.

@KirillL. Ну, напевно, випадково пропустили його вибір під час копіювання / вставки, дякую, що помітили це.
Ніл

приємно [][...:)
mazzy

8

05AB1E , 66 47 байт

žh…`-=«žS„[]«žTDu…;'#««žUDu"\,./|<>?"««ð)εISåP}O

Приймає введення як список символів.

-19 байт завдяки @Emigna . Повністю забув, у нас були постійні вбудовані qwerty-клавіатури. : D

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

žh                # Push "0123456789"
  …`-=            # Push "`-="
      «           # Merge them together
žS                # Push "qwertyuiop"
  „[]             # Push "[]"
     «            # Merge them togeter
žT                # Push "asdfghjkl"
  Du              # Duplicate, and toUppercase the copy
    …;'#          # Push ";'#"
        ««        # Merge all three together
žU                # Push "zxcvbnm"
  Du              # Duplicate, and toUppercase the copy
    "\,./|<>?"    # Push "\,./|<>?"
              ««  # Merge all three together
ð                 # Push a space
 )                # Wrap all string in an array
  ε   }           # Map each to:
   I              #  Take the input (list of characters)
    å             #  Check for each if it's in the current string of the map-iteration
     P            #  Take the product (1 if all are truthy, 0 otherwise)
       O          # Take the sum (either 1 or 0, so truthy/falsey), and output implicitly



5

JavaScript (Node.js) , 99 98 95 байт

x=>/^([-`=\d]+|[wetyuio-r[\]]+)$/.test(x)|/^([asdfghjkl;'#]+|[zxcvbnm,./<>?\\|]+| *)$/i.test(x)

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

-1 з коментаря @Kirill L. у відповіді Retina.
-3 спасибі @Ismael Miguel та @Arnauld за їх спільні зусилля.


Чому ти там asdfghjklі ASDFGHJKLтам? Чому б ти не використав iпрапор, як x=>/.../i.test(x)?
Ісмаїл Мігель

@IsmaelMiguel, оскільки QWERTYUIOPне повинен відповідати регулярним виразом. Додаткова перевірка обійдеться дорожче, ніж кодування цих великих літер безпосередньо в регулярний вираз.
Шиеру Асакото

Неважливо, це баггі. x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)однакова довжина
Ісмаель Мігель

@IsmaelMiguel Використання побітових даних |економить 1 байт.
Арнольд

1
@IsmaelMiguel Це частина специфікації ECMAScript. Єдині 3 символи, які потрібно вийти з класу символів \ , - ]і -(див. ClassAtomNoDash у специфікації). Тире може також з’являтися без націлення, якщо це або перший, або останній символ (інакше інтерпретується як роздільник діапазону символів).
Арнольд

5

Perl 6 , 102 101 100 байт

-1 байт завдяки nwellnhof!

->\a{max map {a.combcomb $_~.lc:},|<eqwrtyuiop[] ASDFGHJKL;'# ZXCVBNM\,./|<>?>,' ',"`-="~[~] ^10}

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

Досить стандартна реалізація. Напевно, існує коротше рішення, що базується на регулярних виразках, але я не знаю достатньо добре регексу Perl 6, щоб зробити спробу.


Ви можете використовувати maxзамість ?anyminзамість ?all).
nwellnhof

1
Що для цього варто, рішення на основі регулярних виразів складе 84 байти або 80 байт, використовуючи регулярні виразки Perl 5 m:P5//. Але я не думаю, що жоден з них не вартий публікації як відповіді.
nwellnhof

4

Java 10, 209 208 байт

s->{int l=0,t;for(var p:s){t=p.matches("[[0-9]`\\-=]")?1:"qwertyuiop[]".contains(p)?2:p.matches("(?i)[asdfghjkl;'#]")?3:"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?4:p.equals(" ")?5:9;l=l<1?t:l!=t?9:l;}return l<6;}

-1 байт завдяки @TFeld .

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

Пояснення:

s->{                    // Method with String-array parameter and boolean return-type
  int l=0,              //  Line-integer, starting at 0
      t;                //  Temp integer
  for(var p:s){         //  Loop over the characters
    t=p.matches("[[0-9]`\\-=]")?
                        //   If it's a character from the first line: 
       1                //    Set `t` to 1
      :"qwertyuiop[]".contains(p)?
                        //   Else-if it's a character from the second line:
       2                //    Set `t` to 2
      :p.matches("(?i)[asdfghjkl;'#]")?
                        //   Else-if it's a character from the third line
       3                //    Set `t` to 3
      :"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?
                        //   Else-if it's a character from the fourth line:
       4                //    Set `t` to 4
      :p.equals(" ")?   //   Else-if it's a space from the fifth line:
       5                //    Set `t` to 5
      :                 //   Else (invalid character):
       9;               //    Set `t` to 9
    l=l<1?              //   If `l` is still 0:
       t                //    Set it to `t`
      :l!=t?            //   Else-if `t` is a different line than `l`:
       9                //    Set `l` to 9 (non-existing line)
      :                 //   Else (`t` is the same line as `l`):
       l;}              //    Leave `l` the same
  return l<6;}          //  Return whether `l` is not 9

Приємне рішення, але воно повертає істину, !!!незважаючи на те, що знаки оклику не можуть бути надруковані жодним одним рядком. Я щойно додав це як тестовий випадок
Люк Стівенс

@LukeStevens Ах, я помилково припускав, що введення завжди дійсне для одного з п'яти рядків. Я модифікую своє рішення. Це просте виправлення (але додасть байтів ..)
Кевін Круїйсен

Чому б не використовувати (?i)для інших великих літер?
Ніл

@Neil Через втечу, необхідне для косої риски, це також 209 байт .
Кевін Кройсейсен

Запропонувати p==" "замістьp.equals(" ")
roofcat


4

Желе , 55 байт

ØDW;Øq;Œu$€3,4¦;"“rɠ3“Ż²“¿µ|“aƲƘ0ÞḅzḂ»⁶ṭ
¢f€ẈṠSỊafƑ¢F¤$

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

Перший рядок дає список ліній клавіатури, а другий перевіряє, чи міститься вхід програми в одному (або нульовому) рядку та чи немає символів, які не можна набрати (як QWE!@#).


3

C , 150 байт

x;f(char*s){for(x=0;*s;x|="@               "[*s++-32]);return!(x&x-1);}

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

Це не виграє жодних призів, але це цікавий підхід: ми відображаємо символи на п’ять рядках клавіатури до 4 8 16 32 64та кожного недійсного символу 3. Ми розбиваємо АБО значення для кожного символу в рядку разом і перевіряємо, чи задовольняє результат x&(x-1) == 0, що відповідає дійсності, коли xпотужність становить 2 або нуль, тобто коли xє не більше одного біта.


2

LUA , 282 262 259 270 байт

s=io.read()l=0
t=0
for c in s:gmatch"."do
f=c.find
t=f(c,"[0-9%`-=]")or 0|(f(c,"[qwertyuiop%[%]]")or 0)*2|(f(c,"[aAsSdDfFgGhHjJkKlL:'@#~]")or 0)*4|(f(c,"[\\zxcvbnm,./|<>?ZXCVBNM]")or 0)*8|(f(c," ")or 0)*16
t=t==0 and 17or t
l=l<1 and t or l~=t and 17or l
end
print(l<17)

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


2

PHP, 98 байт

Мені трохи сумно, що немає нічого кращого, ніж регулярний вираз. Це, мабуть, не найшвидше рішення.

<?=preg_match("%^([`\d=-]*|[wetyuio-r[\]]*|(?i)[asdfghjkl;'#]*|[\\\zxcvbnm,./|<>?]*| *)$%",$argn);

Запустіть як трубу -Fабо спробуйте в Інтернеті .


Найкоротше рішення, яке я знайшов, не знайдене регулярного вираження (124 байти; розрив рядків та вкладка для зручності читання):

foreach(["`1234567890-=","qwertyuiop[]","asdfghjkl;'#ASDFGHJKL","zxcvbnm,./\|<>?ZXCVBNM"," "]as$d)
    trim($argn,$d)>""||die(1);

виходи з кодом 1для truthy, 0для фальшивості . Запустити як труба -R.
Потрібна PHP 5.4 або новіша версія; для старих PHP використовуйте array(...)замість [...](+5 байт)
або використовуйте ці 123 байти -nRв PHP <7:

foreach(split(_,"`1234567890-=_qwertyuiop[]_asdfghjkl;'#ASDFGHJKL_zxcvbnm,./\|<>?ZXCVBNM_ ")as$d)
    trim($argn,$d)>""||die(1);

2

AWK , 163 119 113 байт

Це відповідь AWK, повертає числовий 1 рядок для істинного, 0 рядок для помилкового. (Написано як AWK виклик як awk -f файл для інтерактивного використання.)

{print/^[-`1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}

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

Однак, не обробляє символ TAB як записаний (тривіальне розширення), як не частину специфікації.


4
"Усі рішення викликів повинні: (...) бути серйозним претендентом на критерії виграшу, які використовуються. Наприклад, для участі у змаганні з кодом з гольфу потрібно грати в гольф, а вступ на змагання з швидкості повинен зробити певну спробу бути швидким. . " - довідковий центр Немає необхідності оголошувати ці 2 змінні і точно не потрібно робити їх рядками. І одного printдостатньо: Спробуйте в Інтернеті!
манатура

Ваш коментар щодо того, що рішення повинні бути серйозними, є дійсним, але я заперечую, що будь-яке рішення, тому після переглянутого 05AB1E одне з них не має значення, оскільки вони не могли відповідати або покращити результат. Я не бачу, як ви не можете використовувати друк двічі, щоб отримати істинне і хибне (звичайно, для чогось, що читає рядки до кінця введення). І я говорив, що оптимізований на той час не був оптимальним. Завдяки вашим думкам його можна скоротити до 143 символів.
Філ Ф

І фактично пройшовши весь шлях, це зробить це 121 символом ...
Phil F

2
code-golf - це не змагання за найкоротший загальний код, але найкоротший для вашої мови. Якщо ви можете вдосконалити своє рішення, то я б запропонував зробити так
Джо Кінг

@Jo King, дякую за роз'яснення. переглянутий код міг / міг би бути: {print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
Філ Ф

1

Баш , 119 байт

Включає відлуння, щоб забезпечити "читабельний" вихід. Якщо навколо нього помістити відповідну обгортку оболонки (на ваш вибір), щоб включити друк / вихід, то ви можете зберегти 8 байт. Моє читання виклику говорить про те, що рішення повинно вивести відповідний вихідний показник, тому я дотримуюся 119 байт

[[ "$@" =~ ^[asdfghjklASDFGHJKL\;\'#]*$|^[-\`0-9=]+$|^[]qwertyuiop\[]*$|^[zxcvbnm,./\|\<\>\?ZXCVBNM]*$|^\ *$ ]];echo $?

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


Зверніть увагу, що рішення Bash також означає, що рішення мого / @ manatwork AWK може бути зменшено до 113 байт.
Філ Ф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.