QWERTY klavyeyi mümkün olduğunca birbirine yakın tuşlar kullanarak yazdırın


19

resim açıklamasını buraya girin

Normal olarak, zorluklar bayt veya bazen Levenshtein mesafesinde puanlanır, ancak bunun için klavye mesafesini kullanıyoruz - programı yazmak için kullanılan tuşlar arasındaki tuş sayısı (kesin referans olarak yukarıdaki klavyeyi kullanın). Örneğin, arasındaki mesafe Ave Fyol olduğu için, 3, A=> S=> D=> F. Arasındaki mesafe Nve 5sen almak yolunda olursa olsun, en az 4 adımları gerektirir, çünkü 4'tür. Göreviniz, mümkün olduğunca küçük bir klavye mesafesi ile aşağıdakileri (arka boşluklar hariç) çıkarmaktır:

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

Sarma:

Hayatınızı kolaylaştırmak için bazı tuşlar klavyenin etrafına dolanabilir. Left Shiftsarar Right Shift, Caps Locksarar Enter, Tabsarar \ve ~sarar Backspace. Örneğin, arasındaki mesafe Qve P, 5, çünkü Q=> Tab=> \=> ]=> [=> P.

Not: Paketleme sadece yatay çalışır - Eğer gelen adım diyemeyiz, \hiçCaps Lock

puanlama:

Puan = Klavye mesafesi + bayt sayısı

Örnek Hesaplama:

print(5);

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

Toplam: 30 + 9 = 39 .

Notlar:

  1. Küçük ve büyük harfler aynı tuş olarak sayılır. Bir anahtarın üzerinde iki sembol varsa ( 7ve gibi &), aynı anahtar olarak sayılırlar, kaydırmayı itmeye gerek yoktur.
  2. Ne yazık ki, kodunuz klavyede olmayan semboller gerektiriyorsa, kodu kullanamazsınız.
  3. Klavye görüntüsünde, üst satır göz ardı edilebilir. Alt satırda kullanabileceğiniz tek anahtarSpace
  4. Tuşlar sırayla girilmelidir, ok tuşunu hareket ettirmek için ok tuşlarını kullanamazsınız ve ardından bir tuş giremezsiniz.

Puan Hesaplayıcı:

  • `=> ]Ve ilgili yanlış hesaplamaları düzeltmek için 12/27 tarihinde güncellendi . Puanlarınızı tekrar kontrol edin ve muhtemelen daha küçük olacaktır (umarım daha büyük değildir!)

Skoru hesaplamak için kodunuzu buraya yapıştırın. Bir hata alırsanız veya yanlış numarayı yazdırırsanız bana bildirin.

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>

İlişkili:


9
başka bir zorluk çıkarmalıyız: böyle cevapları puanlamak için en kısa kod. Puanlama yönteminin sorudan daha ilginç olduğunu düşünüyorum.
Cyoce

2
Ayrıca, ===bazı nedenlerden dolayı JS'nin türlerinizi gizlice zorlamasını ve performansı emmesini istemediğiniz sürece , tanrı sevgisi için lütfen .
Cyoce

5
Unary / Lenguage'de herhangi bir başvuru 0 puan alacaktır.
Dennis

1
@Dennis Buna bu dillerde cevap vermek mümkün müdür? Maksimum program uzunluğuna bir kapak koyabilirim.
geokavel

3
idk Bence yaratıcı, geçerli bir dili çalıştığı gerekçesiyle ortadan kaldırmak gerçekten şeylerin ruhunda değil. dilin iyi olduğu şey nedir? Bu, CJam veya Pyth'i ortadan kaldırmaktan farklı görünmüyor çünkü cevapları biraz fazla kısa veya metin eşleştirme soruları için Retina'yı ortadan kaldırıyor ve evet, en üstteki cevabın çivilemeye rağmen gönderildikten sonra geçersiz hale gelmesi garip geldi. meydan okuma. Dil gerçekten gösterildiğinde böyle cevapları paylaşmaktan gerçekten keyif alıyorum.
djechlin

Yanıtlar:



33

Tekli , skor ~ 6.1 * 10618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

En "yaratıcı" çözüm değil ama bu benim temel ~ 2 temeli 10 temel dönüştürmek için benim bilgisayar ~ 3 dakika sürdü


Bu alışık bir var 0 puan , ancak puanlama kuralları değişti.

Kod Uzunluğu: ~ 6.1 * 10618

Anahtar Mesafesi: 0


3
Lol, bunun nasıl çalıştığını anlamıyorum, ama bu yakında geçersiz olacak.
geokavel

1
@geokavel aww :( ama geçersiz değil, sadece çok yüksek bir puan
alacaktı

Evet, sana bir oy vereceğim.
geokavel

3 dakika? Daha iyi bir dönüştürücüye ihtiyacınız var . : P
Dennis

2
Kod bloğunuzun sonuna kaydırdım. Kodun 61032477390907355804 .... olduğunu düşündüm, 61032477390907355804 ... sıfır değil. : P
Rɪᴋᴇʀ

6

Japt , skor 123 119 118 116 106

42 41 40 bayt + 81 78 77 75 66 mesafe

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

("çıkış" kutusunda uygun çıktı)


1
Puanınız aynı kalır.
geokavel

@geo already recalced :)
nicael

@geo Btw, skorları hemen düzenleyebilirsiniz.
nicael

Yine güzel! Yapabilirsiniz "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>satır sonunu temsil eder), ancak bu iki klavye olmayan karakter gerektirir, bu yüzden sanırım yasal değil. Ancak en azından virgül otomatik olarak eklendiği için kaldırabilirsiniz.
ETHproductions

@ Harika, teşekkürler! Satır sonu gelince,
html'de

6

JavaScript (ES6), puan 188

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

Sadece sadece alertçıktı dizesini ing daha iyi bir puan alır ama bulabildiğim en iyi yaklaşım ...: /

Bayt: 60

Anahtar Mesafesi: 128


Bu apporach'ın değiştirilmiş bir versiyonunu denedim: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)Bu çalışırken 65 bayt (skor 231).
ETHproductions

2
Puanınız 1 puan daha küçük ..
geokavel


5

Python, 157 , 156 , 211 , 221 puan

Anahtar Mesafe: 157

Bayt: 64

Ergo, toplam puan 221.

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

Dizeyi yazdırır, ancak fazladan boşluk eklemelidir. :( şimdi daha uzun.

Neden @ Pietu, bunu neden bana yaptın?


3
Puanınız 1 düşük.
geokavel

Ooh, havalı. Teşekkürler @geokavel. Kurallarda neler değişti?
Rɪᴋᴇʀ

Kural değil, hesap makinesinde bir hata
oluştu

Bu, üçüncü satırın başına çok fazla boşluk basar.
PurkkaKoodari

Gerçek sözlerinle umutlarımı ezdin. Ama bunu işaret ettiğiniz için teşekkürler.
R

5

JavaScript, puan 156 187

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

JavaScript için fena değil

Çevrimiçi deneyin


Alarmla, skor 186

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


Ama ipi yazdırmıyor, değil mi?
nicael

@nicael Örtük yazdırma / çıktıya sahip bu ortamı kullandığımı iddia edebilirim .
Downgoat

1
Puan 1 şimdi daha düşük.
geokavel

@geokavel teşekkürler sabit
Downgoat

3
Çıktı almak için kendi ortamınızı icat etmek, hmm? Her neyse, bunu bir bayt ile kısaltmak mümkündür .
ETHproductions

4

Jolf , 118 + 51 = 169

Burada deneyin! (kullanılan alanı belirtmek için kullanılan açıklamadaki alt çizgiler)

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, soru sonrası güncelleme, 76 + 21 = 97

Burada deneyin ! Yine, kodumu alakalı olana kadar sık ​​sık güncellemiyorum. Hala eğlenceli.

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

Bash +, sed puanı 202 200

sed 's/\([^ ]\)/\1 /g'<<F
QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM
F

1
Puanınız 2 puan düştü!
geokavel

@geokavel, teşekkürler ve düzeltildi.
user2064000

0

Python, skor 185

print" ".join("QWERTYUIOP\nASDFGHJKL\n")+"  Z X C V B N M"
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.