Вызов раскладки клавиатуры

14

Раскладка клавиатуры, которую обычно используют люди, это раскладка QWERTY, как показано ниже.

QWERTY клавиатура

Но есть и другие раскладки клавиатуры:

DVORAK

ДВОРАК клавиатура

Colemak

Клавиатура COLEMAK

WORKMAN WORKMAN клавиатура

Твое задание

Ваш код будет принимать два ввода: имя раскладки клавиатуры и строку для расшифровки. Ваша цель - преобразовать ввод QWERTY, как если бы вы печатали с раскладкой клавиатуры, заданной в качестве первого параметра.

правила

Формат ввода свободен, вы можете использовать строки, массивы и т. Д. Кроме того, вы можете использовать любые три различных значения для представления макетов, чтобы уменьшить количество байтов, но каждое из них должно быть представлено в 10 байтах или меньше.

Вам нужно только обрабатывать клавиши с белым фоном. В частности, вы должны транспонировать печатные символы ASCII из алфавита QWERTY в один из других алфавитов:

 QWERTY: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
 DVORAK: !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~
COLEMAK: !"#$%&'()*+,-./0123456789Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJZ[\]^_`abcsftdhuneimky;qprglvwxjz{|}~
WORKMAN: !"#$%&'()*+,-./0123456789Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJZ[\]^_`avmhrtgyuneolkp;qwsbfcdxjz{|}~

(Примечание: это было записано вручную @ETHproductions, поэтому, если вы видите какие-либо ошибки, пожалуйста, укажите на них!)

пример

DVORAK zZxX как вход будет давать как выход ;:qQ

Это поэтому выигрывает самый короткий ответ в байтах!

Nayuki
источник
1
Кроме того, было бы полезно еще несколько тестов.
ETHproductions
1
@Tutleman Да, вы можете взять 0 1 2, например
1
Подождите, мы можем взять, например, !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~в качестве входа для клавиатуры Дворжака? Это упрощает задачу ... Как насчет введения ограничения длины или чего-то подобного?
ETHproductions
1
@EriktheOutgolfer Но тогда вы можете взять, например, в !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\‌​=^{`axje.uidchtnmbrl‌​'poygk,qf;?|+~качестве входных данных
ETHproductions
1
@ETHproductions Да, вы можете использовать эти символы в качестве входных данных, хотя макеты не должны зависеть от них вообще, чтобы быть построенными. Единственное использование для них будет выбирать, какой макет использовать. 10 байтов - это фиксированный лимит (слишком короткий IMO), поэтому он мне не нравится. И да, вы говорите, байты не символы. Я думаю, что это должно было быть в песочнице больше времени.
Эрик Outgolfer

Ответы:

3

Рубин , 258 247 238 байт

->c,t{c.tr"#{$f='\'"+,-./<=>?[]{'}}:;B-Z_b-z",%W(-_}w[vzW]VZ/=?+SsXJE>UIDCHTNMBRL"POYGK<QF:{xje.uidchtnmbrl'poygk,qf;
#$f}OoBCSFTDHUNEIMKY:QPRGLVWXJZ_bcsftdhuneimky;qprglvwxjz
#$f}IiVMHRTGYUNEOLKP:QWSBFCDXJZ_vmhrtgyuneolkp;qwsbfcdxjz)[t]}

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

Это функция, принимающая два аргумента: сообщение, подлежащее обмену, и значение 0-2, представляющее макет, к которому нужно обменяться, где 0 соответствует Дворжаку, 1 - Коулмаку и 2 - Уокману.

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

def swap_layout(message, layout)
    keyboards = [DVORAK, COLEMAK, WORKMAN] # Omitted here for brevity
    return message.tr(QWERTY, keyboards[layout])
end

string#trФункция Руби принимает два аргумента: строку, содержащую символы для замены, и строку, содержащую их замены. Полезно, это позволяет вам указать диапазоны символов, используяa-z синтаксиса. Другая ключевая реализация экономии места заключается в том, что нет необходимости включать символы, которые являются одинаковыми во всех четырех макетах, что позволило мне избавиться от всех цифр, буква «А» в верхнем и нижнем регистре, а также несколько специальные символы.

Еще один странный бит синтаксиса - это использование %W(). Это создает массив строк, содержащих все внутри скобок, разделенных пробелами. Все переносы строк в представлении фактически функционируют как разделители элементов. %W()также разрешает интерполяцию строк (что делается с помощью #{}оператора) -%w() было бы то же самое, но без интерполяции строк.

Я также хотел бы воспользоваться моментом, чтобы обвинить Дворжака в том, что он порвал с моими планами по оптимизации, поскольку настаивал на том, чтобы все время быть совершенно другими, чем все остальные; решение Qwerty / Colemak / Workman могло бы быть очень коротким ...

Tutleman
источник
Принимает ли целое число как представление клавиатуры для сопоставления с требованиями? В тестовом примере явно указывается имя клавиатуры, но тогда правила, по-видимому, позволяют любому вводу представлять клавиатуру.
Лохматый
@Shaggy Процитирую один из комментариев автора к посту: «Вы можете взять 0 1 2, например», что я и сделал.
Тутлеман
5

JavaScript (ES7), 282 273 251 250 байт

Принимает идентификатор раскладки клавиатуры kи массив символов aв синтаксисе карри(k)(a) . Возвращает массив переведенных символов.

Идентификаторы макета:

  • -32
  • 64
  • 160
k=>a=>a.map(c=>1/(t=`1_3-2}w[vz8SsW]VZ1XJE>UIDCHTN0BRL"POYGK<QF:/0=0{1xje.uidchtn0brl'poygk,qf;?0+995Oo6SFTD0UNEI0KY:0PRGL2J8sftd0unei0ky;0prgl2j998Ii5VMHRT0YUNEOLKP:0W0BFCD0J6vmhrt0yuneolkp;0w0bfcd0j5`.replace(/\d/g,n=>15**n)[c.charCodeAt()+k])?c:t)

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

