Проблема розкладки клавіатури


14

Розкладка клавіатури, яку зазвичай використовують люди, - це макет QWERTY, як показано нижче.

QWERTY клавіатура

Але є й інші розкладки клавіатури:

ДВОРАК

Клавіатура DVORAK

КОЛЕМАК

Клавіатура COLEMAK

РОБОЧИЙ Клавіатура 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

Це тому найкоротша відповідь у байтах виграє!


1
Крім того, ще кілька тестових випадків були б корисні.
ETHproductions

1
@Tutleman Так, ви можете взяти, наприклад, 0 1 2

1
Зачекайте, чи можемо ми взяти, наприклад !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~, вхід для клавіатури Dvorak? Це може пом'якшити виклик ... Як щодо введення обмеження довжини чи чогось подібного?
ETHproductions

1
@EriktheOutgolfer Але тоді ви можете взяти, наприклад, !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\‌​=^{`axje.uidchtnmbrl‌​'poygk,qf;?|+~як вхід
ETHproductions

1
@ETHproductions Так, ви можете використовувати ці символи як вхідні дані, хоча макети взагалі не повинні залежати від їх побудови. Єдиним для них було б вибрати, який макет використовувати. 10 байт - фіксована межа (IMO занадто короткий), тому мені це не подобається. І так, ви говорите, що байти не знаки. Я думаю, що це повинно було бути пісочницею більше часу.
Ерік Аутгольфер

Відповіді:


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 - Workman.

В принципі, я не думаю, що це сильно відрізняється від інших відповідей. Більш зрозуміло, це виглядає приблизно так:

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

string#trФункція Ruby приймає два аргументи: рядок, що містить символи, які потрібно замінити, і рядок, що містить їх заміну. Корисно, воно дозволяє задавати діапазони символів за допомогою a-zсинтаксису. Інша ключова реалізація простору полягає в тому, що не потрібно включати символи, які однакові у всіх чотирьох макетах, що дозволило мені позбутися всіх цифр, букву "А" як у верхньому, так і в нижньому регістрі, і жменька спеціальні символи.

Ще один дивний синтаксис - це використання %W(). Це створює масив рядків, що містять усе, що знаходиться в круглих дужках, розділене пробілом. Всі перерви рядків у поданні насправді функціонують як роздільники елементів. %W()також дозволяє інтерполяцію рядків (що робиться з #{}оператором) - %w()було б те саме, але без рядкової інтерполяції.

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


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

@Shaggy Щоб цитувати один із коментарів запитувача до публікації, "ви можете взяти на приклад 0 1 2", саме це я і зробив.
Тутлеман

5

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

Бере ідентифікатор розкладки клавіатури kта масив символів aу синтаксисі currying (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відображається однаково на всіх макетах і ніколи не підлягає перекладу. Тому немає можливої ​​неоднозначності між цифрою, яка використовується для стиснення, і цифрою, що використовується для перекладу.

Декомпресія

н15н3-23375-225

Переклад

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


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

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

Пітон 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))

Добре зіграно :) Я не дуже хороший у python, тому я не можу вам допомогти з цим гольфом ^^

2

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

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

Рядки клавіатури були скопійовані безпосередньо з питання, тому звинувачуйте Антуана ЕТХ у будь-яких помилках!

Це приймає ціле число, що представляє розкладку клавіатури (0 для DVORAK, 94 для COLEMAK і 188 для WORKMAN) і масив рядка як аргументи за допомогою currying - наприклад, 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вхід, тому я думаю, що ви можете зберегти кілька байт, не зберігаючи Об'єкт у змінній. Це виглядатиме щось на кшталт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.
Спочатку натискає ідентифікатор, потім рядок, який ми хочемо транслітерувати.

Спробуйте в Інтернеті або перевірте повний діапазон 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])]);}

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