Klavye düzenleri zorluğu


14

Kişilerin yaygın olarak kullandıkları klavye düzeni, aşağıda gösterildiği gibi QWERTY düzenidir.

QWERTY klavye

Ancak başka klavye düzenleri de var:

DVORAK

DVORAK klavye

Colemak

COLEMAK klavye

WORKMAN WORKMAN klavye

Senin görevin

Kodunuz iki giriş alır: klavye düzeninin adı ve yazılacak bir dize. Amacınız QWERTY girişinizi sanki ilk parametre olarak verilen klavye düzeniyle yazıyormuş gibi dönüştürmektir.

kurallar

Giriş formatı ücretsizdir, dizeleri, dizileri vb. Kullanabilirsiniz. Ayrıca, bayt sayınızı azaltmak için düzenleri temsil etmek için üç farklı değeri kullanabilirsiniz, ancak her birinin 10 bayt veya daha az olarak temsil edilebilir olması gerekir.

Sadece beyaz arka plana sahip tuşları kullanmanız gerekir. Özellikle, yazdırılabilir ASCII karakterlerini QWERTY alfabesinden diğer alfabe harflerinden birine aktarmalısınız:

 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{|}~

(Not: bu @ETHproductions tarafından elle kopyalanmıştır, bu nedenle herhangi bir hata görürseniz lütfen bunları belirtin!)

Misal

DVORAK zZxX giriş çıkış olarak vereceği gibi ;:qQ

Bu yani bayt en kısa cevap kazanır!


1
Ayrıca, bazı test durumları da faydalı olacaktır.
ETHproductions

1
@Tutleman Evet, örneğin 0 1 2 alabilirsiniz

1
Bekle, örneğin !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~Dvorak klavyesinin girişi olarak alabilir miyiz ? Bu meydan okumayı önemsizleştirecek ... Bir uzunluk sınırlaması veya benzer bir şey getirmeye ne dersiniz?
ETHproductions