Как это устроено

компрессия

Все три целевых макета хранятся в одной сжатой строке, где каждый символ:

  • символ перевода из QWERTY
  • цифра, обозначающая количество последовательных символов, которые не нужно переводить

N15N10

n | 15**n       | length
--+-------------+-------------
0 | 1           | 1
1 | 15          | 2
2 | 225         | 3
3 | 3375        | 4
4 | 50625       | 5 (not used)
5 | 759375      | 6
6 | 11390625    | 8
7 | 170859375   | 9 (not used)
8 | 2562890625  | 10
9 | 38443359375 | 11

Например, #$%&-()*в DVORAK хранится как 3-2потому что #$%&и ()*имеют одинаковые отображения в QWERTY и только- является фактическим переводом.

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

декомпрессия

N15N3-23375-225 .

Перевод

Для каждого символа cв aмы извлекаем символ перевода t, используя kв качестве смещения в несжатой строке макета, и проверяем, является ли это цифрой с 1/t. Если это так, мы выводим оригинальный символ cвместо этого.

Arnauld
источник
Мне пришлось бежать вниз, чтобы надеть шляпу, чтобы я могла снять ее с тебя! Я знал, что кто-то победит меня, но я счастлив, что меня избили по стилю. Вы получите мое возражение, как только я закончу переваривать, как именно вы сняли этот шедевр.
Лохматый
4

Сетчатка , 273 270 байт

T`p` !_#-&\-()*}\w[vzdSsW]VZ@AXJ\E>UIDC\HTNMBR\L"P\OYGK<QF:/\\=^{\`axje.ui\dc\htnmbr\l'\p\oygk,qf;?|+~`^D.*
T`p` -9\O\o<-CSFTD\HUN\EIMKY:QPRG\LVWXJZ-csft\d\huneimky;q\prg\lv-xjz-~`^C.*
T`p` -9Ii<-AVM\HRTGYUN\E\O\LKP:QWSBFCDXJZ-avm\hrtgyune\o\lk\p;q\wsbfc\dxjz-~`^W.*
^.

Попробуйте онлайн! Префикс сообщения с одной буквой D, Cили Wдля желаемой раскладки клавиатуры. К сожалению, Retina поддерживает кучу волшебных букв ( pчто очевидно, но мне все-таки удалось проскользнуть d), которые нужно процитировать, за исключением того, что я смог использовать v-xвместо v\wx. Редактировать: 3 байта сохранены благодаря @ETHproductions.

