Какая строка является ключом?

39

Дан любой из следующих символов (или перевод строки):

`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:"zxcvbnm,./ZXCVBNM<>?

Ваша программа должна вывести строку, которая находится на клавиатуре


Поскольку моя клавиатура (почти) разряжена, ваш код должен быть как можно короче


Клавиатура, которую должна использовать ваша программа (для поиска строк), должна выглядеть так:


Row 1:~` !1@2 #3$4 %5^6 &7*8 (9)0 _-+=                          

Row 2:                         Q W E R T Y U I O P {[ }]    |\   
Row 3:                              A S D F G H J K L :; "' return  
Row 4:                                 Z X C V B N M <, >. ?/                 
Row 5:                                                    space                                                   

Где   returnновая строка. Пустые ключи ничего не значат.

Примеры

"$"
1

"R"
2

"a"
3

"?"
4

"\n"
3

" "
5

где \nсимвол новой строки.

Характеристики

  • Ваша программа должна быть без учета регистра
  • Ваша программа должна обрабатывать только символы на клавиатуре
Downgoat
источник
3
Возможно классификация ?
lirtosiast
3
Это двойное вложение kbd?
Конор О'Брайен
Я помню, как много лет назад я использовал какой-то язык, который возвращал нажатия клавиш в виде строки 100 × строка + ... Было бы идеально для этого, но, к сожалению, я не помню, что это было. Может быть, какая-то форма бейсика ...
Адам
@NBZ Это Блиц Базовый?
wizzwizz4
1
@ wizzwizz4 Вы пробовали BlitzPlus? это бесплатно и похоже, что это то, что вы хотите.
HolyBlackCat

Ответы:

6

Pyth, 62 66 65 байт

?zh@+,4Zmid2c.Bi."0fÀÓ¸[9Ѷ¤KïLäHÉðbÀ`]ü©¬vS"16 2-CzCd3

Попробуйте онлайн.

Использование упакованной строка , представляющее число в шестнадцатеричном , который, когда разрезал на два-битные куски, представляет собой строку каждого символа , за исключением и в !качестве значения от 0 до 3. Мы опускаем и !поэтому мы не должны хранить 4 или иметь 0 в начале этого числа, затем добавьте значения строк, используя +,4Z. Как только мы превратили строку в значения строки, все, что нам нужно сделать, это использовать код символа ввода для индексации массива значений, а затем добавить 1.

Новая строка обрабатывается отдельно, потому что она интерпретируется Pyth как пустая строка и поэтому имеет код символа 0.

Это было бы короче, если бы я мог понять, как использовать базу 256 в Pyth, но я не могу заставить ее работать.

