Which Row is the Key On?

39

1

Given any of the following characters (or a newline):

`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:"zxcvbnm,./ZXCVBNM<>?

Your program must output the row that it is on the keyboard


Because my keyboard is (almost) out of battery, your code must be as short as possible


The keyboard your program should use (for the row lookup), should look like:


Row 1:~` !1@2 #3$4 %5^6 &7*8 (9)0 _-+=                          

Row 2:                         Q W E R T Y U I O P {[ }]    |\   
Row 3:                              A S D F G H J K L :; "' return  
Row 4:                                 Z X C V B N M <, >. ?/                 
Row 5:                                                    space                                                   

Where   return is a newline. Empty keys don't mean anything.

Examples

"$"
1

"R"
2

"a"
3

"?"
4

"\n"
3

" "
5

where \n is a newline character.

Specifications

  • Your program should be case insensitive
  • Your program only needs to handle the characters on the keyboard shown

Downgoat

Posted 2016-01-07T01:20:20.337

Reputation: 27 116

3Perhaps [tag:classification]? – lirtosiast – 2016-01-07T01:42:35.857

3Is that a double-nested kbd? – Conor O'Brien – 2016-01-07T04:04:02.047

I remember years ago using some language that returned keypresses as as 100×row+position... Would have been perfect for this, but unfortunately I don't remember what it was. Maybe some form of BASIC... – Adám – 2016-01-07T13:35:39.230

@NBZ Is it Blitz Basic? – wizzwizz4 – 2016-01-07T18:43:28.963

@wizzwizz4 No, sorry. – Adám – 2016-01-07T18:59:24.877

@NBZ Do you by any chance have a working copy of Blitz Basic? I have a trial that it is legal to distribute, but it has no debugger etc. and it deletes it's executables after it is executed etc. – wizzwizz4 – 2016-01-07T19:04:20.427

