Cep telefonu tuş basımlarını hesaplama


15

Göreviniz, eski bir cep telefonuna belirli bir metni girmek için gereken toplam tuş basma sayısını hesaplamaktır.

Tuş haritaları:

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

Türü için exaMPle TExt 01, tuşuna ediyorum 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 137 basılmasını olmak üzere toplam.

*Anahtar özel karakterlerin bir haritasını getirir:

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

ilki ( .) vurgulanmış olarak. Dikdörtgen gezinme tuşlarını kullanarak gereken karakteri vurgulamak için hareket edebilirsiniz ve seçmek için başka bir tuşa basmanız gerekir.

Eklemek için $, *↓↓↓↓→→→<select>yani toplam 9 tuşa basabilirsiniz.

  • Girdi, sourceprogramınızın geçerli dizinine / dizinine yerleştirilen adlı bir dosyadan olacaktır . EDIT: Yorumlar istekleri başına, STDINgeçerli bir giriş yöntemi olarak ekliyorum . Cevapları aldıktan sonra teknik özellikleri değiştirdiğiniz için özür dileriz.
  • Çıktı almalısınız Total key presses <total_keypresses>
  • Girdi dosyası verilen tuş haritasında olmayan herhangi bir karakter içeriyorsa, programınız çıktı almalı Invalid character <character> in sourceve çıkmalıdır.

Kısacası, programınızın giriş ve çıkışı bu (çözümsüz) python betiğininkine benzemelidir:

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

Bu kod golf, bayt kazanır en kısa program kazanır.


Utanmaz feragatname: Bu meydan okumayı, sanal alanda bu meydan okumayı puanlamak için kullanılacak farklı dillerde yukarıdaki python betiğinin çevirilerine sahip olmak için yaptım .


Hemen mı yoksa geçersiz karakterle karşılaştığımızda hata mı vermeliyiz?
nyuszika7h

@ nyuszika7h Bu size bağlı, ancak geçersiz karakteri yazdırmanız gerekir. Kaynakta 10 geçersiz karakter olduğunu varsayalım, bunlardan herhangi birini seçebilir, bu karakterin geçersiz olduğunu yazdırabilir ve çıkabilirsiniz. Geçersiz bir karakterin ilk tekrarlanması gerekmez.
user80551

7
Giriş gereksinimi bir utançtır. Dosya G / Ç bazı dillerde inanılmaz pahalıdır ve diğerlerinde tamamen imkansızdır.
Dennis

1
Daha fazla serbest biçimli IO'ya izin verirseniz, sha1 hash olan 171 karakterlik bir J çözümüm var 1ce5a2fdd0316e37c0a07d151d02db766a3adbb7.
Julıʇǝɥʇuʎs

2
@Dennis İzinli STDIN
user80551

Yanıtlar:


4

GolfScript, 219 karakter

Bir arama tablosu kullanarak temel yaklaşım:

"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\;+}/

Burada deneyin .


1
Güzel bitti :) Delphi bu lol berbat .. sadece bitmiş mayın ve im 459 xD de geliştirmek gerekir!
Teun Pronk

1
source
Girişin

Dosyadan okumak için yakuttan ödünç alın:"#{File.read('source')}"
Justin

1
@Quincunx Parantezleri buradan bırakabilirsiniz:"#{File.read'source'}"
Ventero

Bunu olduğu gibi tutabilirsiniz, şimdi STDIN'e izin verdim.
user80551

3

Yakut 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 #$."

Şimdiye kadar çok basit kodlama şeması: karakterlerin% 75'inden fazlası dize / dizi değişmezleri için kullanılıyor ...


2

CJam, 207 bayt

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 "\}?

Bu program 207 karakterden oluşmaktadır. Uygun kodlama ile (Windows-1252), 207 bayta sığar.

Stack Exchange sekmeleri (arama tablosunda ayırıcı olarak kullandığım) boşluklara dönüştürdüğünü unutmayın, böylece yukarıdaki kodu kopyalayıp yapıştıramazsınız.

kullanım

Windows-1252 kodlaması

$ 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 kodlaması

$ 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 karakter (şimdi STDIN'den okuma)

<?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";

Şimdiye kadarki ilk golfüm :)

Oldukça sıradışı bir yaklaşım denemek istedim. Her karakterin bir listesini ve oluşturmak için kaç tıklama gerektiğini yerine, karakterin ASCII değerlerini kullanıyorum ve gerekli tuş basımlarını hesaplıyorum. Bana önce bazı karakterleri ayıracağını düşündüm, şimdi bir dizi yaklaşımından bile daha uzun olduğunu düşünüyorum.

Benim asıl sorunum 3 yerine 4 harf olan 7 ve 9 tuşları.

Ungolfed sürümü

<?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";

Sanırım hala iyileştirilmesi gereken çok şey var, ama bundan oldukça memnunum.

Başka bir kötü şey, iconv()özel karakterler listesi için gerekli kullanımıdır . Bunlardan bazıları ( ,, ¥...) PHP tarafından yerel olarak desteklenmemektedir.


€ ¥, vb ascii karakterler değildir, bu yüzden python betiğim utf-8 kodlamasını bildirir. Bu python tarafından yorumlanan özel bir yorumdur.
user80551

utf8_decode her karakter için iyi çalışır haricinde arasında . Onun iconvyerine kullanmak zorundaydım . Kodum, sıralı olmadıkları için normal karakterlerle olduğu gibi bu özel karakterleri hesaplamıyor ve ilgili ASCII değerleriyle güvenilir bir şekilde çalışamıyorum. Onlar için normal bir liste kullanıyor.
Padarom

2

Python 3, 239 karakter

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

Düzenle

Kabuk sürümü, spydermonkey kabuğu kullanarak. Bir 'kaynak' dosyadan okuyun, sdtout'a yazın

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)

İlk deneme, giriş ve çıkış için açılır pencere kullanarak FireFox konsolunda çalışır

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

Okunabilir

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

ASCII dışı karakterleri desteklemez. Ben çok referans ile göndermek istiyorum bu yüzden benim kod ile birlikte oldu. Başka kimsenin bu yaklaşımı kullandığını sanmıyorum.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.