1
@EriktheOutgolfer Ama sonra örneğin !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\‌​=^{`axje.uidchtnmbrl‌​'poygk,qf;?|+~girdi olarak alabilirsiniz
ETHproductions

1
@ETHproductions Evet, bu karakterlerin girdi olarak kullanılabilmesine rağmen, düzenlerin oluşturulacak karakterlere hiç bağlı olmaması gerekir. Onlar için tek kullanım, kullanılacak düzeni seçmek olacaktır. 10 bayt sabit bir sınırdır (IMO çok kısa), bu yüzden sevmiyorum. Ve evet, karakter değil, bayt diyorsunuz. Bence bu daha uzun süre korumalı olmalı.
Outgolfer Erik

Yanıtlar:


3

Yakut , 258 247 238 bayt

->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]}

Çevrimiçi deneyin!

Bu, iki bağımsız değişkeni alan bir işlevdir: değiştirilecek ileti ve değiştirilecek düzeni temsil eden 0-2 değeri; burada 0 Dvorak'a, 1 Colemak'a ve 2 de Workman'a karşılık gelir.

Temel olarak, bunun diğer cevaplardan çok farklı olduğunu düşünmüyorum. Daha okunaklı bir şekilde, şöyle görünür:

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

Ruby'nin string#trişlevi iki bağımsız değişken alır: değiştirilecek karakterleri içeren bir dize ve bunların değiştirilmesini içeren bir dize. Yararlı bir şekilde, a-zsözdizimi kullanarak karakter aralıklarını belirtmenize izin verir . Yerden tasarruf sağlayan bir diğer önemli fark da, tüm düzenlerden, hem büyük hem de küçük harflerde "A" harfinden ve bir avuç harfden kurtulmama izin veren dört düzende de aynı olan karakterleri eklemenin gerekli olmamasıdır. özel karakterler.

Bir diğer garip sözdizimi de kullanımıdır %W(). Bu, parantez içindeki boşlukla ayrılmış her şeyi içeren bir dizeler dizisi oluşturur. Gönderimdeki tüm satır aralıkları aslında öğe ayırıcılar olarak işlev görür. %W()Ayrıca dize enterpolasyonuna izin verir ( #{}operatör ile yapılır ) - %w()aynı şey olurdu, ancak dize enterpolasyonu olmadan.

Ayrıca, her zaman herkesten tamamen farklı olma ısrarı ile optimizasyon planlarımı bozduğu için Dvorak'ı suçlamak için biraz zaman ayırmak istiyorum; bir Qwerty / Colemak / Workman çözümü çok güzel olabilirdi ...


Gereksinimleri karşılamak için eşlenecek klavyenin temsili olarak bir tam sayı almak mı? Test durumu açıkça klavyenin adını gerektiriyor gibi görünüyor, ancak kurallar herhangi bir girdinin klavyeyi temsil etmesine izin veriyor gibi görünüyor.
Shaggy

@Shaggy Askerin yayındaki yorumlarından birini alıntılamak için, "yaptığım tam olarak budur, örneğin 0 1 2 alabilirsin".
Tutleman

5

JavaScript (ES7), 282 273 251 250 bayt

Curry sözdiziminde bir klavye düzeni kimliği kve bir dizi karakter alır . Çevrilmiş karakterler dizisini döndürür.a(k)(a)

Düzen kimlikleri:

  • 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)

Çevrimiçi deneyin!

Nasıl çalışır

Sıkıştırma

Üç hedef mizanpajın her biri, her karakterin ikisinden biri olan tek bir sıkıştırılmış dizede saklanır:

  • QWERTY'den bir çeviri karakteri
  • çevrilmesi gerekmeyen ardışık karakter sayısını temsil eden bir rakam

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

Örneğin, #$%&-()*Dvorak olarak saklanır 3-2için #$%&ve ()*QWERTY özdeş eşleşmeleri ve sadece -gerçek tercümesidir.

Özellikle, 0123456789tüm mizanpajlarda aynı şekilde eşlenir ve asla çevrilmesi gerekmez. Bu nedenle, sıkıştırma için kullanılan bir rakam ile çeviri için kullanılan bir rakam arasında olası bir belirsizlik yoktur.

Baskıyı azaltma

n15n3-23375-225

Tercüme

İçindeki her karakter ciçin a, sıkıştırılmamış düzen dizesinde ofset olarak tkullanarak çeviri karakterini kayıklıyoruz ve bunun bir rakam olup olmadığını test ediyoruz 1/t. Öyleyse, cbunun yerine orijinal karakteri çıkarırız.


Sana doff yapabilmem için aşağıya şapka takmak zorunda kaldım! Birinin beni döveceğini biliyordum ama tarzında dövüldüğüm için mutluyum. Bu şaheseri tam olarak nasıl çektiğinizi sindirmeyi bitirir bitirmez oyumu alacaksınız.
Shaggy

4

Retina , 273 270 bayt

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.*
^.

Çevrimiçi deneyin! Tek bir harf ile mesaj önüne D, Cya Wistenen klavye düzeni için. Ne yazık ki Retina, bir sürü sihirli mektubu destekliyor ( pbariz olanı, ama ben bir dalıntı yapmayı başardım), v-xbunun yerine kullanabilmem dışında hepsi alıntılanmalıdır v\wx. Düzenleme: @ETHproductions sayesinde 3 bayt kaydedildi.


Eğer -karakteri aralıkları temsil, seni değiştirerek bazı kurtarabilecek düşünmek <-@ABCiçin <-C.
ETHproductions

@ETHproductions Ha, neden büyük harf versiyonunda göz ardı ettiğimi merak ediyorum ...
Neil

3

PHP, 364 Bayt

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

Dizi, anahtarın 0 = W, 1 = C, 2 = D olduğu 3 dizi içerir.

Çevrimiçi deneyin!


2

Python 2, 422 bayt

Düzenleri akıllıca bir şekilde birleştirmeye çalıştı, ancak pek yardımcı olmadı.
Çevrimiçi deneyin

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

İyi oynandı :) Gerçekten python iyi değilim bu yüzden gerçekten bu golf size yardımcı olamaz ^ ^

2

JavaScript (ES6), 461 409 404 395 385 bayt

Bir otobüste otururken telefonumda aşağıdaki orijinal versiyonunu yazdım ve daha sonra golf oynamak için zamanım bitti, böylece takip etmek için daha fazla çatırtı var. Şimdiye kadar yardım için @ETHproductions'a teşekkürler.

Klavye dizeleri doğrudan sorudan kopyalandı, bu nedenle herhangi bir hata için Antoine ETH'yi suçlayın!

Bu, klavye düzenini temsil eden bir tamsayıyı (DVORAK için 0, COLEMAK için 94 ve WORKMAN için 188) ve dizenin bir dizisini curried (ör . f(0)(["z","Z","x","X"])Çıktılar) gibi argümanlar olarak alır ;: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``

Dene

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>


Aslında dizeleri derledim: P
ETHproductions

Bakalım ... asla QWERTYgiriş olarak almayacaksınız , bu yüzden Object'i bir değişkende saklayarak bazı baytlar kaydedebileceğinizi düşünüyorum. Şöyle bir şey olurdus=>[...s].map(c=>({D:"...",C:"...",W:"..."}[k[0]]["...".indexOf(c)]).join``
ETHproductions

Aha, evet, doğrudan nesnenin dışında çalışmanın bir yolu olduğunu biliyordum, map()ama zamanım bitti - ister inanın ister inanmayın, bunu sinemaya giden otobüste otururken yazdım. Öneriniz ve yarın kendimi tespit ettiğim birkaç iyileştirmeyle güncelleyeceğim.
Shaggy

1

05AB1E , 199 192 187 bayt

ž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.;}‡‡

1DVORAK için kimlikleri kullanır ; 2COLEMAK ve 3WORKMAN için.
Önce kimliği, sonra harf çevirmek istediğimiz dizeyi iter.

Çevrimiçi deneyin veya her üçü için de tam ASCII aralığını doğrulayın .

Açıklama:

ž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)

Sıkıştırılmış dizelerin nasıl çalıştığını anlamak için bu 05AB1E benim ipucuma bakın ( sözlüğün parçası olmayan dizeleri nasıl sıkıştırırım? ) .


1

C ++, 528 bayt

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

İle çalıştırın ./multitrans <0-2> <string>burada 0 = Dvorak, 1 = Colemak, ve 2 = Workman.

Aşağıda kodu biraz daha okunabilir hale getirmek için aralarında yeni satırlar ekledim. Bu kod, Qwerty karakterine bakmanın çeviriyi döndürdüğü dizelerden bir çeviri haritası oluşturur ( t[0]['s'] = 'o's için Dvorak'a) ve sonra çevirmek için haritayı kullanır. Çeviri dizeleri kısaltılır, çünkü bazı karakterlerin hiçbir zaman değiştirilmesi gerekmez. Yine de muhtemelen daha da azaltılabilir.

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

Ekstra: Qwerty -> Sadece Dvorak (197 bayt)

Son zamanlarda Qwerty'yi Dvorak'a dönüştüren bu kodu yazdım, ancak büyük harfler çevrilmemiş.

#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 bayt

Çevrimiçi Deneyin

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.