Mengetik, tetapi ke kiri [ditutup]

14

Latar Belakang

Anda telah diberi tugas untuk membuat catatan untuk rapat. Anda mulai mengetik di Google Doc Anda, tetapi Anda tidak punya cukup waktu selama pertemuan untuk melihat keyboard Anda saat Anda mengetik.

Untungnya bagi Anda, Anda dapat mengetik tanpa melihat keyboard Anda. Setelah pertemuan, Anda menyadari bahwa semua yang Anda ketikkan adalah satu kunci ke kiri.

Tantangan

Untuk tantangan ini, Anda akan menggunakan huruf, angka, dan spasi di tata letak keyboard QWERTY.

  • Diberikan input teks (dari metode input standar), output teks yang dihasilkan, di mana setiap karakter dipindahkan satu ke kiri pada keyboard.

    • Untuk sebagian besar huruf, lihat saja surat itu dan terjemahkan ke huruf ke kiri ( cmenjadi x, tmenjadi r, dll).

    • Untuk huruf q, terjemahkan ke karakter tab literal ( \t).

    • Untuk huruf a, aktifkan caps lock, jadi kapitalisasi sisa string dibalik.

    • Untuk huruf z, huruf besar huruf berikutnya dalam string.

    • Tidak diperlukan terjemahan untuk bilah spasi.

  • Pertahankan penggunaan huruf besar saat menerjemahkan, dan perhatikan caps lock (jika caps lock diaktifkan, pastikan casingnya bertolak belakang).

  • Semua karakter dalam string input akan berupa huruf, angka, atau spasi. Tidak ada tanda baca atau karakter lain yang bisa dimasukkan.

Uji Kasus

\t adalah karakter tab literal

Hello world    -> Gwkki qieks
Code Golf      -> Xisw Fikd
Queried apples -> \tyweuws OOKWA

Mencetak gol

Skor terendah dalam byte menang. Selamat bersenang-senang!

hubungkan charger Anda
sumber
11
Referensi cepat dari baris yang relevan dari keyboard QWERTY akan berguna, dan menjaga tantangan tetap mandiri
Jo King
4
Apakah angka digeser ke tanda baca jika ada "Z" sebelum mereka?
ErikF
10
Tapi Z sesuai dengan pergeseran ...?
String Tidak Terkait
4
AzertywERT
Kasing
5
Untuk huruf z, huruf besar huruf berikutnya dalam string -> apakah itu berarti bahwa kita hanya perlu peduli dengan huruf besar huruf dan tidak perlu beralih antara angka dan simbol? Untuk apa output yang diharapkan 0123456789, a0123456789dan z0z1z2z3z4z5z6z7z8z9? (Selain itu, pada banyak keyboard non-QWERTY, 'Caps Lock' benar-benar bertindak sebagai 'Shift Lock'. Saya percaya bahwa QWERTY tidak mengikuti pola ini, tetapi harus ditentukan untuk kita yang tidak terbiasa dengan itu. )
Arnauld

Jawaban:

11

JavaScript (V8) , 271 byte