Нил
источник
Если -s представляют диапазоны символов, я думаю, вы можете сохранить некоторые из них, изменив <-@ABCна <-C.
ETHproductions
@ETHproductions Да, мне интересно, почему я упустил это из виду в верхнем регистре ...
Нил
3

PHP, 364 байта

echo strtr($argv[2],($t=[[":;BCDEFHIJKLMNOPRTUVWYbcdefhijklmnoprtuvwy","IiVMHRTYUNEOLKP:WBFCDJvmhrtyuneolkp;wbfcdj"],[":;DEFGIJKLNOPRSTUYdefgijklnoprstuy","OoSFTDUNEIKY:PRGLJsftduneiky;prglj"],["\"'+,-./:;<=>?BCDEFGHIJKLNOPQRSTUVWXYZ[]_bcdefghijklnopqrstuvwxyz{}","_-}w[vzSsW]VZXJE>UIDCHTNBRL\"POYGK<QF:/={xje.uidchtnbrl'poygk,qf;?+"]][ord($argv[1])%3])[0],$t[1]);

Массив содержит 3 массива, где ключ обозначает 0 = W, 1 = C, 2 = D

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

Йорг Хюльсерманн
источник
2

Python 2, 422 байта

Пытался объединить макеты каким-то умным способом, но это не сильно помогло.
Попробуйте онлайн

from string import*
Q=' '+printable
D=' '+digits
p,P=punctuation.split(':;')
w='avmhrtgyuneolkp;qwsbfcdxjz'
c='abcsftdhuneimky;qprglvwxjz'
d="uidchtnmbrl'poygk"
K={'C':D+c+c.upper().replace('Y;','Y:')+p+'Oo'+P,'W':D+w+w.upper().replace('P;','P:')+p+'Ii'+P,'D':D+'axje.'+d+',qf;AXJE>'+d.upper().replace("L'",'L"')+'<QF:!_#$%&-()*}w[vzSsW]VZ@/\=^{`?|+~'}
k,s=input().split()
print''.join(map(lambda x:K[k[0]][Q.index(x)],s))
Мертвый Опоссум
источник
Хорошо сыграно :) Я не очень хорош в питоне, поэтому я не могу помочь тебе в этом гольфе ^^
2

JavaScript (ES6), 461 409 404 395 385 байт

Я написал оригинальную версию ниже на своем телефоне, когда сидел в автобусе, а затем не хватило времени, чтобы правильно поиграть в гольф, чтобы было больше хруста. Спасибо @ETHproductions за помощь до сих пор.

Строки клавиатуры были скопированы непосредственно из вопроса, поэтому вините Антуана ETH в любых ошибках!

Для этого требуется целое число, представляющее раскладку клавиатуры (0 для DVORAK, 94 для COLEMAK и 188 для WORKMAN) и массив строк в качестве аргументов при каррировании - например, f(0)(["z","Z","x","X"])выходных данных ;:qQ.

k=>s=>s.map(c=>`!_#$%&-()*}w[vz${a="0123456789"}SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\\=^{\`axje.uidchtnmbrl'poygk,qf;?|+~${b="!\"#$%&'()*+,-./"+a}Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJ${d="Z[\\]^_\`a"}bcsftdhuneimky;qprglvwxjz{|}~${b}Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJ${d}vmhrtgyuneolkp;qwsbfcdxjz{|}~`[`${b}:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY${d}bcdefghijklmnopqrstuvwxyz{|}~`.search(c)+k]).join``

Попытайся

f=
k=>s=>s.map(c=>`!_#$%&-()*}w[vz${a="0123456789"}SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\\=^{\`axje.uidchtnmbrl'poygk,qf;?|+~${b="!\"#$%&'()*+,-./"+a}Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJ${d="Z[\\]^_\`a"}bcsftdhuneimky;qprglvwxjz{|}~${b}Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJ${d}vmhrtgyuneolkp;qwsbfcdxjz{|}~`[`${b}:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY${d}bcdefghijklmnopqrstuvwxyz{|}~`.search(c)+k]).join``
o.innerText=f(j.value=0)([...i.value="zZxX"])
i.oninput=j.oninput=_=>o.innerText=f(+j.value)([...i.value].filter(c=>`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\`abcdefghijklmnopqrstuvwxyz{|}~`.includes(c)))
<select id=j><option value=0>DVORAK<option value=94>COLEMAK<option value=188>WORKMAN</select><input id=i><pre id=o>