Люк
источник
4
o.0 начинает сжимать Japt
Nicael
это заставляет меня
стыдиться
:( Я забыл о новой строке! @Nicael, вы вернулись, чтобы быть на вершине.
Люк
Теперь мы даже мертвы!
Лука
Вам нужно избежать нулевых байтов в Pyth.
lirtosiast
12

JavaScript (ES6), 105 102 101 байт

c=>/[~`0-9!@#-&^(-+_=-]/.test(c)+/[asdfghjkl;:'"\n]/i.test(c)*3+/[zxcvbnm,<.>/?]/i.test(c)*4||++c*7^2

объяснение

В JavaScript testвозвращает логическое значение, которое действует так же, как 1и 0я, умножая их на их ряд. Тестирование для строки 2 заняло наибольшее количество байтов, поэтому я использовал этот в качестве значения по умолчанию, если другие не совпадают.

c=>
  /[~`0-9!@#-&^(-+_=-]/.test(c)   // row 1 regex
  +/[asdfghjkl;:'"\n]/i.test(c)*3 // row 3 regex
  +/[zxcvbnm,<.>/?]/i.test(c)*4   // row 4 regex
  ||++c                           // space ++ = 1, any character on row 2 ++ = NaN
    *7^2                          // 7 XOR 2 = 5, NaN XOR 2 = 2

Тест

user81655
источник
1
> NaN XOR 2 = 2 - ???
lirtosiast
1
@ThomasKwa Вот как JS работает, лол. Если c="q", ++c= NaN, NaN*7= NaN, NaN^2преобразует операнды в целые числа (некастабильные, например, NaNстановятся 0), то делает, 0 XOR 2что есть 2.
user81655
5

Глава 1.5 , 164 байта

Глава - это диалект Java, который делает код Java короче. Этот код, к сожалению, неконкурентоспособен, так как использованный коммит (на 2 часа позже ...) был сделан после этой проблемы, которая исправила некоторые существенные ошибки, которые не позволяли этой программе работать.

p(A[0].matches("[`0-9-=~!@#$%^&*()_+]")?1:A[0].replace("\\n","\n").matches("(?i)[asdfghjkl;':\"\n]")?3:A[0].matches("(?i)[zxcvbnm,.\\/<>?]")?4:A[0].matches(" ")?5:2

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

GamrCorps
источник
Глава = Гуава + Ява?
Вниз
2
@ Doᴡɴɢᴏᴀᴛ Glava = Гольф + Ява (это была идея Конора)
GamrCorps
Верно! @ Doᴡɴɢᴏᴀᴛ
Конор О'Брайен
4

Питон 3, 142

print(int(("~`!1@2#3$4%5^6&7*8(9)0_-+=""qwertyuiop{[}\|"+"]"*11+'asdfghjkl;:"\n'"'"*13+"zxcvbnm,<.>/""?"*14+" ").index(input().lower())/26)+1)

Вероятно, есть более короткий способ, которым я пропускаю ¯ \ _ (ツ) _ / ¯

JuanPotato
источник
4

Пиф , 98

|+++l:"~`0123456789!@#$%^&*()_-=+"z1*l:"asdfghjkl;:'\"\n"rz0 1 3*l:"zxcvbnm,<.>/? "rz0 1 4 l:dz1 2

почему-то не знаю, как заставить работать диапазон 0-9: |, вдохновленный ответом user81655

JuanPotato
источник
Вы можете использовать jkUTдля строки в диапазоне от 0 до 9, не уверен, что есть более короткий путь. Вы также можете использовать упакованные строки, чтобы сохранить несколько байтов, например, ."!~WÏù¹_(<]úÝ"для "~`!@#$%^&*()_-=+".
Лука
От @benstopics, это не работает для метасимволов регулярных выражений
FryAmTheEggman
4

Баш, 108

Нет ответа Bash? Баш ответь.grep -Finбезусловно, правильный инструмент для этой работы.

Эта программа в двух файлах.

k73 байта

`1234567890-=~!@#$%^&*()_+
qwertyuiop[]\{}|
asdfghjkl;':"
zxcvbnm,./<>?

5 строк, последняя - пробел. Если у вас возникли проблемы с воспроизведением файла, base64:

YDEyMzQ1Njc4OTAtPX4hQCMkJV4mKigpXysKcXdlcnR5dWlvcFtdXHt9fAphc2RmZ2hqa2w7JzoiCnp4Y3Zibm0sLi88Pj8KIA==

b34 байта

Это сама программа, она принимает входные данные в качестве единственного аргумента командной строки.

grep -Fin "$1" k|tail -n3|head -c1

Оценка: 34 + 73 + 1 (для k имени файла) = 108 байт.

Ungolfed

grep --fixed-strings --ignore-case --line-number "$1" k|tail --lines=3|head --bytes=1

объяснение

  • grep - искать в файле строки, соответствующие строке или регулярному выражению, выводить только эти строки
  • -Faka --fixed-strings- отключить регулярные выражения, чтобы [и т.д. обрабатывались правильно
  • -iaka -yaka --ignore-case- сопоставление без учета регистра
  • -naka --line-number- показать номер строки и: перед каждой строкой (например 4:zxcvbnm,./<>?)
  • "$1" - поиск первого аргумента командной строки скрипта, кавычки необходимы для обработки новой строки и пробела
  • k - поиск в файле k
  • Эта grepкоманда будет соответствовать всем пяти строкам, если ввод является новой строкой, и только одной строкой в ​​противном случае.
  • | - pipe, отправлять стандартный вывод одной команды на стандартный ввод следующей
  • tail - вывести последние N строк или символов стандартного ввода
  • -n3 ака --lines=3 - вывести последние 3 строки
  • Если ввод не был переводом строки, обрабатывается только одна строка, которая начинается с номера строки из-за -nвключенного флага grep. В противном случае эта команда занимает только строки 3, 4 и 5 (последние 3 строки).
  • | - труба
  • head - вывести первые N строк или символов стандартного ввода
  • -c1aka --bytes=1- вывести первый символ
  • Если ввод не был переводом строки, он принимает первый символ, который является номером строки, в которой находится ввод. Если ввод является новой строкой, он берет первый символ строк 3, 4 и 5 вместе, то есть 3, что является правильным номером строки для новой строки.

источник
4

Japt 73 70 66 байт

2+`qØÆyuiop\{}[]|\\1dfghjkl;:
'1zxcvbnm,.<>?/\"1 `q1 ®bUv)<0} b!1

Попробуйте онлайн! (в данном примере ввод буквально переводится на новую строку)

nicael
источник
Хороший, самый короткий пока!
ETHproductions
@ Eth да, по крайней мере, однажды я должен опубликовать что-то короткое: D
nicael
@Eth Хех, !1это что-то, что соответствует «ложь», наконец, я знаю, как это сделать, спасибо :)
Nicael
@ Eth Halp, нужно 5 байтов, чтобы победить Pyth.
Никель
4

Java, 300 байт

import java.util.Scanner;public class A{public static void main(String[] args){String g="~`!1@2#3$4%5^6&7*8(9)0_-+=qQwWeErRtTyYuUiIoOpP[{]}\\|aAsSdDfFgGhHjJkKlL;:\'\"\r";Scanner i=new Scanner(System.in);int f=g.indexOf((i.nextLine().charAt(0)));System.out.print(f<0?4:(f<26?1:(f<53?2:(f<76?3:5))));}}

Я не эксперт, и это моя первая попытка игры в гольф, но я решил, что, черт возьми, почему бы и нет? Выше приведена полная версия программы, и реальный код, который входит в нее, скорее всего, отнимает приличное количество символов.

Эндрю
источник
только что заметил сбой с пустым вводом (новая строка / возврат каретки). исправлю, когда смогу
Андрей
Добро пожаловать в сообщество!
Эрик Outgolfer
Добро пожаловать (немного поздно, так как вы отправили в январе XD). Вы можете немного поиграть в нее, не меняя свой текущий подход, например так: class A{public static void main(String[]a){int f="~'!1@2#3$4%5^6&7*8(9)0_-+=qQwWeErRtTyYuUiIoOpP[{]}\\|aAsSdDfFgGhHjJkKlL;:\'\"\r".indexOf(new java.util.Scanner(System.in).nextLine().charAt(0));System.out.print(f<0?4:f<26?1:f<53?2:f<76?3:5);}}( 243 байта ) я удалил некоторые ненужные скобки; укороченный args; удалены public ; напрямую использовал String и Scanner; и удалил импорт сейчас, который java.util.Scannerиспользуется один раз.
Кевин Круйссен
219 байт, для этого вам не нужно использовать сканер
PrincePolka
3

Pyth, 105 байт

J?<l-c".^$*+?{}[]\|()"1]z14+\\zrz0?qJd5?:"qwertyuiop[]\|"J)2?:"asdfghjkl;':\"\n"J)3?:"zxcvbnm,./<>?"J)4 1

