Wydrukuj klawiaturę QWERTY, używając klawiszy możliwie jak najbliżej siebie

19

wprowadź opis zdjęcia tutaj

Wyzwania są zwykle oceniane w bajtach lub czasami w odległości Levenshteina, ale w tym przypadku używamy odległości klawiatury - liczby klawiszy między klawiszami użytymi do wpisania programu (użyj powyższej klawiatury jako ostatecznego odniesienia). Na przykład odległość między Ai Fwynosi 3, ponieważ ścieżka wynosi A=> S=> D=> F. Odległość między Ni 5wynosi 4, ponieważ bez względu na wybraną ścieżkę wymaga co najmniej 4 kroków. Twoim zadaniem jest wyprowadzenie następujących danych (bez spacji końcowych), przy możliwie jak najmniejszej odległości klawiatury:

Q W E R T Y U I O P
 A S D F G H J K L
  Z X C V B N M

Zawijanie:

Aby ułatwić Ci życie, niektóre klawisze mogą owijać się wokół klawiatury. Left Shiftotacza Right Shift, Caps Lockotacza Enter, Tabotacza \i ~otacza Backspace. Na przykład odległość między Qi Pwynosi 5, ponieważ Q=> Tab=> \=> ]=> [=> P.

Uwaga: Zawijanie działa tylko w poziomie - nie można przejść od, powiedzmy, \doCaps Lock

Punktacja:

Wynik = odległość klawiatury + liczba bajtów

Przykładowe obliczenia:

print(5);

  • p=> r== 6
  • r=> i== 4
  • i=> n== 2
  • n=> t== 3
  • t=> (== 4
  • (=> 5== 4
  • 5=> )== 5
  • )=> ;== 2

Razem: 30 + 9 = 39 .

Uwagi:

  1. Małe i wielkie litery liczą się jako ten sam klawisz. Jeśli klucz ma dwa symbole (jak 7i &), są one również liczone jako ten sam klucz, nie trzeba włączać zmiany biegów.
  2. Niestety, jeśli twój kod wymaga symboli, których nie ma na klawiaturze, nie możesz go użyć.
  3. Na obrazie z klawiatury górny rząd można zignorować. Jedynym kluczem, którego możesz użyć w dolnym rzędzie, jestSpace
  4. Klucze należy wprowadzać w kolejności, nie można użyć klawiszy strzałek, aby przesunąć kursor, a następnie wprowadzić klucz.

Kalkulator wyników:

  • Zaktualizowano 27/27, aby naprawić `=> ]i powiązane błędy w obliczeniach. Sprawdź ponownie swoje wyniki, a prawdopodobnie będą mniejsze (mam nadzieję, że nie większe!)

Wklej tutaj swój kod, aby obliczyć wynik. Daj mi znać, jeśli kiedykolwiek wystąpi błąd lub zostanie wydrukowany niewłaściwy numer.

var keys = ["~1234567890-=←","\tqwertyuiop[]\\","↑asdfghjkl;\'\n","Lzxcvbnm,./R",
"AB      CDEF"];
var con =["`!@#$%^&*()_+{}|:\"<>?","~1234567890-=[]\\;\',./"];
function hexagon(k) {
  if(k === " ") return ["x","c","v","b","n","m",","];
  var p = pos(k);
  if(p === -1) return false;
  var row = p[0],col = p[1];
  var hexagon = [char(row,col-1,1),char(row-1,col),char(row-1,col+1),char(row,col+1,1),char(row+1,col),char(row+1,col-1)];
  return hexagon;
}

function char(r,c,wrap) {
  if(r < 0 || r >= keys.length) return "";
  if(r === keys.length-1 && 1 < c && c < 8) return " ";
  if(wrap) {
    if(c === -1) c = keys[r].length-1;
    if(c === keys[r].length) c = 0;
  }
  return keys[r].charAt(c);
}

function pos(c) {
    var row = -1, col = -1;
  for(var i = 0;i<keys.length;i++) {
    col = keys[i].indexOf(c)
    if( col != -1) { row = i; break;}
  }
  if(row === -1) return -1;
  return [row,col];
}


function dist(a,b,s,w) {
  if(typeof a === "object") {
    var list = [];
    for(var i = 0;i<a.length;i++) {
      list[i] = dist(a[i],b,s,w);
    }
    return list;
  }
  
	if(a==="") return Infinity;
  if(a===b) return 0;
  
 

  var p = pos(a);
  var q = pos(b);
  
  if(!w && a!==" ") {
    var chars = keys[p[0]].length;
    var opp = char(p[0],p[1] < chars/2 ? chars-1 : 0);
    return Math.min(dist(a,b,s,true),dist(a,opp,s,true)+dist(opp,b,s,true));
  }
  
   if(!s) { return Math.min(dist(a,b,true,w),dist(a," ",true,w)+dist(" ",b,true,w));}
  

   var h = hexagon(a);
  if(a === " ") return 1 + Math.min(...dist(h,b,true,w));
 if(p[0]<q[0]) {
  return 1 + Math.min(dist(h[4],b,s,w),dist(h[5],b,s,w)); 
  }
  else if(p[0] > q[0]) {
  return 1 + Math.min(dist(h[1],b,s,w),dist(h[2],b,s,w));
    }
  	if(b===" ") return Math.min(Math.abs(p[1]-7),Math.abs(2 - p[1]));
    var d = Math.abs(p[1]-q[1]);
    return Math.min(d,keys[p[0]].length-d);

  
  
  
  
}

function getTotalDistance(str) {
	for(var i = 0;i<con[0].length;i++)
  	str = str.replace(new RegExp("\\"+con[0].charAt(i),"g"),con[1].charAt(i));
  str = str.toLowerCase();
  var total = 0;
  for(var i = 0;i<str.length-1;i++) {
  	total += dist(str[i],str[i+1]);
  }
  return total;
} 
enter.onclick = function() {
 var a = getTotalDistance(program.value);
 var b = program.value.length;
 len.textContent = a;
 count.textContent = b;
 total.textContent = a+b;
};
<textarea rows=15 cols=40 id="program"></textarea>
<input type="submit" id="enter"/>
<div>
<div>Key distance: <span id="len"></span></div>
<div>Byte count: <span id="count"></span></div>
<div>Total: <span id="total"></span></div>
</div>

Związane z:

geokavel
źródło
9
powinniśmy podjąć kolejne wyzwanie: najkrótszy kod, aby zdobyć takie odpowiedzi. Myślę, że metoda punktacji jest bardziej interesująca niż pytanie.
Cyoce,
2
Ponadto, proszę, na miłość boską, ===chyba że z jakiegoś powodu chcesz , aby JS podstępnie wymuszał na twoim typie i ssał wydajność.
Cyoce
5
Każde zgłoszenie w Unary / Lenguage będzie miało wynik 0.
Dennis
1
@Dennis Czy można odpowiedzieć na to pytanie w tych językach? Mogę nałożyć ograniczenie na maksymalną długość programu.
geokavel
3
idk Myślę, że tak naprawdę nie jest w duchu rzeczy wyeliminowanie twórczego, ważnego języka na podstawie tego, że ... działa? czy rzecz jest dobra w tym języku? Nie wydaje się to niczym innym niż wyeliminowanie CJam lub Pyth, ponieważ ich odpowiedzi są tylko trochę za krótkie lub eliminują siatkówkę w przypadku pytań dopasowujących tekst, i tak dziwnie mnie uderzyło, że pierwsza odpowiedź stała się nieważna po opublikowaniu pomimo przybicia wyzwanie. Bardzo lubię dzielić się takimi odpowiedziami, kiedy język jest naprawdę popisany.
djechlin

Odpowiedzi:

5

Pyth, wynik 107 106 102

:jd"QWERTYUIOP
ASDFGHJKL
]XCVBNM""]"" Z