мохнатый
источник
На самом деле я собрал строки: P
ETHproductions
Давайте посмотрим ... вы никогда не получите в QWERTYкачестве входных данных, поэтому я думаю, что вы могли бы сохранить несколько байтов, не сохраняя Object в переменной. Это будет выглядеть примерно такs=>[...s].map(c=>({D:"...",C:"...",W:"..."}[k[0]]["...".indexOf(c)]).join``
ETHproductions
Ага, да, я знал, что есть способ работать непосредственно с объектом, map()но у меня не хватило времени - хотите верьте, хотите нет, я написал это, сидя в автобусе в кино. Я обновлю его твоим предложением и несколькими улучшениями, которые я заметил сам завтра.
Лохматый
1

05AB1E , 199 192 187 байт

žQDIiA¦'mKDuì“"'+,-./:;<=>?[]_{}“«.•4Zl˜η‡#ûwj˜ÐAδO•Duìð“>"<:.',;“S.;“_-}w[vzSsW]VZ/={?+“«ë¹<i.•2¸3'ÐQïK¤)•Duì„:;©ì.•C^ÿ¶₆*γŽ¨ï•Duì„Ooìë.•Brì·=ζW˜ΛlÝδ•Duì®ì.•]X)àƒ₆ä¤QúØM•Duì„Iiì}ð®S.;}‡‡

Использует идентификаторы 1для DVORAK; 2для COLEMAK и 3для WORKMAN.
Сначала нажмите ID, затем строку, которую мы хотим транслитерировать.

Попробуйте онлайн или проверьте полный ASCII-диапазон для всех трех .

Объяснение:

žQ                    # Push printable ASCII builtin string:
                      #  “ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~“
  D                   # Duplicate it
   Ii                 # If the input-integer is 1:
     A                #  Push the lowercase alphabet
      ¦'mK           '#  Remove the first character (the 'a') and 'm'
          Duì         #  Prepend an uppercase copy
     "'+,-./:;<=>?[]_{}“«
                     "#  And then append the string “"'+,-./:;<=>?[]_{}“
     .•4Zl˜η‡#ûwj˜ÐAδO 
                      #  Push compressed string "xje uidchtnbrl poygk qf "
        Duì           #  Prepend an uppercase copy
     ð                #  Push a space " "
      “>"<:.',;“S    "#  Push the characters [">",'"',"<",":",".","'",",",";"]
                 .;   #  Replace the first space with ">", second with '"', etc.
     _-}w[vzSsW]VZ/={?+“«
                      #  And then append the string “_-}w[vzSsW]VZ/={?+“
   ë                  # Else:
    ¹<i               #  If the input-integer is 2 instead: 
       .•2¸3'ÐQïK¤)• '#   Push compressed string "defgijklnoprstuy"
          Duì         #   Prepend an uppercase copy
       „:;            #   Push string ":;"
          ©           #   Store it in the register (without popping)
           ì          #   And then prepend this ":;" in front of the "DEF...def..."-string
       .•C^ÿ¶₆*γŽ¨ï•  #   Push compressed string "sftduneiky prglj"
          Duì         #   Prepend an uppercase copy
       Ooì           #   And then prepend "Oo"
    ë                 #  Else (so the input-integer is 3):
     .•Brì·=ζW˜ΛlÝδ•  #   Push compressed string "bcdefhijklmnoprtuvwy"
        Duì           #   Prepend an uppercase copy
     ®ì               #   And then prepend ":;" (from the register)
     .•]X)àƒ₆ä¤QúØM  #   Push compressed string "vmhrtyuneolkp wbfcdj"
        Duì           #   Prepend an uppercase copy
     Iiì             #   And then prepend "Ii"
    }                 #  After the inner if-else:
     ð                #  Push a space " "
      ®S              #  Push the characters [":",";"] (from the register)
        .;            #  Replace the first space with ":" and the second space with ";"
   }                  # After the outer if-else:
                     # Transliterate the two strings we created,
                      #  in the duplicate printable ASCII string
                     # And then transliterate the printable ASCII string with this string,
                      #  in the (implicit) string-input
                      # (after which the result is output implicitly)

