Handy-Tastendruck berechnen


15

Ihre Aufgabe ist es, die Gesamtzahl der Tastendrücke zu berechnen, die erforderlich sind, um einen bestimmten Text auf einem alten Mobiltelefon einzugeben.

Die Keymaps sind:

1:1
2:abcABC2
3:defDEF3
4:ghiGHI4
5:jklJKL5
6:mnoMNO6
7:pqrsPQRS7
8:tuvTUV8
9:wxyzWXYZ9
0:<space><newline>0

Zum Tippen exaMPle TExt 01müssen Sie 33 99 2 6666 77777 555 33 0 8888 33333 99 8 0 <a 1-sec pause here in real life but we'll ignore it>000 1insgesamt 37 Tasten drücken .

Die *Taste ruft eine Karte mit Sonderzeichen auf:

.,'?!
"-()@
/:_;+
&%*=<
>£€$¥
¤[]{}
\~^¡¿
§#|`

mit dem ersten ( .) hervorgehoben. Mit den rechteckigen Navigationstasten können Sie das gewünschte Zeichen markieren und es ist ein weiterer Tastendruck erforderlich, um es auszuwählen.

Zum Einfügen $würden Sie *↓↓↓↓→→→<select>also insgesamt 9 Tastendrücke drücken.

  • Die Eingabe erfolgt aus einer Datei, sourcedie im aktuellen Verzeichnis / Verzeichnis Ihres Programms abgelegt ist. BEARBEITEN: Pro Anfragen in Kommentaren füge ich STDINals gültige Eingabemethode hinzu. Entschuldigung für die Änderung der Spezifikation nach Erhalt der Antworten.
  • Sie müssen ausgeben Total key presses <total_keypresses>
  • Wenn die Eingabedatei ein Zeichen enthält, das nicht in der angegebenen Keymap enthalten ist, muss Ihr Programm ausgeben Invalid character <character> in sourceund beenden .

Kurz gesagt, die Eingabe und Ausgabe Ihres Programms muss derjenigen dieses (ungolfed) Python-Skripts ähneln:

# This Python file uses the following encoding: utf-8
from __future__ import print_function
import sys

general_dict = { '1':1,
                 'a':1, 'b':2, 'c':3, 'A':4, 'B':5, 'C':6, '2':7,
                 'd':1, 'e':2, 'f':3, 'D':4, 'E':5, 'F':6, '3':7,
                 'g':1, 'h':2, 'i':3, 'G':4, 'H':5, 'I':6, '4':7,
                 'j':1, 'k':2, 'l':3, 'J':4, 'K':5, 'L':6, '5':7,
                 'm':1, 'n':2, 'o':3, 'M':4, 'N':5, 'O':6, '6':7,
                 'p':1, 'q':2, 'r':3, 's':4, 'P':5, 'Q':6, 'R':7, 'S':8, '7':9,
                 't':1, 'u':2, 'v':3, 'T':4, 'U':5, 'V':6, '8':7,
                 'w':1, 'x':2, 'y':3, 'z':4, 'W':5, 'X':6, 'Y':7, 'Z':8, '9':9,
                 ' ':1, '\n':2, '0':3
                }

special_chars = ['.',',',"'",'?','!','"','-','(',')','@','/',':','_',';','+','&','%','*','=','<','>','£','€','$','¥','¤','[',']','{','}','\\','~','^','¡','¿','§','#','|','`']
for x in special_chars:
    general_dict[x]=(special_chars.index(x)/5) + (special_chars.index(x)%5) + 2

key_press_total = 0
with open('source') as f: # or # with sys.stdin as f:
    for line in f:
        for character in line:
            if character in general_dict:
                key_press_total+=general_dict[character]
            else:
                print('Invalid character',character,'in source')
                sys.exit(1)

print('Total key presses',key_press_total)

Dies ist Code-Golf, das kürzeste Programm in Bytes gewinnt.


Schamloser Haftungsausschluss: Ich habe mich dieser Herausforderung gestellt, um Übersetzungen des obigen Python-Skripts in verschiedene Sprachen zu haben, die verwendet werden, um diese Herausforderung im Sandkasten zu bewerten .


Sollten wir einen Fehler machen und sofort beenden oder wenn ein ungültiges Zeichen auftritt?
nyuszika7h

@ nyuszika7h Es liegt an dir, aber du musst das ungültige Zeichen drucken, das war. Angenommen, die Quelle enthält 10 ungültige Zeichen. Sie können eines davon auswählen, drucken, dass dieses Zeichen ungültig ist, und beenden. Es muss nicht das erste Vorkommen eines ungültigen Zeichens sein.
User80551

