Tìm trung bình của một từ


8

Lấy cảm hứng từ tin nhắn trò chuyện này

Nhiệm vụ của bạn sẽ là lấy một từ và tìm vị trí trung bình của các chữ cái trên bàn phím dưới dạng một chữ cái.

Bố trí bàn phím

Vì bố cục thay đổi từ bàn phím sang bàn phím, chúng tôi sẽ sử dụng một tiêu chuẩn dựa trên bàn phím của riêng tôi trong câu hỏi này.

Bàn phím có 3 hàng, hàng trên cùng từ trái sang phải chứa các phím

QWERTYUIOP

Hàng thứ hai chứa các chữ cái

ASDFGHJKL

Hàng cuối cùng chứa

ZXCVBNM

Mỗi chữ cái là 1 đơn vị nằm ngang từ hàng xóm của nó sang bên trái. Điều này có nghĩa Wlà cách xa 1 QEcách xa 1 W.

Các phím ở đầu mỗi hàng có các vị trí:

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

Điều này có nghĩa là các hàng được phân tách một đơn vị theo chiều dọc và hai hàng dưới cùng được dịch chuyển một phần ba so với hàng phía trên chúng.


Bạn nên lấy một từ làm đầu vào và xuất chữ cái gần nhất với vị trí trung bình của các chữ cái trong từ đó. Trung bình của một tập các vectơ là

(average x value, average y value)

Khi hai khóa tương đương với mức trung bình, bạn có thể xuất ra dưới dạng khóa "gần nhất".

Đây là vì vậy câu trả lời sẽ được ghi bằng byte với ít byte hơn.

Giải pháp ví dụ

Hãy tính trung bình của APL.

Chúng tôi chuyển đổi mỗi chữ cái thành một vector

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

Chúng tôi thêm chúng lên ba vectơ để có được (17 2/3, 2). Sau đó chúng tôi chia mỗi tọa độ cho 3 (Số lượng chữ cái trong từ) để có được (5 8/9, 2/3).

Bức thư gần (5 8/9, 2/3)Jlúc (6 1/3,1)nên kết quả của chúng tôi là J.

Các trường hợp thử nghiệm

APL  -> J
TEXT -> R
PPCG -> J
QQQQ -> Q
ZZZZ -> Z
PPPP -> P
MMMM -> M
QQSS -> A or W

Câu trả lời:


3

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

+13 byte cho 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)];}

Hãy thử trực tuyến!

Ít sidenote: Đây quả đầu ra Fcho TEXT, vì đó là đầu ra mong muốn ban đầu.
Đầu ra Rthay vì Fđược thay đổi sau khi câu trả lời này được đăng.


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 có thể được lưu bằng cách chuyển sang ES7. Giải pháp 131 byte trước đây đã sử dụng kiểm tra khoảng cách đơn giản không còn chấp nhận được.


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)))

Hãy thử trực tuyến!

d={'QAZWSXEDCRFVTGBYHNUJMIKOOLPP'[i]:i%3*1j+i/3for i in range(28)}xây dựng ánh xạ từ các chữ cái đến các điểm (được biểu diễn dưới dạng số phức (x+y*1j)).

Đối với cơ thể lambda, sum(map(d.get,w))/len(w)tính toán vị trí trung bình của từ wvà đặt nó vào min(d,key=lambda c:abs(d[c]-…))vị trí tìm chữ cái gần nhất với vị trí đó. (Đối với số phức, abs(A-B)tương ứng với khoảng cách Euclide giữa (A.real, A.imag)(B.real, B.imag).)


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);}

Đã lưu 14 byte - khoảng cách từ khóa tốt nhất sẽ ít hơn 3 đơn vị


1

Thạch , 37 byte

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

Hãy thử trực tuyến!

cách quá lâu

Giải trình

Ø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

@downvoter vấn đề với trường hợp thử nghiệm đã được khắc phục; vui lòng xóa downvote của bạn hoặc giải thích lý do tại sao bạn muốn downvote câu trả lời của tôi
HyperNeutrino

Tôi nghĩ rằng nó không đồng ý một lần nữa? Fdường như không còn là đầu ra được phép nữa ...
Erik the Outgolfer

@EriktheOutgolfer À, tôi không cập nhật nhận xét đó sau khi FCM sửa trường hợp kiểm tra
HyperNeutrino

1

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

Một cái gì đó để bắt đầu chơi golf từ

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);}

Hãy thử trực tuyến!


Cho tôi kết quả sai cho TEXT.
Ian H.

@IanH. Nó mang lại cho tôi 'R', đó là những gì OP yêu cầu
Roberto Graham

Không thấy rằng đã được thay đổi trong nhiệm vụ, xấu của tôi.
Ian H.


Tôi đã không thấy câu trả lời này khi tôi đăng bài của mình, tôi có nên đề xuất câu trả lời của tôi dưới dạng nhận xét hoặc nhiều câu trả lời cho cùng một ngôn ngữ không?
Tahg

0

Toán học, 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)&  

Đã sửa! làm việc cho tất cả các trường hợp thử nghiệm.
J42161217
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.