Посмотрите этот совет 05AB1E (раздел Как сжимать строки, не входящий в словарь? ), Чтобы понять, как работают сжатые строки.

Кевин Круйссен
источник
1

C ++, 528 байт

#include <map>
#define M(a,b)a!='\0'?a:b
std::map<char,char>t[3];char*c[]={"\"'+,-./:;<=>?BCDEFGHIJKLMNOPQRSTUVWXYZ[]_bcdefghijklmnopqrstuvwxyz{}","_-}w[vzSsW]VZXJE>UIDCHTNMBRL\"POYGK<QF:/={xje.uidchtnmbrl'poygk,qf;?+","\"'+,-./Oo<=>?BCSFTDHUNEIMKY:QPRGLVWXJZ[]_bcsftdhuneimky;qprglvwxjz{}","\"'+,-./Ii<=>?VMHRTGYUNEOLKP:QWSBFCDXJZ[]_vmhrtgyuneolkp;qwsbfcdxjz{}"};int main(int d,char*v[]){for(int i=1;i<4;i++)for(int j=0;j<68;j++)t[i-1][c[0][j]]=c[i][j];for(int k=0;v[2][k];k++)printf("%c",M(t[v[1][0]-'0'][v[2][k]],v[2][k]));}

Бежать с ./multitrans <0-2> <string> где 0 = Дворжак, 1 = Колемак и 2 = Рабочий.

Я добавил новые строки между ними, чтобы сделать код немного более читабельным ниже. Этот код генерирует карту перевода из строк, где поиск символа Qwerty возвращает перевод ( t[0]['s'] = 'o'для s в Dvorak), а затем использует карту для перевода. Строки перевода сокращены, потому что некоторые символы не нужно менять никогда. Хотя, возможно, его можно было бы уменьшить и дальше.

#include <map>
#define M(a,b)a!='\0'?a:b
std::map<char,char>t[4];
char*c[4]={
"\"'+,-./:;<=>?BCDEFGHIJKLMNOPQRSTUVWXYZ[]_bcdefghijklmnopqrstuvwxyz{}",
"_-}w[vzSsW]VZXJE>UIDCHTNMBRL\"POYGK<QF:/={xje.uidchtnmbrl'poygk,qf;?+",
"\"'+,-./Oo<=>?BCSFTDHUNEIMKY:QPRGLVWXJZ[]_bcsftdhuneimky;qprglvwxjz{}",
"\"'+,-./Ii<=>?VMHRTGYUNEOLKP:QWSBFCDXJZ[]_vmhrtgyuneolkp;qwsbfcdxjz{}"};
int main(int d,char*v[]){
    for(int i=1;i<4;i++)
        for(int j=0;j<68;j++)
            t[i-1][c[0][j]]=c[i][j];
    for(int k=0;v[2][k];k++)
        printf("%c",M(t[v[1][0]-'0'][v[2][k]],v[2][k]));
}

Дополнительно: Qwerty -> Только Дворак (197 байт)

Я недавно написал этот код, который превращает Qwerty в Dvorak, хотя заглавные буквы не переведены.

#include<string>
char*d="\',.pyfgcrlaoeuidhtns;qjkxbmwvz ";std::string t="qwertyuiopasdfghjkl;zxcvbnm,./ ";int main(int c,char*v[]){for(int j=0;j<strlen(v[1]);j++)printf("%c",d[t.find(v[1][j])]);}
JackMacWindows
источник
0

C 394 байта

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

char*K[3]={"!_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL\"POYGK<QF:/\\=^{`axje.uidchtnmbrl'poygk,qf;?|+~",
"!\"#$%&'()*+,-./0123456789Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJZ[\\]^_`abcsftdhuneimky;qprglvwxjz{|}~",
"!\"#$%&'()*+,-./0123456789Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJZ[\\]^_`avmhrtgyuneolkp;qwsbfcdxjz{|}~"};
main(int c,char**v){char*t=v[2];while(*t)putchar(*t>32?K[atoi(v[1])][*t-33]:*t),t++;}
Khaled.K
источник