Temukan rata-rata kata

8

Terinspirasi oleh pesan obrolan ini

Tugas Anda adalah mengambil kata dan menemukan posisi rata-rata hurufnya di keyboard sebagai huruf.

Layout Keyboard

Karena tata letak bervariasi dari keyboard ke keyboard, kami akan menggunakan standar berdasarkan dari keyboard saya sendiri dalam pertanyaan ini.

Keyboard memiliki 3 baris, baris teratas dari kiri ke kanan berisi tombol

QWERTYUIOP

Baris kedua berisi huruf-huruf

ASDFGHJKL

Baris terakhir berisi

ZXCVBNM

Setiap huruf adalah 1 unit horisontal dari tetangganya ke kiri. Ini berarti W1 jauh dari Qdan E1 jauh dari Wdan seterusnya.

Kunci di awal setiap baris memiliki posisi:

Q : 0,0
A : 1/3,1
Z : 2/3,2

Ini berarti bahwa baris-baris dipisahkan satu unit secara vertikal dan dua baris terbawah digeser oleh sepertiga dari baris di atasnya.


Anda harus mengambil kata sebagai input dan output huruf yang paling dekat dengan posisi rata-rata huruf dalam kata tersebut. Rata-rata satu set vektor adalah

(average x value, average y value)

Ketika dua kunci berjarak sama dari rata-rata, Anda dapat menampilkan sebagai kunci "terdekat".

Ini adalah sehingga jawaban akan dicetak dalam byte dengan lebih sedikit byte yang lebih baik.

Contoh solusi

Mari kita hitung rata-rata APL.

Kami mengonversi setiap huruf menjadi vektor

A -> (1/3,1)
P -> (9,0)
L -> (8 1/3,1)

Kami menambahkan ini tiga vektor untuk mendapatkan (17 2/3, 2). Kami kemudian membagi masing-masing koordinat dengan 3 (Jumlah huruf dalam kata) untuk mendapatkan (5 8/9, 2/3).

Surat terdekat (5 8/9, 2/3)adalah Jdi (6 1/3,1)jadi hasil kami adalah J.

Uji Kasus

APL  -> J
TEXT -> R
PPCG -> J
QQQQ -> Q
ZZZZ -> Z
PPPP -> P
MMMM -> M
QQSS -> A or W
Ad Hoc Garf Hunter
sumber

Jawaban:

3

C # (.NET Core) , 250 + 13 byte

+13 byte untuk using System;

n=>{var a=new[]{"QWERTYUIOP","ASDFGHJKL","ZXCVBNM"};float x=0,y=0;int i=0,j=0,l=n.Length;foreach(char c in n){for(i=0,j=0;i<2;){if(a[i][j]==c)break;if(++j>=a[i].Length){i++;j=0;}}x+=j;y+=i;}return a[(int)Math.Round(y/3)][(int)Math.Round(x/l+y/l/3)];}

Cobalah online!

Little sidenote: Ini output Funtuk TEXT, karena itu adalah output yang diinginkan asli.
Outputing Rbukannya Fdiubah setelah jawaban ini diposting.

Ian H.
sumber
2

JavaScript (ES6), 166 byte

f=
s=>[...s].map(c=>(h+=c=s.search(c),v+=c%3,l++),h=v=l=0,s='QAZWSXEDCRFVTGBYHNUJMIKKOLLP')&&[...s].map((c,i)=>(i=(i-h/l)*(i-h/l)+(i=i%3-v/l)*i*9,i)<m&&(m=i,r=c),m=9)&&r
<input oninput=o.textContent=/^[A-Z]+$/.test(this.value)?f(this.value):``><pre id=o>

6 byte dapat disimpan dengan beralih ke ES7. Solusi 131 byte sebelumnya menggunakan pemeriksaan jarak sederhana yang tidak lagi dapat diterima.

Neil
sumber
2

Python 3 , 130 byte

lambda w,d={'QAZWSXEDCRFVTGBYHNUJMIKOOLPP'[i]:i%3*1j+i/3for i in range(28)}:min(d,key=lambda c:abs(d[c]-sum(map(d.get,w))/len(w)))

Cobalah online!

d={'QAZWSXEDCRFVTGBYHNUJMIKOOLPP'[i]:i%3*1j+i/3for i in range(28)}membangun pemetaan dari huruf ke titik (direpresentasikan sebagai angka kompleks, (x+y*1j)).

Adapun tubuh lambda, sum(map(d.get,w))/len(w)menghitung posisi rata-rata kata w, dan memasukkannya ke dalam min(d,key=lambda c:abs(d[c]-…))menemukan huruf terdekat dengan posisi itu. (Untuk bilangan kompleks, abs(A-B)sesuai dengan jarak Euclidean antara (A.real, A.imag)dan (B.real, B.imag).)

