Es scheint diesen anhaltenden Wahnsinn zu geben, wenn Leute mühsam neue Tastaturlayouts wie Dvorak oder Neo erlernen, weil sie dadurch angeblich produktiver werden. Ich behaupte, dass das Wechseln des Tastaturlayouts eine schlechte Idee ist, da es Monate dauern kann, bis Sie auf dem neuesten Stand sind, und wenn Sie im Endeffekt 5% schneller als der Rest sind, sind Sie fertig, wenn Sie auf einem nicht kompatiblen Computer tippen müssen nicht deine eigene.
Außerdem vergessen all diese Menschen, wo der eigentliche Engpass in der modernen Kommunikation liegt - die Telefontastatur.
So sieht eine durchschnittliche Telefontastatur aus:
Buchstabe 'r' ist der dritte Buchstabe auf Knopf 7; Wenn Sie also auf einem Mobiltelefon den Buchstaben "r" eingeben, drücken Sie die Taste 7 dreimal, bei "s" viermal und bei "a" einmal die Taste 2.
In Anbetracht dessen war es wahrscheinlich eine schlechte Entscheidung, "e" nach "d" zu setzen - "e" ist der am häufigsten verwendete Buchstabe im englischen Alphabet. Wenn Sie also Knopf 3 "EDF" anstelle von "DEF" beschriften, haben Sie würde ziemlich viele Tastenanschläge sparen.
Darüber hinaus haben Sie wahrscheinlich selbst erlebt, dass die Eingabe von 2 Buchstaben, die dieselbe Schaltfläche haben, ein Ärgernis ist. Wenn Sie "TU" schreiben möchten, können Sie nicht einfach dreimal 8 drücken, da dies zu "V" führen würde. Normalerweise schreibst du 'T', drückst dann die Leertaste, drückst dann die Rücktaste und dann 'U', was 5 Tastendrücken anstelle von 3 entspricht.
TL; DR
Angesichts dieser beiden Regeln:
- Ein Buchstabe wird durch n-maliges Drücken einer Taste eingegeben, wobei n die Position ist, an der sich der Buchstabe auf der Beschriftung der Taste befindet
- Das Schreiben von zwei Buchstaben, die mit derselben Taste eingegeben wurden, erfordert zusätzliche 2 Tastendrücke
Wie sieht das Layout der Telefontastatur aus, bei dem bei einem bestimmten Text am wenigsten gedrückt werden muss? Sie sollten nur die Tasten 2-9 verwenden, 1 und 0 sind für spezielle Symbole reserviert.
Eingang
Der Text, für den Sie das optimale Layout finden sollten, wird über stdin geliefert. Sie müssen nichts anderes als das Kleinbuchstaben behandeln und können davon ausgehen, dass die Eingabe nur aus diesem besteht. Sie können auch davon ausgehen, dass der eingegebene Text ziemlich groß ist und jeder Buchstabe mindestens einmal darin enthalten ist, wenn dies hilfreich ist.
Ausgabe
Ich möchte die Ausgabe nicht zu stark einschränken, da dies manchmal einige Sprachen gegenüber anderen vorteilhafter macht. Wenn Ihre Sprache jedoch Arrays anzeigt, ist dies in Ordnung. Alternativ können Sie jedes Etikett mit einem Zeilenumbruch trennen.
Möglicherweise gibt es mehrere optimale Layouts. Sie können eines davon drucken. Hier ist ein einfaches Beispiel:
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
Bonuspunkte
-35 wenn Ihr Algorithmus nicht alle möglichen Layouts brachial erzwingt (ich schaue hier auf Haskells `Permutationen ')
-3 wenn Ihr Code in eine Textnachricht passt (140 Zeichen) und Sie ein Bild von Ihnen posten, das Ihren Code an einen Freund sendet.
Dies ist meine erste Herausforderung bei StackExchange. Ich würde mich freuen zu hören, ob es Ihnen gefällt oder ob Sie ein anderes Feedback dazu haben!
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
eindeutige Permutationen, bei denen die einfachen Neuanordnungen der Tasten nur einmal gezählt werden.Antworten:
Perl, 333
Hier ist ein Versuch, für Regel # 2 zu optimieren. Nach meinem obigen Kommentar und anstelle von Antworten unter Berücksichtigung dieser Regel (vgl. Hohe Fragenbewertung) dachte ich, dass ich hier etwas Mühe schulde ...
Lösungen, die nicht für Regel 2 optimiert sind, können eine Ausgabe erzeugen, die weit vom Optimum entfernt ist. Ich habe langen natürlichen englischen Text ("Alice im Wunderland") überprüft, vorverarbeitet (nur Kleinbuchstaben) und z. B. Perl-Skript aus der Antwort von OJW
er
Alleine ruiniert es und einige andere Paare hätten niemals auf demselben Schlüssel enden dürfen ...Übrigens
zxqjvkbpfmygwculdrshnioate
sind die Buchstaben von diesem Text aus in aufsteigender Reihenfolge sortiert.Wenn wir versuchen, es auf einfache Weise zu lösen (in der Hoffnung auf einen Bonus von -35) und Buchstaben nacheinander zu platzieren, indem wir den verfügbaren Schlüssel nach einer minimalen Anzahl von Paaren auswählen, können wir beispielsweise mit Folgendem enden:
Ich poste hier keine Postleitzahl für diese (falsche) Lösung. ZB beachten Sie,
c
ist häufiger alsw
und steht an erster Stelle.tc
(ct
) Paare sind offensichtlich seltener alsac
(ca
) - 43 + 235 gegenüber 202 + 355. Aber dannw
endet es mita
- 598 + 88. Wir enden mit Paarenaw
undtc
(964 insgesamt), obwohl es besser wäreac
undtw
(635 insgesamt). Etc..Der nächste Algorithmus versucht also, alle 8 verbleibenden (oder 2, wenn zuletzt) häufigsten Buchstaben mit den bereits auf der Tastatur befindlichen Buchstaben abzugleichen und sie so zu platzieren, dass die paarweise Anzahl minimal ist.
Ergebnis ist:
Ich mag das
ac
Paar nicht (die Katze ist schließlich eine der Figuren), aber das ist immer noch die optimale Buchstabenplatzierung für Englisch, wenn mein Code nicht falsch ist. Nicht gerade "Golfen" Aufwand, nur eine funktionierende Lösung, hässlich oder nicht.quelle
Python3, es ist Montecarlo-Zeit!
Um dieses Problem zu lösen, zähle ich zuerst, wie viele "Klicks" Sie mit der Standardtastatur benötigen (ursprünglich:)
abc,def,ghi,jkl,mno,pqrs,tuv,wxyz
. Dann ändere ich diese Tastatur und überprüfe, ob sie billiger ist (der Text ist mit weniger Klicks geschrieben). Wenn diese Tastatur billiger ist, wird sie zur Standardtastatur. Ich iteriere diesen Vorgang1M
mal.Um die Tastatur zu ändern, entscheide ich zuerst, wie viele Änderungen vorgenommen werden sollen (die maximale Anzahl der Änderungen ist die Gesamtzahl der Buchstaben auf der Tastatur). Dann wähle ich für jeden Schalter zwei Knöpfe und zwei Positionen und übertrage ein Zeichen von der ersten auf die zweite Position.
Die maximale Anzahl von Schaltern pro Zeit ist die Anzahl der Buchstaben auf der Tastatur, da dies die minimale Anzahl von Änderungen ist, die Sie von zwei vollständig verschiedenen Tastaturen aus vornehmen müssen. (Ich möchte, dass es immer möglich ist, von einer Tastatur zu einer anderen zu wechseln.)
Die Ausgabe von
echo "jackdawslovemybigsphinxofquartz" | python .\myscript.py
ist:Wo
61
ist die Anzahl der gedrückten Tasten, um eine bestimmte Nachricht zu verfassen?Zeichen (keine Leerzeichen und keine Kommentare): 577
Ich weiß, es ist lang, aber ich bin wirklich neu in diesem Zeug.
Ich fand es so lustig, dass ich mich entschied, diesen Algorithmus mit LO HOBBIT auszuprobieren (ich habe auch ein Original zu Hause!). Es hat
383964
Buchstaben und dies sind die paar Klicks gegen Tastatur , die ich finde:Ich behaupte also, das letzte ist eine der praktischsten Tastaturen (in Bezug auf Klicks).
quelle
Nun, wenn Sie nur die beliebtesten Zeichen für die Klassen 2 bis 9 haben möchten, kann Perl dies in 127 Zeichen tun ...
etwas geben wie:
Oder drucken Sie alles in einer Zeile aus und entfernen Sie 12 Zeichen:
quelle
$x{$_}++for split/\s*/,<>;map$o{$n++%8}.=$_,sort{$x{$b}<=>$x{$a}}keys%x;print map"$_:".$o{$_-2},2..9
Haskell, 160 - 35 = 125
Beispiel:
Man könnte argumentieren, dass dies nicht für Regel 2 optimiert, sondern die häufigsten Buchstaben auf verschiedene Schlüssel legt .
quelle
JavaScript, 192 - 35 = 157
Ich habe gerade die Regel für sich wiederholende Zeichen bemerkt. das berücksichtigt das nicht. Aber wie @mniip in seiner Antwort vermerkte:
Dies wäre wahrscheinlich in Ruby gewesen, aber ich bin nicht zu Hause und muss den Internet Explorer (eww) verwenden. Aber hey, es macht manchmal Spaß, Sprachen zu benutzen, die beim Golfen schrecklich sind! ;)
Beispielausgabe (für Ihre Eingabe):
Da JS kein STDIN hat, geht das Programm davon aus, dass die Eingabe in einer Variablen gespeichert ist
s
.quelle
'abcdefghia'
nicht gerade optimal.'azbcdefghizjklmnopqzrstuvwxyz'
b=['','','','','','','','']
nachb=[x='',x,x,x,x,x,x,x]
,s.split('')
nachs.split(x)
undo[x]=o[x]?o[x]+1:1
nach optimiereno[x]=-~o[x]
.Python (119-35 = 84):
Angenommen, die Zeichenfolge ist eine Variable a und enthält nur Kleinbuchstaben:
ungolfed:
PYG (76-35 = 41):
Aaah, wir können den enormen Import fallen lassen. Auch hier wird davon ausgegangen, dass sich die abisolierte Zeichenfolge in einem befindet.
quelle