7
Die Eingabeanforderung ist eine Schande. Datei-E / A ist in einigen Sprachen wahnsinnig teuer und in anderen völlig unmöglich.
Dennis

1
Wenn Sie mehr Freiform-E / A zulassen möchten, habe ich eine J-Lösung von 171 Zeichen, die sha1-Hash ist 1ce5a2fdd0316e37c0a07d151d02db766a3adbb7.
ɐɔıʇǝɥʇuʎs

2
@ Tennis erlaubt STDIN
user80551

Antworten:


4

GolfScript, 219 Zeichen

Grundlegender Ansatz unter Verwendung einer Nachschlagetabelle:

"Total key presses "0@1/{"1adgjmptw °behknqux\n.°cfilorvy0,\"°ADGJMsTz'-/°BEHKNPUW?(:&°CFILOQVX!)_%>°23456R8Y@;*£¤°SZ+=€[~°79<$]^§°¥{¡#°}¿|°`°".2$?)\1$<"°"/,{"Invalid character  in source"18/*puts'"#{''exit}"'+~}if\;+}/

Versuchen Sie es hier .


1
Schön gemacht :) Delphi saugt an diesem lol .. gerade meine fertig und ich bin bei 459 xD müssen verbessert werden!
Teun Pronk

1
Die Eingabe muss aus einer Datei mit dem Namen sourceSTDIN erfolgen
user80551

Um aus der Datei zu lesen, leihen Sie sich Ruby aus:"#{File.read('source')}"
Justin

1
@ Quincunx Sie können die Klammern aus dem "#{File.read'source'}"
löschen

Sie können dies so lassen, wie es ist, ich habe jetzt STDIN erlaubt.
User80551

3

Ruby 2.0, 232

$.-=~(%W[1adgjmptw\s
behknqux.\n
cfilorvy0,"
ADGJMsTz-'/
BEHKNPUW?(:&
CFILOQVX!)_%>
23456R8Y@;*£¤
SZ+=€[\\
79<$]~§
¥{^{#
}¡|
¿`].index{|s|s[$c]}||$><<"Invalid character #$c in source"&exit)while$c=$<.getc
puts"Total key presses #$."

Bisher sehr einfaches Kodierungsschema: Über 75% der Zeichen werden für String- / Array-Literale verwendet ...


2

CJam, 207 Bytes

q:Q{" dptgwj1am hxk
.bnequ  ,0flco\"rviy    DT'/GsJz-AM (HP?KW&:BNEU    LXCO_>FV!%)IQ   48@3;*26R¤£5Y   €\+S[Z= $<§7~9] #{^¥ |¡}    `¿"'    /{1$#W>\}%1#)}%_0#){"Invalid character "Q@0#=" in source"}{:+"Total key presses "\}?

Dieses Programm hat 207 Zeichen. Bei entsprechender Codierung (Windows-1252) passt es in 207 Bytes.

Beachten Sie, dass Stack Exchange Registerkarten (die ich als Trennzeichen in der Nachschlagetabelle verwende) in Leerzeichen konvertiert, sodass Sie den obigen Code nicht kopieren und einfügen können.

Verwendung

Windows-1252-Codierung

$ base64 -d > keys.cjam <<< cTpReyIgZHB0Z3dqMWFtCWh4awouYm5lcXUJLDBmbGNvXCJydml5CURUJy9Hc0p6LUFNCShIUD9LVyY6Qk5FVQlMWENPXz5GViElKUlRCTQ4QDM7KjI2UqSjNVkJgFwrU1taPQkkPKc3fjldCSN7XqUgfKF9CWC/IicJL3sxJCNXPlx9JTEjKX0lXzAjKXsiSW52YWxpZCBjaGFyYWN0ZXIgIlFAMCM9IiBpbiBzb3VyY2UifXs6KyJUb3RhbCBrZXkgcHJlc3NlcyAiXH0/
$ wc -c keys.cjam
207 keys.cjam
$ echo 'Hello, world!' | LANG=en_US.CP1252 cjam keys.cjam; echo
Total key presses 39
$ echo 'á' | LANG=en_US.CP1252 cjam keys.cjam; echo
Invalid character á in source

UTF-8-Codierung

$ base64 -d > keys.cjam <<< cTpRezpDIiBkcHRnd2oxYW0JaHhrCi5ibmVxdQksMGZsY29cInJ2aXkJRFQnL0dzSnotQU0JKEhQP0tXJjpCTkVVCUxYQ09fPkZWISUpSVEJNDhAMzsqMjZSwqTCozVZCeKCrFwrU1taPQkkPMKnN345XQkje17CpSB8wqF9CWDCvyInCS97MSQjVz5cfSUxIyl9JV8wIyl7IkludmFsaWQgY2hhcmFjdGVyICJRQDAjPSIgaW4gc291cmNlIn17OisiVG90YWwga2V5IHByZXNzZXMgIlx9Pw==
$ wc -cm keys.cjam
209 217 keys.cjam
$ echo 'Hello, world!' | LANG=en_US.UTF8 cjam keys.cjam; echo
Total key presses 39
$ echo 'á' | LANG=en_US.UTF8 cjam keys.cjam; echo
Invalid character á in source

2

PHP, 711 708 676 Zeichen (wird jetzt aus STDIN gelesen)

<?php $message=iconv("UTF-8","CP1252",fread(STDIN,1024));@$s=str_split;$special=iconv("UTF-8","CP1252",'.,\'?!"-()@/:_;+&%*=<>£€$¥¤[]{}\~^¡¿§#|`');$z=0;foreach($s($message)as$l){$a=ord($l);$b=$a;if($a==13)continue;($a>114||($a>82&&$a<91))&&$a--;$w=$a<58?($a-48):($a<91?($a-64):($a-96));$y=($a<58?1:($w%3?$w%3:3));$a<91&&$y+=3;$a<58&&$y=7;if($a==55||$a==57)$y=9;if($b==115||$b==122)$y=4;if($b==90||$b==83)$y=8;if(($b>79&&$b<83)||($a>85&&$a<89))$y++;($a==32||$a==49)&&$y=1;$a==10&&$y=2;$a==48&&$y=3;$u=array_search($l,$s($special));if($u!==false){$y=2+floor($u/5)+$u%5;}$z+=$y;if(($a<32||$a>127)&&$a!=10){echo"Invalid character $l in source";exit();}}echo"Total key presses $z";

Mein erster Golf bisher :)

Wollte einen eher unkonventionellen Ansatz ausprobieren. Anstatt eine Liste jedes Zeichens zu haben und wie viele Klicks erforderlich sind, um es zu erstellen, verwende ich die ASCII-Werte des Zeichens und berechne ihre erforderlichen Tastendrücke. Dachte, es würde mir zuerst ein paar Charaktere ersparen, jetzt denke ich, ist es sogar länger als ein Array-Ansatz.

Mein Hauptproblem sind die Tasten 7 und 9, die 4 anstatt 3 Buchstaben haben. Deshalb musste ich ein paar Fallbacks erstellen, die meinen Code um fast 200 Zeichen in die Luft sprengten.

Ungolfed-Version

<?php
@$source = source;
$h = fopen($source, @r);
$message = iconv("UTF-8", "CP1252", fread($h, filesize($source)));
@$split = str_split;
$special = iconv("UTF-8", "CP1252", '.,\'?!"-()@/:_;+&%*=<>£€$¥¤[]{}\~^¡¿§#|`');
$count = 0;
foreach ($split ($message) as $character) {
    $ascii = ord($character);
    $helper = $ascii;
    if ($a == 13) continue;
    ($a > 114 || ($a > 82 && $a < 91)) && $ascii--;
    $key = $ascii < 58 ? ($a - 48) : ($a < 91 ? ($a - 64) : ($a - 96));

    $presses = ($a < 58 ? 1 : ($key % 3 ? $key % 3 : 3));

    // This part uses a lot of (probably unnecessary or still optimizable) fallbacks
    // for those characters, that are on "4-letter-keys"
    $ascii < 91 && $presses += 3;
    $ascii < 58 && $presses = 7;
    if ($a == 55 || $a == 57) $presses = 9;
    if ($helper == 115 || $helper == 122) $presses = 4;
    if ($helper == 90 || $helper == 83) $presses = 8;
    if (($helper > 79 && $helper < 83) || ($a > 85 && $a < 89)) $presses++;
    $ascii == 32 && $presses = 1;
    $ascii == 10 && $presses = 2;
    $ascii == 48 && $presses = 3;
    $ascii == 49 && $presses = 1;

    $key = array_search($l, $split($special));
    if ($key !== false){
        $presses = 2 + floor($key/5) + $key % 5;
    }

    $count += $presses;
    if ($a < 32 && $a > 127 && $a != 10) {
        echo "Invalid character $l in source";
        exit();
    }
}
echo "Total key presses $count";

Ich gehe davon aus, dass es noch viel Raum für Verbesserungen gibt, aber ich bin ziemlich zufrieden damit.

Eine weitere schlechte Sache ist die erforderliche Verwendung von iconv()für die Liste der Sonderzeichen. Einige davon ( , ¥, ...) nicht nativ von PHP unterstützt.


€ ¥ usw. sind keine ASCII-Zeichen, deshalb deklariert mein Python-Skript die utf-8-Codierung. Das ist ein spezieller Kommentar, der von Python interpretiert wird.
User80551

utf8_decodewürde gut funktionieren für jeden Charakter mit Ausnahme von . Deshalb musste ich iconvstattdessen verwenden. Mein Code berechnet diese Sonderzeichen nicht wie normale Zeichen, da sie nicht in Ordnung sind und ich nicht zuverlässig mit ihren jeweiligen ASCII-Werten arbeiten kann. Es wird eine normale Liste für sie verwendet.
Padarom

2

Python 3, 239 Zeichen

s='1adgjmptw 1behknqux\n.1cfilorvy0,"1ADGJMsTz\'-/1BEHKNPUW?(:&1CFILOQVX!)_%>123456R8Y@;*£¤1SZ+=€[\\179<$]~§1¥{^#1}¡|1¿`'
print('Total key presses',sum(s[:s.find(c)+1].count('1')or exit('Invalid character %c in source'%c)for c in input()))

1

JavaScript (E6) 291

Bearbeiten

Shell-Version mit Spydermonkey-Shell. Lesen Sie aus einer 'Quell'-Datei und schreiben Sie sie in sdtout

z=t=0,[...read('source')].map(c=>t-=~((i=".\"/&>¤\\§,-:%£[~#'(_*€]^|?);=${¡`!@+<¥}¿".indexOf(c))<0?(p="0\n 9ZYXWzyxw8VUTvut7SRQPsrqp6ONMonm5LKJlkj4IHGihg3FEDfed2CBAcba10".split(c)[1])?p.search(/\d/):z="Invalid character "+c+" in source":i%8-~(i>>3))),print(z||"Total key presses "+t)

Erster Versuch, funktioniert in der FireFox-Konsole mit Popup für Ein- und Ausgabe

P=m=>(z=t=0,[...m].map(c=>t-=~((i=".\"/&>¤\\§,-:%£[~#'(_*€]^|?);=${¡`!@+<¥}¿".indexOf(c))<0
?(p="0\n 9ZYXWzyxw8VUTvut7SRQPsrqp6ONMonm5LKJlkj4IHGihg3FEDfed2CBAcba10".split(c)[1]) 
?p.search(/\d/):z="Invalid character "+c+" in source":i%8-~(i>>3))),z||"Total key presses "+t);
alert(P(prompt()))

Lesbar

P=m=>(
  z=t=0,
  [...m].map(
    c=>t-=~(
      (i = ".\"/&>¤\\§,-:%£[~#'(_*€]^|?);=${¡`!@+<¥}¿".indexOf(c)) < 0
      ? (p = "0\n 9ZYXWzyxw8VUTvut7SRQPsrqp6ONMonm5LKJlkj4IHGihg3FEDfed2CBAcba10".split(c)[1]) 
        ? p.search(/\d/)
        : z="Invalid character "+c+" in source"
      : i%8 - ~(i>>3)
    )
  ),  
  z||"Total key presses "+t
);

0

VBScript 435

Unterstützt keine Nicht-ASCII-Zeichen. Ich war ziemlich weit mit meinem Code zusammen und dachte, ich würde ihn als Referenz posten. Ich glaube nicht, dass irgendjemand anders diesen Ansatz gewählt hat.

i=inputbox(i)
a=SPLIT("1 abcABC2 defDEF3 ghiGHI4 jklJKL5 mnoMNO6 pqrsPQRS7 tuvTUV8 wxyzWXYZ9 0")
a(9)=" "+vbLf+"0"
b=SPLIT(".,'?! ""-()@ /:_;+ &%*=< >£€$¥ ¤[]{} \~^¡¿ §#|` x x")

for o=1 to len(i)
n=0
    for x=0 to 9
        for c=1 to 10
            d=mid(i,o,1)
            IF n=0 AND mid(b(x),c,1)=d THEN n=c+x
            IF mid(a(x),c,1)=d THEN n=c
        next
    next
    z=n+z  
    IF n=0 THEN EXIT FOR
next
o="Total key presses "+cstr(z)
IF n=0 THEN o="Invalid character "+d+" in source"
msgbox o
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.