Wypróbuj online.

PurkkaKoodari
źródło
2
Twój wynik spadł o 2!
geokavel
Cngrt vry gd job.
geokavel
33

Unary , wynik ~ 6,1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

Nie jest to najbardziej „kreatywne” rozwiązanie, ale zajęło mojemu komputerowi około 3 minut, aby przekonwertować reprezentację base 2 na 10


To kiedyś mają punktację 0 , ale zasady punktacji zmienić.

Długość kodu: ~ 6,1 * 10 618

Odległość klucza: 0

Downgoat
źródło
3
Lol, nie rozumiem, jak to działa, ale to wkrótce będzie nieważne.
geokavel
1
@geokavel aww :( ale nie jest nieprawidłowy, miałby po prostu bardzo wysoki wynik
Downgoat
Tak, źle cię oceniam.
geokavel
3 minuty? Potrzebujesz lepszego konwertera . : P
Dennis,
2
Przewinąłem do końca twojego bloku kodu. Myślałem, że kod to 61032477390907355804 ...., a nie 61032477390907355804 ... zera. : P
Rɪᴋᴇʀ
6

Japt , wynik 123 119 118 116 106

42 41 40 bajtów + 81 78 77 75 66 odległość

"QWERTYUIOP
ASDFGHJKL
'ZXCVBNM"q qS r''"

(właściwe wyjście w polu „wyjście”)

Nicość
źródło
1
Twój wynik pozostaje taki sam.
geokavel
@geo już recalced :)
nicael
@geo Btw, możesz od razu edytować wyniki.
nicael
Znowu miło! Możesz zrobić "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>reprezentuje podział wiersza), ale wymaga to dwóch znaków innych niż klawiatura, więc myślę, że to nie jest legalne. Ale przynajmniej możesz usunąć przecinek, ponieważ jest on automatycznie wstawiany.
ETHprodukcje
@Eth Świetnie, dziękuję! Jeśli chodzi o podział linii, nie myśl, że jestem noobem w html; D
nicael
6

