Распечатайте 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и& ), они также считаются одной и той же клавишей, нет необходимости включать нажатие клавиши shift.
  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>

Связанный:

geokavel
источник
9
мы должны сделать еще одну проблему: самый короткий код, чтобы набрать ответы, как это. Я думаю, что метод подсчета очков более интересен, чем вопрос.
Cyoce
2
Также, пожалуйста, из любви к Богу === если только по какой-то причине вы не хотите, чтобы JS скрытно принуждал ваши типы и высасывал производительность.
Cyoce
5
Любая подача в Unary / Lenguage будет иметь оценку 0.
Деннис
1
@ Денис Можно ли ответить на это на этих языках? Я могу поставить ограничение на максимальную длину программы.
геокавель
3
idk Я думаю, что это действительно не в духе вещей, чтобы исключить творческий, действительный язык на том основании, что это ... работает? хорошо ли владеет языком? Это ничем не отличается от устранения CJam или Pyth, потому что их ответы слишком короткие или исключают Retina для вопросов, связанных с текстом, и да, мне показалось странным, что верхний ответ стал недействительным когда-то после публикации, несмотря на то, что вызов. Мне действительно нравится делиться такими ответами, когда язык действительно хвастается.
джехлин

Ответы:

33

Одинарный , оценка ~ 6,1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

Не самое «креативное» решение, но моему компьютеру потребовалось ~ 3 минуты, чтобы преобразовать представление из базы 2 в базу 10


Эта используется , чтобы иметь оценку 0 , но правила скоринга изменились.

Длина кода: ~ 6,1 * 10 618

Ключевое расстояние: 0

Downgoat
источник
3
Lol, я не понимаю, как это работает, но это скоро будет недействительным.
геокавель
1
@geokavel aww :( но не недействительно, у него был бы очень высокий балл
Downgoat
Да, я вас возбуждаю.
геокавель
3 минуты? Вам нужен лучший конвертер . : P
Деннис
2
Я прокрутил до конца ваш блок кода. Я думал, что код был 61032477390907355804 ...., а не 61032477390907355804 ... нули. : P
Rɪᴋᴇʀ
6

Japt , оценка 123 119 118 116 106

42 41 40 байт + 81 78 77 75 66 расстояние

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

(правильный вывод в поле «вывод»)

nicael
источник
1
Ваш счет остается прежним.
геокавель
@geo уже вспомнил :)
nicael
@geo Кстати, вы можете редактировать оценки сразу.
Никаэль
Хорошо снова! Вы могли бы сделать "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>представляет разрыв строки), но это требует двух символов без клавиатуры, поэтому я думаю, что это не законно. Но по крайней мере вы можете удалить запятую, так как она автоматически вставляется.
ETHproductions
@ Отлично, спасибо! Что касается разрыва строки, не думайте, что я нуб в html; D
nicael
6

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

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

Только едва получает лучший результат, чем alert вывод строки, но это лучший подход, который я мог найти ...: /

Б: 60

Ключевое расстояние: 128

user81655
источник
Я попробовал модифицированную версию этого apporach: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)хотя это работает, это 65 байт (оценка 231).
ETHproductions
2
Ваша оценка на 1 балл меньше.
geokavel
5

Баш + Сед, 151

sed 'sb *.b& bg'<<<'QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM'
Александр Фогт
источник
Поздравляю, ваш счет на 1 балл ниже с новым исправлением подсчета.
геокавель
1
@geokavel Спасибо - исправлено.
Александр Фогт
5

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

Ключевое Расстояние: 157

Байт: 64

Ergo, общий балл 221.

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

Печатает строку, но должен добавить дополнительный пробел. :( теперь дольше.

Почему @Pietu, почему ты сделал это со мной?

Rɪᴋᴇʀ
источник
3
Ваш счет на 1 ниже.
геокавель
Ох, круто. Спасибо @geokavel. Что изменилось в правилах?
Rɪᴋᴇʀ
Не норм, была ошибка в калькуляторе
geokavel
Это печатает слишком много пробелов в начале третьей строки.
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`)

Downgoat
источник
Но это не печатает строку, нет?
Никаэль
@nicael Я могу утверждать, что я использую эту среду, которая имеет неявную печать / вывод.
Downgoat
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
Конор О'Брайен
источник
4

Баш + седь, оценка 202 200

sed 's/\([^ ]\)/\1 /g'<<F
QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM
F
user2064000
источник
1
Ваш счет понизился на 2!
геокавель
@geokavel, спасибо, и это сейчас исправлено.
user2064000
0

Питон, оценка 185

print" ".join("QWERTYUIOP\nASDFGHJKL\n")+"  Z X C V B N M"
JuanPotato
источник