Який рядок є ключовим?


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символ нового рядка.

Технічні умови

  • Ваша програма повинна бути нечутливою до регістру
  • Програмі потрібно лише обробляти символи на клавіатурі

3
Можливо, класифікація ?
lirtosiast

3
Це подвійне вкладення kbd?
Conor O'Brien

Я пам’ятаю роки тому, використовуючи якусь мову, яка повертає натискання клавіш як 100 × рядок + положення ... Було б ідеально для цього, але, на жаль, я не пам'ятаю, що це було. Можливо, якась
ОСНОВА

@NBZ Це Blitz Basic?
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 або мати a 0 на початку цього числа, а потім додайте їхні значення рядків, використовуючи +,4Z. Після того як ми перетворили рядок у рядкові значення, все, що нам потрібно зробити, - це використати код символу вхідного коду для індексації у масив значень, а потім додати 1.

Новий рядок обробляється окремо, тому що його тлумачить Pyth як порожній рядок і тому код символу має 0.

Це було б коротше, якби я міг зрозуміти, як використовувати базу 256 в Pyth, але я не можу повністю змусити її працювати.


4
o.0 починає здавлювати Japt
nicael

це змушує мене ганьбитись
JuanPotato

:( Я забув про новий рядок! @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

Тест


1
> NaN XOR 2 = 2 - ???
lirtosiast

1
@ThomasKwa Ось так працює JS lol. Якщо c="q", ++c= NaN, NaN*7= NaN, NaN^2перетворює операнди в цілі числа (незареєстровані на зразок NaNстають 0), то робить, 0 XOR 2що є 2.
користувач81655

5

Глава 1,5 , 164 байти

Glava - це діалект 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

Це повна програма, яка приймає дані за допомогою аргументів командного рядка. Працює шляхом простого тестування, для якого регексу рядків він відповідає, а потім виводить відповідне число.


Глава = Гуава + Ява?
Пуховик

2
@ Doᴡɴɢᴏᴀᴛ Glava = Гольф + Java (це була ідея Конора)
GamrCorps

Справді! @ Doᴡɴɢᴏᴀᴛ
Conor O'Brien

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)

Ймовірно, є коротший шлях, який я оглядаю ¯ \ _ (ツ) _ / ¯


4

Піта , 98

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

не впевнений, як з якихось причин отримати діапазон 0-9: | натхненний відповіддю користувача81655


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


4

Баш, 108

Немає відповіді Баша? Відповідь Баша. grep -Finце, безумовно, правильний інструмент для цієї роботи.

Ця програма складається з двох файлів.

k, 73 байти

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

Є 5 рядків, останній - пробіл. Якщо у вас є проблеми з відтворенням файлу, base64 є:

YDEyMzQ1Njc4OTAtPX4hQCMkJV4mKigpXysKcXdlcnR5dWlvcFtdXHt9fAphc2RmZ2hqa2w7JzoiCnp4Y3Zibm0sLi88Pj8KIA==

b, 34 байти

Це сама програма, вона вводить вклад як єдиний аргумент командного рядка.

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

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

Безумовно

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команда буде відповідати всім п'яти рядкам, якщо вхід є новим рядком, а лише один рядок в іншому випадку.
  • | - труба, надіслати стандартний вихід однієї команди на стандартний вхід наступної
  • tail - вивести останні N рядків або символів стандартного вводу
  • -n3aka --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

Спробуйте в Інтернеті! (у прикладі введення - це буквально новий рядок)


Приємний, найкоротший поки що!
ETHproductions

@Eth yup, хоча б раз я повинен написати щось коротке: D
nicael


@Eth Heh, !1це щось, що відповідає "false", нарешті я знаю, як це зробити, дякую :)
nicael

@Eth халп, потрібно 5 байт, щоб перемогти Pyth.
nicael

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))));}}

Я не фахівець, і це моя перша спроба гольфу, але я зрозумів, що, чорт, чому ні? Наведена вище повна версія програми, власне код, який входить у неї, швидше за все, зніме пристойну кількість символів.


щойно помітив, що він виходить із порожнього входу (повернення нової лінії / каретки). виправляю, коли зможу
Андрій

Ласкаво просимо до громади!
Ерік Аутгольфер

Ласкаво просимо (трохи пізно з моменту публікації в січні 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 ; безпосередньо використовували струну та сканер; і видалили імпорт, який java.util.Scannerвикористовується колись.
Kevin Cruijssen

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.

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


Ласкаво просимо до головоломки програмування та коду для гольфу! Використовуйте коментарі, щоб змусити @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 \ `


Оскільки цього ще ніхто не сказав, ласкаво просимо до програмування головоломок та коду для гольфу!
Ерік Аутгольфер

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-й ряд).


2

Perl, 96 77 76 байт

Запустити за допомогою perl -p. Переконайтеся, що ви годуєте його лише окремими персонажами; наприклад, запустити його з файлу key.pl(щоб уникнути мукації з послідовностями втечі оболонки) 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.
Марк

О Я бачу. Ну, це також пояснює, чому ви не chompвходите.
ChatterOne

1
Якби я chompзмінив дані, я б не зміг повернути "3" для ключа повернення.
Марк

1
Привіт @ Марку, $_=~для матчів вам не потрібна робота m//(це те, що /.../є) працює $_автоматично! Крім того, якщо ви використовуєте -pзамість -nвас, ви можете використовувати $_=замість цього, printщоб зберегти ще пару байтів. Використання буквального нового рядка замість, \nможливо, також збереже вам ще один байт! Це мало би скоротити ваш код! Можливо, варто додати також приклад використання, щоб кожен тестуючий знав, що вам потрібно використовувати echo -n:)
Дом Гастінгс

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 )

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

Спробуйте це тут .


2

С, 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 бітові входи.


2

Python 3, 89 байт

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

Оскільки я поки не можу коментувати, я публікую покращення для поточної відповіді Python 3 окремо.

Редагувати : увесь код printзараз і далі налаштовано.


Це просто фрагмент, а отже, неправдива відповідь, вам потрібно загортати його в оператор друку (роблячи його повноцінною програмою) або перетворити його на функцію.
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);
}

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 useПОШУК () `, який мав би поголити масивні 5 байт ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.