Finden Sie den Durchschnitt eines Wortes

8

Inspiriert von dieser Chat-Nachricht

Ihre Aufgabe wird es sein, ein Wort zu nehmen und die durchschnittliche Position seiner Buchstaben auf der Tastatur als Buchstaben zu finden.

Tastaturbelegung

Da die Layouts von Tastatur zu Tastatur unterschiedlich sind, verwenden wir in dieser Frage einen Standard, der auf meiner eigenen Tastatur basiert.

Die Tastatur hat 3 Zeilen, die obere Reihe von links nach rechts enthält die Tasten

QWERTYUIOP

Die zweite Zeile enthält die Buchstaben

ASDFGHJKL

Die letzte Zeile enthält

ZXCVBNM

Jeder Buchstabe ist 1 Einheit horizontal von seinem Nachbarn nach links. Dies bedeutet, dass W1 von Qund E1 entfernt ist Wund so weiter.

Die Tasten am Anfang jeder Zeile haben folgende Positionen:

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

Dies bedeutet, dass die Zeilen vertikal um eine Einheit voneinander getrennt sind und die beiden unteren Zeilen um ein Drittel von der darüber liegenden Zeile verschoben sind.


Sie sollten ein Wort als Eingabe nehmen und den Buchstaben ausgeben, der der durchschnittlichen Position der Buchstaben in seinem Wort am nächsten kommt. Der Durchschnitt eines Satzes von Vektoren ist

(average x value, average y value)

Wenn zwei Tasten gleich weit vom Durchschnitt entfernt sind, können Sie entweder als "nächstgelegene" Taste ausgeben.

Dies ist daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.

Beispiellösung

Berechnen wir den Durchschnitt von APL.

Wir konvertieren jeden Buchstaben in einen Vektor

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

Wir addieren diese drei Vektoren, um sie zu erhalten (17 2/3, 2). Wir teilen dann jede Koordinate durch 3 (die Anzahl der Buchstaben im Wort), um zu erhalten (5 8/9, 2/3).

Der nächste Brief (5 8/9, 2/3)ist Jan (6 1/3,1)so unser Ergebnis ist J.

Testfälle

APL  -> J
TEXT -> R
PPCG -> J
QQQQ -> Q
ZZZZ -> Z
PPPP -> P
MMMM -> M
QQSS -> A or W
Ad-hoc-Garf-Jäger
quelle

Antworten:

3

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

+13 Bytes für 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)];}

Probieren Sie es online aus!

Kleine Nebenbemerkung: Dies gibt Ffür aus TEXT, da dies die ursprünglich gewünschte Ausgabe war.
Die Ausgabe Rstatt Fwurde geändert, nachdem diese Antwort veröffentlicht wurde.

Ian H.
quelle
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>

Durch Umschalten auf ES7 könnten 6 Bytes eingespart werden. Die vorherige 131-Byte-Lösung verwendete eine vereinfachte Abstandsprüfung, die nicht mehr akzeptabel ist.

Neil
quelle
2

Python 3 , 130 Bytes

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

Probieren Sie es online aus!

d={'QAZWSXEDCRFVTGBYHNUJMIKOOLPP'[i]:i%3*1j+i/3for i in range(28)}Konstruiert die Zuordnung von Buchstaben zu Punkten (dargestellt als komplexe Zahlen (x+y*1j)).

sum(map(d.get,w))/len(w)Berechnet für den Lambda-Körper die durchschnittliche Position des Wortes w, und wenn Sie diesen eingeben, wird min(d,key=lambda c:abs(d[c]-…))der Buchstabe gefunden, der dieser Position am nächsten kommt. (Entspricht für komplexe Zahlen abs(A-B)dem euklidischen Abstand zwischen (A.real, A.imag)und (B.real, B.imag).)

Lynn
quelle
2

Java, 257 243 242 237 Bytes

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

Gespeicherte 14 Bytes - der Abstand zum besten Schlüssel beträgt weniger als 3 Einheiten

Tahg
quelle
1

Gelee , 37 Bytes

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

Probieren Sie es online aus!

lol viel zu lange

Erläuterung

Ø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
quelle
@downvoter das Problem mit dem Testfall wurde behoben; Bitte entfernen Sie Ihre Ablehnung oder erklären Sie, warum Sie meine Antwort
ablehnen
Ich denke es ist wieder nicht einverstanden? Fscheint keine erlaubte Ausgabe mehr zu sein ...
Erik der Outgolfer
@EriktheOutgolfer Ah okay, ich habe diese Bemerkung nicht aktualisiert, nachdem FCM den Testfall korrigiert hat
HyperNeutrino
1

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

Etwas, von dem aus man anfangen kann, Golf zu spielen

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

Probieren Sie es online aus!

Roberto Graham
quelle
Gibt mir das falsche Ergebnis für TEXT.
Ian H.
@ IanH. Es gibt mir 'R', worum OP gebeten hat
Roberto Graham
Ich habe nicht gesehen, dass sich das in der Aufgabe geändert hat, mein schlechtes.
Ian H.
1
431 Bytes .
Jonathan Frech
Ich hatte diese Antwort nicht gesehen, als ich meine gepostet habe. Hätte ich meine als Kommentar vorschlagen sollen oder sind mehrere Antworten für dieselbe Sprache in Ordnung?
Tahg
0

Mathematica, 234 Bytes

(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
quelle
Fest! funktioniert für alle Testfälle.
J42161217