@wizzwizz4 No. I used to use various BASIC flavours as a kid, but now I exclusively program in APL (it's my job), and a little JavaScript when I have no choice. – Adám – 2016-01-07T19:09:44.110

@NBZ That comment just makes me sad. You don't have a copy of the now discontinued Blitz Basic, and you only use JavaScript when you have no choice?!? :-( – wizzwizz4 – 2016-01-07T19:13:38.057

@wizzwizz4 Have you ever used an APL language (J, K, Q...)? Once you get into it, using any other language feels very limiting. – Adám – 2016-01-07T19:50:15.177

ewww, QWERTY! :-( – Toby Speight – 2016-01-07T20:44:09.257

1@wizzwizz4 Have you tried BlitzPlus? it's free and looks like it's what you want. – HolyBlackCat – 2016-01-25T22:42:00.930

@HolyBlackCat Yes!!! Yes yes yes!!! Unfortunately, the original Blitz Basic software no longer exists, but BlitzPlus looks like the same programming language. Thank you! – wizzwizz4 – 2016-01-26T16:44:27.560

Related: A keyboard so real you can almost TASTE it

– sergiol – 2017-10-30T02:06:29.657

can we return the row 0-indexed? – Brian H. – 2017-12-20T16:43:33.253

Answers

6

Pyth, 62 66 65 bytes

?zh@+,4Zmid2c.Bi."0fÀÓ¸[9Ѷ¤KïLäHÉðbÀ`]ü©¬vS"16 2-CzCd3

Try it online.

Uses a packed string representing a number in hex which, when chopped into two-bit chunks, represents the row of every character except and ! as a value from 0 to 3. We leave out and ! so we don't have to store 4 or have a 0 at the start of this number, then add their row values using +,4Z. Once we've turned the string into row values, all we have to do is use the character code of the input to index into the array of values, and then add 1.

Newline is handled separately because it's interpreted by Pyth as an empty string and so has a character code of 0.

This would be shorter if I could figure out how to use base 256 in Pyth, but I can't quite make it work.

Luke

Posted 2016-01-07T01:20:20.337

Reputation: 5 091

4o.0 starts squeezing Japt – nicael – 2016-01-07T21:25:42.610

this puts me to shame – JuanPotato – 2016-01-07T23:14:56.117

:( I forgot about newline! @nicael you're back to being on top. – Luke – 2016-01-07T23:45:00.363

Now we're dead even! – Luke – 2016-01-07T23:49:11.917

You need to escape null bytes in Pyth. – lirtosiast – 2016-01-07T23:49:37.923

@ThomasKwa do you mean to use base 256? Maybe we can discuss in Pyth chat. – Luke – 2016-01-07T23:52:50.110

Yes. I think it would be shorter to subtract each from 5 so you don't have null bytes--that saves you the h so it only costs one byte. Also Cd is shorter than 32. – lirtosiast – 2016-01-07T23:55:47.467

12

JavaScript (ES6), 105 102 101 bytes

c=>/[~`0-9!@#-&^(-+_=-]/.test(c)+/[asdfghjkl;:'"\n]/i.test(c)*3+/[zxcvbnm,<.>/?]/i.test(c)*4||++c*7^2

Explanation

In JavaScript test returns a boolean which acts the same as 1 or 0 so I multiply them by their row. Testing for row 2 took the most bytes so I used that one as the default if no others matched.

c=>
  /[~`0-9!@#-&^(-+_=-]/.test(c)   // row 1 regex
  +/[asdfghjkl;:'"\n]/i.test(c)*3 // row 3 regex
  +/[zxcvbnm,<.>/?]/i.test(c)*4   // row 4 regex
  ||++c                           // space ++ = 1, any character on row 2 ++ = NaN
    *7^2                          // 7 XOR 2 = 5, NaN XOR 2 = 2

Test

var solution = c=>/[~`0-9!@#-&^(-+_=-]/.test(c)+/[asdfghjkl;:'"\n]/i.test(c)*3+/[zxcvbnm,<.>/?]/i.test(c)*4||++c*7^2
<textarea id="input">-</textarea><br />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>

user81655

Posted 2016-01-07T01:20:20.337

Reputation: 10 181

1ockquote>

NaN XOR 2 = 2 — ???

– lirtosiast – 2016-01-07T03:05:23.407

1@ThomasKwa That's just how JS works lol. If c="q", ++c = NaN, NaN*7 = NaN, NaN^2 converts the operands to integers (uncastables like NaN become 0) then does 0 XOR 2 which is 2. – user81655 – 2016-01-07T03:10:22.447

5

Glava 1.5, 164 bytes

Glava is a dialect of Java that makes Java code shorter. This code is unfortunately non-competitive as the commit (2 hours late...) used was made after this challenge, which fixed some vital bugs that would not allow this program to work.

p(A[0].matches("[`0-9-=~!@#$%^&*()_+]")?1:A[0].replace("\\n","\n").matches("(?i)[asdfghjkl;':\"\n]")?3:A[0].matches("(?i)[zxcvbnm,.\\/<>?]")?4:A[0].matches(" ")?5:2

This is a full program that takes input via command-line arguments. Works by simply testing for which row regex it matches, then outputs the corresponding number.

GamrCorps

Posted 2016-01-07T01:20:20.337

Reputation: 7 058

Glava = Guava + Java? – Downgoat – 2016-01-07T03:32:11.423

2@Doᴡɴɢᴏᴀᴛ Glava = Golf + Java ( it was Conor's idea) – GamrCorps – 2016-01-07T03:38:37.183

Indeed! @Doᴡɴɢᴏᴀᴛ – Conor O'Brien – 2016-01-07T04:04:58.730

4

Python 3, 142

print(int(("~`!1@2#3$4%5^6&7*8(9)0_-+=""qwertyuiop{[}\|"+"]"*11+'asdfghjkl;:"\n'"'"*13+"zxcvbnm,<.>/""?"*14+" ").index(input().lower())/26)+1)

There is probably a shorter way that I am overlooking ¯\_(ツ)_/¯

JuanPotato

Posted 2016-01-07T01:20:20.337

Reputation: 399

4

Pyth, 98

|+++l:"~`0123456789!@#$%^&*()_-=+"z1*l:"asdfghjkl;:'\"\n"rz0 1 3*l:"zxcvbnm,<.>/? "rz0 1 4 l:dz1 2

not sure how to get the 0-9 range working for some reason :|, inspired by user81655's answer

JuanPotato

Posted 2016-01-07T01:20:20.337

Reputation: 399

You can use jkUT for the string with the range 0 to 9, not sure if there's a shorter way. You can also used packed strings to save a few bytes, e.g. ."!~WÏù¹_(<]úÝ" for "~\!@#$%^&*()_-=+"`. – Luke – 2016-01-07T03:36:09.260

From @benstopics, this does fail for regex metacharacters

– FryAmTheEggman – 2016-01-07T14:53:09.190

4

Japt, 73 70 66 bytes

2+`qØÆyuiop\{}[]|\\1dfghjkl;:
'1zxcvbnm,.<>?/\"1 `q1 ®bUv)<0} b!1

Try it online! (in the example, the input is literally a newline)

nicael

Posted 2016-01-07T01:20:20.337

Reputation: 4 585

Nice, shortest so far! – ETHproductions – 2016-01-07T15:21:20.697

@Eth yup, at least once I should post something short :D – nicael – 2016-01-07T15:25:51.497

A couple bytes shorter – ETHproductions – 2016-01-07T15:29:51.010

@Eth Heh, !1 is something that matches "false", finally I know how to do it, thanks :) – nicael – 2016-01-07T15:32:13.557

@Eth halp, needs 5 bytes to beat Pyth. – nicael – 2016-01-07T23:04:27.837

This fails on input \\, but this works for 66: 2+`qØÆyuiop\{}[]|\\1dfghjkl;: '1zxcvbnm,.<>?/\"1 `q1 ®bUv)<0} b!1 – ETHproductions – 2016-01-08T15:20:40.803

@Eth Wait, in the fixed code it does work for "\", what do you mean? – nicael – 2016-01-08T15:25:40.683

I'm not sure... nvm. If it works, it's good. – ETHproductions – 2016-01-08T15:26:07.563

But thanks for the trick with splitting with a number, that's interesting. – nicael – 2016-01-08T15:28:13.287

I thought I had implemented a function to return the first item that returns truthily, which would have saved a byte. But I guess the docs were updated wrongly, so this may be the shortest it can get with the latest version. – ETHproductions – 2016-01-08T15:29:02.390

@Eth btw, on-site-docs don't work (they never worked actually, at least for me) – nicael – 2016-01-08T15:30:29.713

Let us continue this discussion in chat.

– ETHproductions – 2016-01-08T15:36:41.530

I count 65 bytes, and the current version of the code was posted an hour before the current version of the Pyth code... which means this is the rightful winner :-) – ETHproductions – 2016-10-09T22:53:00.803

4

Bash, 108

No Bash answer? Bash answer. grep -Fin is definitely the right tool for this job.

This program is in two files.

k, 73 bytes

`1234567890-=~!@#$%^&*()_+
qwertyuiop[]\{}|
asdfghjkl;':"
zxcvbnm,./<>?

There are 5 lines, the last one is a space. If you have trouble reproducing the file, the base64 is:

YDEyMzQ1Njc4OTAtPX4hQCMkJV4mKigpXysKcXdlcnR5dWlvcFtdXHt9fAphc2RmZ2hqa2w7JzoiCnp4Y3Zibm0sLi88Pj8KIA==

b, 34 bytes

This is the program itself, it takes input as the only command line argument.

grep -Fin "$1" k|tail -n3|head -c1

Score: 34 + 73 + 1 (for k's filename) = 108 bytes

Ungolfed

grep --fixed-strings --ignore-case --line-number "$1" k|tail --lines=3|head --bytes=1

Explanation

  • grep - search a file for lines matching a string or regular expression, output only those lines
  • -F aka --fixed-strings - disable regular expressions so [ etc. are handled correctly
  • -i aka -y aka --ignore-case - case-insensitive matching
  • -n aka --line-number - show the line number and : before every line (e.g. 4:zxcvbnm,./<>?)
  • "$1" - search for the script's first command-line argument, the quotes are necessary to handle newline and space
  • k - search in file k
  • This grep command will match all five lines if the input is a newline, and only one line otherwise.
  • | - pipe, send standard output of one command to standard input of the next
  • tail - output the last N lines or characters of standard input
  • -n3 aka --lines=3 - output the last 3 lines
  • If the input wasn't a newline, there is only one line to process, which starts with the row number because of the -n flag on grep. Otherwise, this command takes only lines 3, 4 and 5 (the last 3 lines).
  • | - pipe
  • head - output the first N lines or characters of standard input
  • -c1 aka --bytes=1 - output the first character
  • If the input wasn't a newline, this takes the first character, which is the line number where the input is found. If the input is a newline, it takes the first character of lines 3, 4 and 5 combined, which is 3, which happens to be the correct row number for newline.

user16402

Posted 2016-01-07T01:20:20.337

Reputation:

4

Java, 300 bytes

import java.util.Scanner;public class A{public static void main(String[] args){String g="~`!1@2#3$4%5^6&7*8(9)0_-+=qQwWeErRtTyYuUiIoOpP[{]}\\|aAsSdDfFgGhHjJkKlL;:\'\"\r";Scanner i=new Scanner(System.in);int f=g.indexOf((i.nextLine().charAt(0)));System.out.print(f<0?4:(f<26?1:(f<53?2:(f<76?3:5))));}}

I'm not an expert, and this is my first attempt at golfing, but I figured, what the hell, why not? Above is the full program version, the actual code that goes into it would most likely take a decent amount of characters off.

Andrew

Posted 2016-01-07T01:20:20.337

Reputation: 41

just noticed it crashes with an empty input(new line/carriage return). will fix when I can – Andrew – 2016-01-08T17:33:41.823

Welcome to the community! – Erik the Outgolfer – 2016-09-28T18:25:12.767

Welcome (bit late since you posted in January xD). You can golf it quite a bit without changing your current approach like this: class A{public static void main(String[]a){int f="~'!1@2#3$4%5^6&7*8(9)0_-+=qQwWeErRtTyYuUiIoOpP[{]}\\|aAsSdDfFgGhHjJkKlL;:\'\"\r".indexOf(new java.util.Scanner(System.in).nextLine().charAt(0));System.out.print(f<0?4:f<26?1:f<53?2:f<76?3:5);}} (243 bytes) I removed some unnecessary parenthesis; shortened args; removed public; directly used the String and Scanner; and removed the import now that java.util.Scanner is used once. – Kevin Cruijssen – 2016-10-25T09:26:02.060

219 bytes you don't need to use Scanner for this – PrincePolka – 2017-11-26T17:33:14.933

3

Pyth, 105 bytes

J?<l-c".^$*+?{}[]\|()"1]z14+\\zrz0?qJd5?:"qwertyuiop[]\|"J)2?:"asdfghjkl;':\"\n"J)3?:"zxcvbnm,./<>?"J)4 1