Lynn
sumber
2

Java, 257 243 242 237 byte

char h(String s){int l=s.length(),i=l+28;s="QAZWSXEDCRFVTGBYHNUJMIK<OL>P"+s;float d=9,x=0,y=0,e;for(;i>28;y+=(e=s.indexOf(s.charAt(--i)))%3/l,x+=e/3/l);for(;i-->0;)if((e=(x-i/3f)*(x-i/3f)+(y-i%3)*(y-i%3))<d){d=e;l=i;}return s.charAt(l);}

Disimpan 14 byte - jarak dari kunci terbaik akan kurang dari 3 unit

Tahg
sumber
1

Jelly , 37 byte

ØQi€µT÷3Ḣ+Ṁ;T
Ç€ZÆmðạ²SðЀØAÇ€¤iṂ$ịØA

Cobalah online!

lol terlalu lama

Penjelasan

ØQi€µT÷3Ḣ+Ṁ;T            Helper Link; compute the position of a key
   €                     For each row of
ØQ                       ["QWERTYUIOP", "ASDFGHJKL", "ZXCVBNM"] (hooray for builtins)
  i                      Find the first occurrence of the argument
    µ                    Start a new monadic chain
     T                   List of indices of truthy values; singleton list with the row of the key
      ÷                  Divide the index by
       3                 3
        Ḣ                Take the first element
         +               Add it to the original list
          Ṁ              Take the maximum (the adjusted horizontal position of the key)
           ;             Append
            T            The index of the truthy value (the row)
Ç€ZÆmðạ²SðЀØAÇ€¤iṂ$ịØA  Main Link
 €                       For each character in the input
Ç                        Compute its position using the helper link
  Z                      Zip (all of the horizontal positions are in the first list; all of the vertical positions are in the second list)
   Æm                    Take the arithmetic mean (of each sublist)
     ðạ²Sð               Dyadic chain to compute the distance (squared) between two coordinates
      ạ                  Take the absolute difference between each coordinate value (auto-vectorization)
       ²                 Square each value
        S                Take the sum (returns the distance squared but for comparison that's fine)
          Ѐ             Take the distance between the mean position and each element in
            ØAÇ€¤        [Nilad:] the positions of each character in the uppercase alphabet
               €         For each character in
            ØA           "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
              Ç          Compute its position
                 iṂ$     Find the index of the minimum (closest)
                 i       First occurrence of             in the list of distances
                  Ṃ                          the minimum
                    ị    Index back into
                     ØA  The alphabet
HyperNeutrino
sumber
@ downvoter masalah dengan test case telah diperbaiki; harap hapus downvote Anda atau jelaskan mengapa Anda ingin downvote jawaban saya
HyperNeutrino
Saya pikir itu tidak setuju lagi? Fsepertinya tidak lagi menjadi output yang diizinkan ...
Erik the Outgolfer
@EriktheOutgolfer Ah oke saya tidak memperbarui pernyataan itu setelah FCM mengoreksi test case
HyperNeutrino
1

Java (OpenJDK 8) , 452 431 424 400 389 324 322 296 285 281 276 274 260 258 257 byte

Mulai untuk bermain golf

s->{String c="QWERTYUIOPASDFGHJKL;ZXCVBNM";int i=0,r=0,l=0;double x=0,y=0,D=99,t,f=s.length();for(;i<f;x+=l%10+l/10/3d,y+=l/10)l=c.indexOf(s.charAt(i++));for(;r<27;r++)if(D>(t=Math.pow(x/f-r/10/3d-r%10,2)+Math.pow(y/f-r/10,2))){D=t;l=r;}return c.charAt(l);}

Cobalah online!

Roberto Graham
sumber
Memberiku hasil yang salah untuk TEXT.
Ian H.
@IanH. Ini memberi saya 'R' yang diminta OP
Roberto Graham
Tidak melihat itu diubah dalam tugas, salahku.
Ian H.
1
431 byte .
Jonathan Frech
Saya belum melihat jawaban ini ketika saya memposting milik saya, haruskah saya menyarankan jawaban saya sebagai komentar atau apakah banyak jawaban untuk bahasa yang sama ok?
Tahg
0

Mathematica, 234 byte

(r=(K=Round)@Mean[If[(w=First[q=#&@@Position[(s=X/@{"QWERTYUIOP","ASDFGHJKL","ZXCVBNM"}),#]])==1,q=q-1,If[w==2,q=q+{-1,-2/3},q=q+{-1,-1/3}]]&/@(X=Characters)@#];z=If[(h=#&@@r)==0,r=r+1,If[h==1,r=r+{1,2/3},r=r+{1,1/3}]];s[[##]]&@@K@z)&  
J42161217
sumber
Tetap! bekerja untuk semua kasus uji.
J42161217