Роздрукуйте клавіатуру QWERTY за допомогою клавіш, максимально наближених


19

введіть тут опис зображення

Зазвичай виклики оцінюються в байтах або іноді відстані Левенштейна, але для цього ми використовуємо відстань на клавіатурі - кількість клавіш між клавішами, які використовуються для введення програми (використовуйте вищевказану клавіатуру в якості остаточного посилання). Наприклад, відстань між Aі Fдорівнює 3, оскільки шлях дорівнює A=> S=> D=> F. Відстань між Nі 5становить 4, тому що незалежно від того, яким шляхом ви пройшли, для цього потрібно як мінімум 4 кроки. Ваше завдання - вивести наступне (не включаючи пробіли) з якомога меншою відстані клавіатури:

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

Обгортання:

Щоб полегшити ваше життя, певні клавіші можуть обмотатися навколо клавіатури. Left Shiftобгортати Right Shift, Caps Lockобгортати Enter, Tabобгортати \та ~обгортати Backspace. Наприклад, відстань між Qі Pстановить 5, тому що Q=> Tab=> \=> ]=> [=> P.

Примітка: обгортання працює лише горизонтально - ви не можете переходити від, скажімо, \доCaps Lock

Оцінка:

Оцінка = Відстань клавіатури + кількість байтів

Приклад розрахунку:

print(5);

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

Разом: 30 + 9 = 39 .

Примітки:

  1. Малі та великі літери вважаються одним і тим же ключем. Якщо на ключі є два символи (як 7і &), вони також вважаються одним і тим же ключем, не потрібно включати натискання зсуву.
  2. На жаль, якщо ваш код вимагає символів, які відсутні на клавіатурі, ви не можете його використовувати.
  3. На зображенні клавіатури верхній рядок можна ігнорувати. Єдиний ключ, який ви можете використовувати в нижньому рядку, - цеSpace
  4. Клавіші повинні бути введені для того, щоб ви не могли використовувати клавіші зі стрілками для переміщення каретки та введення ключа.

Оцінка калькулятор:

  • Оновлено 12/27 для виправлення `=> ]та пов’язаних з цим прорахунків. Перевірте свої результати ще раз, і вони, ймовірно, будуть меншими (сподіваємось, не більшими!)

Вставте тут свій код, щоб розрахувати бал. Повідомте мене, якщо ви коли-небудь отримаєте помилку або вона виводить неправильне число.

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>

Пов'язані:


9
нам слід зробити ще одне завдання: найкоротший код, щоб набрати відповіді, як це. Я думаю, що метод підрахунку балів цікавіший, ніж питання.
Кіос

2
Крім того, будь ласка про любов до бога, ===якщо з якоїсь причини ви не хочете, щоб JS підступно примушував свої типи і не піддавався ефективності.
Кіос

5
Будь-яке подання в Unary / Lenguage матиме бал 0.
Денніс

1
@Dennis Чи можна відповісти на це тими мовами? Я можу поставити обмеження на максимальну довжину програми.
геокавель

3
idk Я думаю, що це справді не в дусі речей, щоб усунути творчу, дійсну мову на основі того, що це ... працює? чи річ у мові гарна? Це нічим не відрізняється від усунення CJam або Pyth, тому що їх відповіді трохи занадто короткі або усунення сітківки для відповідності тексту, і так, мені дивно, що головна відповідь стала недійсною колись після публікації, незважаючи на прибиття виклик. Мені дуже подобається ділитися такими відповідями, коли мова справді демонструється.
djechlin

Відповіді:



33

Унарна , оцінка ~ 6,1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

Це не найбільш "креативне" рішення, але на моєму комп'ютері знадобилося ~ 3 хвилини, щоб перетворити представлення базового 2 на це 10


Це використовується , щоб мати оцінку 0 , але правила скорингу змінилися.

Довжина коду: ~ 6,1 * 10 618

Ключова відстань: 0


3
Lol, я не розумію, як це працює, але це стане недійсним незабаром.
геокавель

1
@geokavel aww :( але не недійсний, він би просто мав дуже високий бал
Downgoat

Так, я не можу дати вам нагороду.
геокавель

3 хвилини? Вам потрібен кращий конвертер . : P
Денніс

2
Я прокрутив до кінця ваш блок коду. Я думав, що код 61032477390907355804 ...., а не 61032477390907355804 ... нулі. : P
Rɪᴋᴇʀ

6

Захват , оцінка 123 119 118 116 106

42 41 40 байт + 81 78 77 75 66 відстань

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

(належний вихід у вікні "вихід")


1
Ваш рахунок залишається однаковим.
геокавель

@geo вже відкликав :)
nicael

@geo Btw, ви можете редагувати бали відразу.
нікель

Приємно ще раз! Можна зробити "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>представляє розрив рядка), але для цього потрібні два символи не клавіатури, тому я думаю, що це не є законним. Але принаймні ви можете зняти кому, оскільки вона автоматично вставляється.
ETHproductions

@Eth Чудово, дякую! Щодо розриву рядків, не думайте, що я noob у html; D
nicael

6

JavaScript (ES6), оцінка 188

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

Лише лише ледве отримує кращу оцінку, ніж alertангл. Вихідний рядок, але це найкращий підхід, який я міг знайти ...: /

Байтів: 60

Ключова відстань: 128


Я спробував модифіковану версію цього апарату: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)Хоча це працює, це 65 байт (оцінка 231).
ETHproductions

2
Зараз ваш бал на 1 бал менший ..
geokavel


5

Пітон, 157 , 156 , 211 , 221 бал

Ключова відстань: 157

Байтів: 64

Ерго, загальний бал 221.

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

Друкує рядок, але має додати додаткове місце. :( зараз довше.

Чому @Pietu, чому ти мені це зробив?


3
Зараз ваш результат на 1 нижчий.
геокавель

Ой, круто. Дякую @geokavel. Що змінилося в правилах?
Rɪᴋᴇʀ

Не правила, в калькуляторі була помилка
геокавель

Це друкує занадто багато пробілів на початку третього рядка.
PurkkaKoodari

Ви розчавили мої сподівання своїми правдивими словами. Але дякую, що вказали на це.
Rɪᴋᴇʀ

5

JavaScript, оцінка 156 187

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

Непогано для JavaScript

Спробуйте в Інтернеті


З настороженості оцінка 186

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


Але це не друкує рядок, ні?
nicael

@nicael Я можу стверджувати, що я використовую це середовище, яке має неявні друк / вихід.
Пуховик

1
Оцінка зараз на 1 нижче.
геокавель

@geokavel зафіксована подяка
Downgoat

3
Придумуючи власне середовище, щоб обійти вихід, гм? У будь-якому випадку це можна скоротити на байт .
ETHproductions

4

Джольфа , 118 + 51 = 169

Спробуйте тут! (підкреслює в поясненні, що використовується для позначення використовуваного простору)

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

Джольф, оновіть пост-питання, 76 + 21 = 97

Спробуйте тут ! Знову ж таки, я часто не оновлюю свій код, поки це не потрібно. Ще весело.

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


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