JavaScript (ES6), wynik 188

alert([...`QWERTYUIOP
ASDFGHJKL
`," Z",..."XCVBNM"].join` `)

Zaledwie ledwie osiąga lepszy wynik niż alert ciąg wyjściowy, ale jest to najlepsze podejście, jakie mogłem znaleźć ...: /

Bajty: 60

Kluczowa odległość: 128

użytkownik 81655
źródło
Próbowałem zmodyfikowanej wersji tego apporach: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)Chociaż działa, to 65 bajtów (wynik 231).
ETHproductions
2
Twój wynik jest teraz o 1 punkt mniejszy.
geokavel
5

Bash + Sed, 151

sed 'sb *.b& bg'<<<'QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM'
Alexander Vogt
źródło
Gratulacje, twój wynik jest o 1 punkt niższy dzięki nowej poprawce liczenia.
geokavel
1
@geokavel Thanks - naprawiono.
Alexander Vogt
5

Python, 157 , 156 , 211 , 221 punktów

Odległość klucza: 157

Bajty: 64

Ergo, łączny wynik to 221.

l=' '.join('QWERTYUIOP\nASDFGHJKL\nZXCVBNM')
print l[:42],l[42:]

Drukuje ciąg, ale musi dodać dodatkową spację. :( już dłużej.

Dlaczego @Pietu, dlaczego mi to zrobiłeś?

Rɪᴋᴇʀ
źródło
3
Twój wynik jest teraz o 1 niższy.
geokavel
Och, spoko. Dzięki @geokavel. Co zmieniło się w regulaminie?
Rɪᴋᴇʀ
Nie reguły, w kalkulatorze był błąd
geokavel
Spowoduje to wydrukowanie jednej zbyt wielu spacji na początku trzeciego wiersza.
PurkkaKoodari
Zmiażdżyłeś moje nadzieje swoimi prawdziwymi słowami. Ale dzięki za zwrócenie na to uwagi.
Rɪᴋᴇʀ
5

JavaScript, wynik 156 187

[...`QWERTYUIOP
ASDFGHJKL`].join` `+`
  Z X C V B N M`

Nieźle jak na JavaScript

Wypróbuj online


Zaalarmuj, zdobądź 186

alert([...`QWERTYUIOP
ASDFGHJKL`].join` `+`
  Z X C V B N M`)

Downgoat
źródło
Ale nie drukuje łańcucha, nie?
nicael
@nicael Mogę twierdzić, że korzystam z tego środowiska, które ma niejawne drukowanie / wydruk.
Downgoat
1
Wynik jest teraz o 1 niższy.
geokavel
@geokavel dzięki naprawiono
Downgoat
3
Tworząc własne środowisko, aby obejść wyniki, hmm? W każdym razie można to skrócić o bajt .
ETHproductions
4

Jolf , 118 + 51 = 169

Wypróbuj tutaj! (w objaśnieniu podkreślono używane miejsce)

R m{"QWERTYUIOP'ASDFGHJKL'ZXCVBNM"#DN+*S' RH' }"\n"
 _m                                                 map
   {"QWERTYUIOP'ASDFGHJKL'ZXCVBNM"#                  that array
                                   DN         }      with this function
                                     +*S'_            that concats (index many) spaces
                                          RH'_         with the inner array joined by spaces
R                                                    and join that
                                                      "\n"  with newlines

Jolf, aktualizacja po pytaniu, 76 + 21 = 97

Wypróbuj tutaj ! Ponownie często nie aktualizuję kodu, dopóki nie jest odpowiedni. Wciąż fajnie.

R mpHDN+*S' RH' }"\n"
 _m                   map
   pH                 the keyboard array [["Q","W",...,"P"],["A",...,"L"],["Z",...,"M"]]
     DN         }      with this function
       +*S'_            that concats (index many) spaces
            RH'_         with the inner array joined by spaces
R                     and join that
                 "\n"  with newlines
Conor O'Brien
źródło
4

Bash + sed, wynik 202 200

sed 's/\([^ ]\)/\1 /g'<<F
QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM
F
user2064000
źródło
1
Twój wynik spadł o 2!
geokavel
@geokavel, dzięki, i jest już naprawione.
user2064000,
0

Python, wynik 185

print" ".join("QWERTYUIOP\nASDFGHJKL\n")+"  Z X C V B N M"
JuanPotato
źródło