Explanation:

J?<l-c".^$*+?{}[]\|()"1]z14+\\zrz0     # Escape input if regex metachar
?qJd5                                  # Check space
?:"qwertyuiop[]\|"J)2                  # Check second row
?:"asdfghjkl;':\"\n"J)3                # Check third row
?:"zxcvbnm,./<>?"J)4                   # Check fourth row
1                                      # If none of these, must be on first row.

I decided to choose the first row as the "must be if nothing else" row because it required the most bytes to represent even after golfing.

benstopics

Posted 2016-01-07T01:20:20.337

Reputation: 61

Welcome to Programming Puzzles and Code Golf! Use comments to make @JuanPotato get it. However, that needs 50 rep. So you need to work. – user48538 – 2016-01-07T14:32:00.027

3

Perl 6, 128 bytes

say 1+(/<[-\d=~!@#$%^&*()_+/`]>/,/<[qwertyuiop[\]\\{}|]>/,/<[asdfghjkl;':"\n]>/,/<[zxcvbnm,./<>?]>/,' ').first: @*ARGS.lc~~*,:k

I make a list of regexes containing character classes along with a string literal space. I then call the first method on the list (which is just the method version of the first higher order function), using smartmatch to compare the argument passed to the program against the current item in the list. Note that smartmatch does "the right thing" for both regexes and a string literal. The :k optional parameter to first causes the method to return the index of the matching item in the list, which I then add 1 to and output via say.

Note that when using this program you will have to properly escape certain characters like ` and space in your shell. For instance: perl6 keyboard.p6 \`

cuttlefish

Posted 2016-01-07T01:20:20.337

Reputation: 131

Since nobody said it yet, welcome to Programming Puzzles & Code Golf! – Erik the Outgolfer – 2016-09-28T18:24:29.217

2

Python 3, 89 bytes

print("qwertyuiop{}[]\\|asdfghjkl;:\"\n'''zxcvbnm,.<>/???? ".find(input().lower())//16+2)

As I can't comment yet, I'm posting the improvement for the current Python 3 answer separately.

Edit: All code in print now and further tweaked.

creativecoding

Posted 2016-01-07T01:20:20.337

Reputation: 21

This is merely a snippet and therefore not a valid answer, you need to wrap it in a print statement (making it a full program) or turn it into a function. – FlipTack – 2017-11-26T16:42:35.423

@FlipTack: You're right. I've incorporated your suggestion. – creativecoding – 2017-11-26T16:51:34.410

Welcome to PPCG! – Martin Ender – 2017-11-26T17:01:18.177

@MartinEnder: Thank you! :-) – creativecoding – 2017-11-26T17:30:54.850

2

Perl, 96 77 76 bytes

Run using perl -p. Make sure you're feeding it just single characters; for example, to run it from a file key.pl (to avoid mucking around with shell escape sequences) echo -n q|perl -p key.pl.

$_=/[\d~`!@#-&(-+_=-]/+/[adfghjkls"':;
]/i*3+/[bcnmvxz<>,.?\/]/i*4+/ /*5||2

Abusing the regex range functionality is fun.

Mark

Posted 2016-01-07T01:20:20.337

Reputation: 2 099

To me this doesn't work, running it I get the index of the row + 3 (i.e. 3 instead of 0, 7 instead of 4, etc.). – ChatterOne – 2016-01-07T08:20:31.470

It's sensitive to how you provide the input. You're probably providing a character followed by a newline. I use echo to precisely control the input -- eg. echo -n q|perl -n key.pl, which correctly produces 2. – Mark – 2016-01-07T08:29:52.870

Oh, I see. Well, that also explains why you don't chomp the input. – ChatterOne – 2016-01-07T08:39:34.373

1If I chomped the input, I wouldn't be able to return '3' for the return key. – Mark – 2016-01-07T08:42:31.840

1Hey @Mark, you don't need the $_=~ for the matches, m// (which is what /.../ is) works on $_ automatically! Also if you use -p instead of -n you can use $_= instead of print to save a couple more bytes. Using a literal newline instead of \n can save you another byte too! That should reduce your code quite a bit! Might be worth adding an example usage as well so anyone testing knows you need to use echo -n :) – Dom Hastings – 2016-01-07T09:51:56.087

@DomHastings, thanks. I can never remember what does and doesn't take automatic arguments, since using them tends to be bad form if you're writing code you expect someone else to read a few years later. – Mark – 2016-01-07T10:08:30.547

@randomra, the second and third regexes (detecting the third and fourth rows) have the /i modifier making them case-insensitive. The first and fourth regexes (first and fifth rows) don't need to be, and the second row is detected by the process of elimination. – Mark – 2016-01-07T18:57:46.060

I see, somehow I missed the i's. – randomra – 2016-01-07T19:02:31.840

2

JavaScript ES6, 114 bytes

n=>[`qwertyuiop{}[]|\\`,`asdfghjkl;:
'`,`zxcvbnm,.<>?/"`,` `].map(x=>+(x.indexOf(n.toLowerCase())<0)).indexOf(0)+2

Another JavaScript solution. The principle is to return the index of the input char in the array of rows plus 2 (so as the 0-9 row returns -1, i.e. not exists, -1+2=1. q is in the first string of the array, so it returns 0+2=2nd row).

nicael

Posted 2016-01-07T01:20:20.337

Reputation: 4 585

2

PHP, 173 bytes

The idea here was to use the regex capturing group number as the row index. Probably some more optimizations in the regex itself.

$i=$argv[1];preg_match("%([!#-&\(-+-0-9=@^-`~])|([EIO-RT-UWY[-]eio-rt-uwy{-}])|([\"':-;ADF-HJ-LSadf-hj-ls])|([,.-/<>-?B-CM-NVXZb-cm-nvxz])%",$i,$m);echo array_flip($m)[$i];

The preg_match() call will create an array $m of matches, and if we were to print that, it'd look something like this (assuming z was the input):

Array ( [0] => 'z', [1] => '', [2] => '', [3] => '', [4] => 'z' )

Flipping that array, by swapping keys and values, moves left to right and only keeps the last distinct key, so we end up with:

Array ( 'z' => 4, '' => 3 )

Then we use the input character as the index in the array to get our result.

Try it out here.

nickb

Posted 2016-01-07T01:20:20.337

Reputation: 351

2

C, 145 143 136 132 127 106 bytes

#define c 2124850936,91714965
b[]={8<<18,0,-218071008,7796<<19,c,c};f(a){return a-32?b[a>>4]>>a%16*2&3:4;}

This uses index() from POSIX.1-2001 and is deprecated in POSIX.1-2008. This assumes ASCII and 32 bit ints.

ceilingcat

Posted 2016-01-07T01:20:20.337

Reputation: 5 503

1

Ruby, 82 bytes

->i{1+((0>r=i.ord-33)?r%5:"bc7xdutvz4ind3bwqf6mcu5vxiahnmlfs93c".to_i(36)>>2*r&3)}

Try it online!

G B

Posted 2016-01-07T01:20:20.337

Reputation: 11 099

0

Excel, 132 bytes

=INT((FIND(A1,"`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:""aaa zxcvbnm,./ZXCVBNM<>?zzzzzz ")-1)/26)+1

Attempts to use the case in-sensitive SEARCH() instead of FIND() revealed that Excel matches ~, * and ? to (tick). The matching of?means we can't useSEARCH()`, which would have shaved a massive 5 bytes...

Wernisch

Posted 2016-01-07T01:20:20.337

Reputation: 2 534

0

C#6, 201 bytes

Nothing special here. I found it cheaper to just write both cases rather than use ToUpper() due to the string's fixed width.

using C=System.Console;class P{static void Main(string[]a)=>C.Write("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'\raASDFGHJKL:\"\nazxcvbnm,./zzzZXCVBNM<>?zzz ".IndexOf(a[0])/26+1);}

Indented:

using C=System.Console;
class P{
    static void Main(string[]a)=>
        C.Write("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'\raASDFGHJKL:\"\nazxcvbnm,./zzzZXCVBNM<>?zzz ".IndexOf(a[0])/26+1);
}

Hand-E-Food

Posted 2016-01-07T01:20:20.337

Reputation: 7 912

1I can't see this working for ~ or `? – Ash Burlaczenko – 2016-01-07T09:56:05.787

@AshBurlaczenko, thanks! I missed that key. Fixed with no change to my score. – Hand-E-Food – 2016-01-10T09:59:53.133

0

CJam, 125 bytes

q_" "={;5}{"`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\"    zxcvbnm,./ZXCVBNM<>?    "\#26/1+}?

Explanation

q                          e# read input
 _" "=                     e# decide if the input is a space
      {;5}                 e# if it is, push 5
          {"..."\#26/1+}?  e# if it isn't, push the correct row

Zach Gates

Posted 2016-01-07T01:20:20.337

Reputation: 6 152

0

SpecBAS - 178 bytes

1 a$="~`!1@2#3$4%5^6&7*8(9)0-_+=qQwWeErRtTyYuUiIoOpP{[}]|\aaaaAsSdDfFgGhHjJkKlL:;'"#34#13"zzzzzzzZxXcCvVbBnNmM<,>.?/"+" "*26
2 INPUT k$: IF k$="" THEN k$=#13
3  ?CEIL(POS(k$,a$)/26)

I used a long string where each row is 26 characters long (#34 is code for double quote and #13 is code for return).

Then print the result of rounding position/26.

Brian

Posted 2016-01-07T01:20:20.337

Reputation: 1 209

0

Python 2, 146 bytes

e="\n";lambda x:("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\""+e*4+"zxcvbnm,./ZXCVBNM<>?"+e*13+" ").index(x)/26+1

Oliver Ni

Posted 2016-01-07T01:20:20.337

Reputation: 9 650