Объяснение:

J?<l-c".^$*+?{}[]\|()"1]z14+\\zrz0     # Escape input if regex metachar
?qJd5                                  # Check space
?:"qwertyuiop[]\|"J)2                  # Check second row
?:"asdfghjkl;':\"\n"J)3                # Check third row
?:"zxcvbnm,./<>?"J)4                   # Check fourth row
1                                      # If none of these, must be on first row.

Я решил выбрать первую строку в качестве строки «должно быть, если не что-то еще», потому что она требовала наибольшего количества байтов для представления даже после игры в гольф.

benstopics
источник
Добро пожаловать в программирование головоломок и Code Golf! Используйте комментарии, чтобы @JuanPotato получил его. Однако для этого нужно 50 респ. Так что вам нужно работать.
user48538
3

Perl 6, 128 байт

say 1+(/<[-\d=~!@#$%^&*()_+/`]>/,/<[qwertyuiop[\]\\{}|]>/,/<[asdfghjkl;':"\n]>/,/<[zxcvbnm,./<>?]>/,' ').first: @*ARGS.lc~~*,:k

Я делаю список регулярных выражений, содержащих классы символов вместе со строковым литералом. Затем я вызываю firstметод в списке (который является просто версией метода функции firstболее высокого порядка), используя smartmatch, чтобы сравнить аргумент, переданный программе, с текущим элементом в списке. Обратите внимание, что smartmatch делает «правильные вещи» как для регулярных выражений, так и для строкового литерала. :kНеобязательный параметр firstпричин способа вернуть индекс совпадающего элемента в списке, который я тогда добавить 1 к выходу и с помощью say.

Обратите внимание, что при использовании этой программы вам придется правильно экранировать некоторые символы, такие как `и пробел в вашей оболочке. Например: perl6 keyboard.p6 \ `

каракатица
источник
Пока никто этого не сказал, добро пожаловать в Программирование Пазлов и Код Гольф!
Эрик Outgolfer
2

JavaScript ES6, 114 байт

n=>[`qwertyuiop{}[]|\\`,`asdfghjkl;:
'`,`zxcvbnm,.<>?/"`,` `].map(x=>+(x.indexOf(n.toLowerCase())<0)).indexOf(0)+2

Другое решение JavaScript. Принцип состоит в том, чтобы вернуть индекс входного символа в массив строк плюс 2 (так как строка 0-9 возвращает -1, т.е. не существует, -1 + 2 = 1. qНаходится в первой строке массива, поэтому он возвращает 0 + 2 = 2-й ряд).

nicael
источник
2

Perl, 96 77 76 байт

Запустить с помощью perl -p. Убедитесь, что вы кормите его только отдельными символами; например, чтобы запустить его из файла key.pl(чтобы избежать перебора с escape-последовательностями оболочки) echo -n q|perl -p key.pl.

$_=/[\d~`!@#-&(-+_=-]/+/[adfghjkls"':;
]/i*3+/[bcnmvxz<>,.?\/]/i*4+/ /*5||2

Злоупотребление функциональностью диапазона регулярных выражений - это весело.

отметка
источник
Для меня это не работает, запустив его, я получаю индекс строки + 3 (то есть 3 вместо 0, 7 вместо 4 и т. Д.).
ChatterOne
Это чувствительно к тому, как вы предоставляете ввод. Вы, вероятно, предоставляете символ, за которым следует новая строка. Я использую echoдля точного контроля ввода - например. echo -n q|perl -n key.pl, который правильно выдает 2.
Mark
А ну понятно. Ну, это также объясняет, почему вы не вводите chomp.
ChatterOne
1
Если бы я chompредактировал ввод, я бы не смог вернуть «3» для клавиши возврата.
Марк
1
Эй @ Марк, тебе не нужно $_=~для матчей, m//(это то, что /.../есть) работает $_автоматически! Также, если вы используете -pвместо, -nвы можете использовать $_=вместо того, printчтобы сохранить еще пару байтов. Использование буквального перевода строки вместо \nможет сэкономить вам еще один байт! Это должно немного уменьшить ваш код! Возможно, стоит добавить пример использования, так что каждый, кто тестирует, знает, что вам нужно использовать echo -n:)
Dom Hastings
2

PHP, 173 байта

Идея заключалась в том, чтобы использовать номер группы сбора регулярных выражений в качестве индекса строки. Возможно, еще несколько оптимизаций в самом регулярном выражении.

$i=$argv[1];preg_match("%([!#-&\(-+-0-9=@^-`~])|([EIO-RT-UWY[-]eio-rt-uwy{-}])|([\"':-;ADF-HJ-LSadf-hj-ls])|([,.-/<>-?B-CM-NVXZb-cm-nvxz])%",$i,$m);echo array_flip($m)[$i];

preg_match()Вызов создаст массив $mсовпадений, и если мы должны были напечатать , что было бы выглядеть примерно так (предполагается , что zбыл вход):

Array ( [0] => 'z', [1] => '', [2] => '', [3] => '', [4] => 'z' )

Переключение этого массива путем замены ключей и значений перемещается слева направо и сохраняет только последний отдельный ключ, поэтому мы в итоге получаем:

Array ( 'z' => 4, '' => 3 )

Затем мы используем входной символ в качестве индекса в массиве, чтобы получить наш результат.

Попробуйте это здесь .

nickb
источник
2

C 145 143 136 132 127 106 байт

#define c 2124850936,91714965
b[]={8<<18,0,-218071008,7796<<19,c,c};f(a){return a-32?b[a>>4]>>a%16*2&3:4;}

Это использует index() из POSIX.1-2001 и устарела в POSIX.1-2008. Это предполагает ASCII и 32-битные числа.

ceilingcat
источник
2

Python 3, 89 байт

print("qwertyuiop{}[]\\|asdfghjkl;:\"\n'''zxcvbnm,.<>/???? ".find(input().lower())//16+2)

Пока я не могу комментировать, я выкладываю улучшение для текущего ответа Python 3 отдельно.

Изменить : Весь код в printнастоящее время и дальнейшая настройка.

creativecoding
источник
Это всего лишь фрагмент и, следовательно, неверный ответ, вам нужно заключить его в оператор печати (сделать его полной программой) или превратить в функцию.
FlipTack
@FlipTack: Ты прав. Я включил ваше предложение.
creativecoding
Добро пожаловать в PPCG!
Мартин Эндер
@MartinEnder: Спасибо! :-)
creativecoding
0

CJam, 125 байт

q_" "={;5}{"`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\"    zxcvbnm,./ZXCVBNM<>?    "\#26/1+}?

объяснение

q                          e# read input
 _" "=                     e# decide if the input is a space
      {;5}                 e# if it is, push 5
          {"..."\#26/1+}?  e# if it isn't, push the correct row
Зак Гейтс
источник
0

SpecBAS - 178 байт

1 a$="~`!1@2#3$4%5^6&7*8(9)0-_+=qQwWeErRtTyYuUiIoOpP{[}]|\aaaaAsSdDfFgGhHjJkKlL:;'"#34#13"zzzzzzzZxXcCvVbBnNmM<,>.?/"+" "*26
2 INPUT k$: IF k$="" THEN k$=#13
3  ?CEIL(POS(k$,a$)/26)

Я использовал длинную строку, где каждая строка длиной 26 символов (# 34 - это код для двойной кавычки, а # 13 - это код для возврата).

Затем выведите результат округления позиции / 26.

Брайан
источник
0

C # 6, 201 байт

Здесь нет ничего особенного. Я нашел дешевле просто написать оба случая, а не использовать ToUpper () из-за фиксированной ширины строки.

using C=System.Console;class P{static void Main(string[]a)=>C.Write("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'\raASDFGHJKL:\"\nazxcvbnm,./zzzZXCVBNM<>?zzz ".IndexOf(a[0])/26+1);}

Отступ:

using C=System.Console;
class P{
    static void Main(string[]a)=>
        C.Write("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'\raASDFGHJKL:\"\nazxcvbnm,./zzzZXCVBNM<>?zzz ".IndexOf(a[0])/26+1);
}
Hand-E-Food
источник
1
Я не вижу, как это работает для ~ или `?
Эш Бурлаченко
@AshBurlaczenko, спасибо! Я пропустил этот ключ. Исправлено без изменений в мой счет.
Hand-E-Food
0

Python 2, 146 байт

e="\n";lambda x:("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\""+e*4+"zxcvbnm,./ZXCVBNM<>?"+e*13+" ").index(x)/26+1
Оливер Ни
источник
0

Excel, 132 байта

=INT((FIND(A1,"`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:""aaa zxcvbnm,./ZXCVBNM<>?zzzzzz ")-1)/26)+1

Попытки использовать случай чувствительных SEARCH()вместо FIND()показал , что Excel соответствует ~, *и ?к (tick). The matching of? means we can't useSEARCH () `, который побрил бы массивные 5 байт ...

Wernisch
источник