f=(s,k='~!@#$%^&*()_+`1234567890-=\tQWERTYUIOP{}|\tqwertyuiop[]\\ASDFGHJKL:"\n\\asdfghjkl;\'ZXCVBNM<>?zxcvbnm,./')=>s.replace(/[^ ]/g,c=>k[k.indexOf(c)-1]).replace(/\\([^\\]*)\\?/g,(m,c)=>c.replace(/[a-zA-z]/g,l=>l>'Z'?l.toUpperCase():l.toLowerCase())).replace(/[?']/,"")

Cobalah online! Golf kode JavaScript pertama saya. Pasti bisa lebih pendek, tapi saya pikir ini awal yang baik.
Ini pada dasarnya menemukan setiap karakter dalam kstring dan menggantinya dengan yang sebelumnya, kemudian menukar kasus segala sesuatu di antara Aatau a, dan menghapus semua kejadian Zatau z(karena tombol shift tidak melakukan apa-apa pada dirinya sendiri).
Ini seharusnya tata letak keyboard QWERTY yang normal, tetapi beri tahu saya jika tidak.

Matthew Jensen
sumber
Di tautan TIO Anda sendiri, zebras=>wveAtest case tampaknya salah. Yang pertama zharus menyebabkan emencetak huruf besar w. Dari OP: "Untuk huruf z, kapitalkan huruf berikutnya dalam string."
Malam
@ Night2 Cheers, saya diposting sebelum OP membuat klarifikasi. Saya berasumsi menekan tombol shift sekali tidak akan melakukan apa-apa.
Matthew Jensen
5

Python 3 , 211 byte

d=' ~!@#$%^&*()`~1!2@3#4$5%6^7&8*9(0)		qQwWeErRtTyYuUiIoOpPaAsSdDfFgGhHjJkKlLzZxXcCvVbBnNmM  '
c=s=0
for i in input():k=d.find(i);print(end=d[k-2+(c*i.isalpha()^s)*(1-k%2*2)][i in'aAzZ':]);c^=i in'aA';s=i in'zZ'

Cobalah online!

Menggunakan string pencarian di mana karakter normal dan versi yang dimodifikasi-shift dikelompokkan bersama. Untuk setiap karakter dalam input, itu akan mengambil karakter dua tempat ke kiri. Mengubah kapitalisasi dengan menambahkan 1(atau -1jika karakter saat ini adalah huruf besar) ke nilai pencarian saat shift XOR caps lock aktif. Angka tidak dipengaruhi oleh pengubah caps lock.

Jitse
sumber
2

PHP , 227 byte

for(;''<$s=$argn[$i++];)$s!=a&&$s!=A?$s!=z&&$s!=Z?($t=$m[stripos($m='~1!2@3#4$5%6^7&8*9(0	qwertyuiopasdfghjklzxcvbnm',$s)-1])+(print$s>' '?$s<A?!$h?$s-1?$s?$s-1:9:'`':$t:($t>=A&&(($s<a)+$h+$c)%2?$t^' ':$t):$s)+$h=0:$h=1:$c=!$c;

Cobalah online!

Saya telah membuat string pemetaan ( ~1!2@3#4$5%6^7&8*9(0 qwertyuiopasdfghjklzxcvbnm) yang untuk setiap digit memiliki mode SHIFT mereka di sebelah kiri dan untuk setiap huruf memiliki huruf / kunci di sebelah kiri mereka.

Saya mengulangi karakter input dan untuk setiap karakter:

  • Jika karakter adalah aatau A, caps caps lock dibalik (tidak logis)
  • Jika karakter adalah zatau Z, shift flag diatur ke 1.
  • Saat karakter tidak ada aAzZ:
    • Karakter di sebelah kiri karakter saat ini dalam string pemetaan disimpan di $t.
    • Jika karakter saat ini adalah spasi, itu dicetak.
    • Jika karakter saat ini adalah digit, dan jika bendera bergeser 1, $tdicetak, yang lain, jika digit 1, `dicetak, jika digit 0, 9dicetak dan sebaliknya, digit-1dicetak.
    • Jika karakter saat ini adalah huruf, berdasarkan status flag shift, flag lock caps dan casing karakter saat ini (bawah / atas), $tdicetak dalam huruf kecil atau huruf besar. Satu-satunya kasus khusus di sini adalah karakter tab, yang dicetak apa adanya.
    • Bendera shift selalu diatur kembali ke 0di akhir.
Night2
sumber
2

Merah , 218 byte

func[t][c: z: 0 rejoin collect[foreach s t[case[find"Aa"s[c: c xor 32]find"Zz"s[z: 32]on
[keep(select/case"  poiuytrewq^-lkjhgfdsamnbvcxzPOIUYTREWQ^-LKJHGFDSAMNBVCXZ0987654321~"s)xor either s <#"Z"[0][c xor z]z: 0]]]]]

Cobalah online!

Saat ini AaZztidak memengaruhi digit.

Galen Ivanov
sumber
Ini sepertinya tidak berhasil'A pear' -> ' OWe'
Jitse
@Jitse Hmm
Galen Ivanov
@Jitse Tapi benar-benar tidak bekerja dengan baik dengan angka, itu tidak sepenuhnya jelas dari OP
Galen Ivanov
2
Saya setuju, tantangannya sangat ambigu.
Jitse
2

C (gcc) , 276 byte

i;j;k;h;l;m;n;o;f(char*b){char*c=calloc(m=strlen(b),1),*a=" \tqwertyuiop\aasdfghjkl\nzxcvbnm\tQWERTYUIOP\aASDFGHJKL\nZXCVBNM`1234567890";for(i=k=j=n=0;j<=m;l=a[i=index(a,b[j++])-a-1])k=l^7?k:!k,o=l>64&l<91?a[i-30*k]:l<97?h=i?l^7?l?l^10?l:0:32:0:0:a[i+29*k],o?c[n++]=o:n;b=c;}

Berkat ceilingcat untuk -33 byte.

Cobalah online!

girobuz
sumber
Sarankan k^=!(l^7)alih-alihk=l^7?k:!k
ceilingcat