คำนวณการกดปุ่มโทรศัพท์มือถือ


15

งานของคุณคือการคำนวณจำนวนรวมของการกดปุ่มที่จำเป็นในการป้อนข้อความที่กำหนดในโทรศัพท์มือถือเก่า

คีย์แม็พคือ:

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

ในการพิมพ์exaMPle TExt 01คุณจะต้องกดปุ่ม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 1ทั้งหมด 37 ครั้ง

*สำคัญนำขึ้นแผนที่ของตัวละครพิเศษ:

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

กับคนแรก ( .) เน้น คุณสามารถย้ายเพื่อเน้นอักขระที่ต้องการโดยใช้ปุ่มนำทางเป็นรูปสี่เหลี่ยมผืนผ้าและใช้ปุ่มกดอื่นเพื่อเลือก

ดังนั้นในการแทรก$คุณจะกด*↓↓↓↓→→→<select>เช่นจำนวนทั้งหมด 9 ปุ่มกด

  • อินพุตจะมาจากไฟล์ที่เรียกว่าsourceอยู่ในไดเรกทอรีปัจจุบัน / ไดเรกทอรีของโปรแกรมของคุณ แก้ไข:ตามคำขอในความคิดเห็นฉันกำลังเพิ่มSTDINเป็นวิธีการป้อนข้อมูลที่ถูกต้อง ขออภัยในการเปลี่ยนข้อมูลจำเพาะหลังจากได้รับคำตอบ
  • คุณต้องส่งออก Total key presses <total_keypresses>
  • หากไฟล์อินพุตมีอักขระใด ๆ ที่ไม่ได้อยู่ในคีย์แม็พที่กำหนดแสดงว่าโปรแกรมของคุณต้องออกInvalid character <character> in sourceและออก

กล่าวโดยย่ออินพุตและเอาต์พุตของโปรแกรมของคุณจะต้องคล้ายกับสคริปต์หลามนี้ (ไม่ได้รับการสแกน):

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

นี่คือรหัสกอล์ฟโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ


ข้อจำกัดความรับผิดชอบหน้าด้าน: ฉันทำความท้าทายนี้จะมีการแปลสคริปต์หลามดังกล่าวข้างต้นในภาษาที่แตกต่างกันซึ่งจะนำมาใช้เพื่อให้คะแนนความท้าทายนี้ใน sandbox


เราควรผิดพลาดและออกทันทีหรือเมื่อพบอักขระที่ไม่ถูกต้อง?
nyuszika7h

@ nyuszika7h ขึ้นอยู่กับคุณ แต่คุณต้องพิมพ์อักขระที่ไม่ถูกต้อง สมมติว่ามีอักขระที่ไม่ถูกต้อง 10 ตัวในแหล่งที่มาคุณสามารถเลือกหนึ่งในนั้นพิมพ์ว่าอักขระนั้นไม่ถูกต้องและออก มันไม่จำเป็นต้องเกิดขึ้นครั้งแรกของตัวละครที่ไม่ถูกต้อง
user80551

7
ข้อกำหนดการป้อนข้อมูลเป็นความอัปยศ ไฟล์ I / O มีราคาแพงอย่างไม่น่าเชื่อในบางภาษาและเป็นไปไม่ได้ในภาษาอื่นทั้งหมด
Dennis

1
หากคุณกำลังจะอนุญาตให้แบบฟรีฟอร์ม IO ผมมีทางออก J 171 ตัวอักษรที่เป็น sha1 1ce5a2fdd0316e37c0a07d151d02db766a3adbb7กัญชา
Julıʇǝɥʇuʎs

2
@Dennis Allowed STDIN
user80551

คำตอบ:


4

GolfScript, 219 ตัวอักษร

วิธีการพื้นฐานโดยใช้ตารางการค้นหา:

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

ลองที่นี่


1
ทำได้ดีมาก :) Delphi ดูดที่ lol นี้ .. เพิ่งเสร็จแล้วและฉันที่ 459 xD ต้องปรับปรุง!
Teun Pronk

1
อินพุตต้องมาจากไฟล์ชื่อsourceไม่ใช่ STDIN
user80551

หากต้องการอ่านจากไฟล์ให้ยืมจากทับทิม:"#{File.read('source')}"
Justin

1
@Quincunx คุณสามารถวางวงเล็บจากนั้น:"#{File.read'source'}"
Ventero

คุณสามารถเก็บสิ่งนี้ไว้ได้ฉันอนุญาตให้ STDIN ได้แล้วตอนนี้
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 #$."

รูปแบบการเข้ารหัสที่ง่ายมากจนถึงตอนนี้: มีอักขระมากกว่า 75% ที่ใช้สำหรับสตริง / อาร์เรย์ตัวอักษร ...


2

CJam, 207 ไบต์

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

โปรแกรมนี้มี 207 ตัวอักษร ด้วยการเข้ารหัสที่เหมาะสม (Windows-1252) จะมีขนาดพอดีกับ 207 ไบต์

โปรดทราบว่า Stack Exchange จะแปลงแท็บ (ซึ่งฉันใช้เป็นตัวคั่นในตารางการค้นหา) เป็นช่องว่างดังนั้นคุณจึงไม่สามารถคัดลอกและวางรหัสด้านบนได้

การใช้

การเข้ารหัส Windows-1252

$ 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

$ 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 ตัวอักษร (อ่านจาก STDIN ตอนนี้)

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

กอล์ฟครั้งแรกของฉันจนถึงตอนนี้ :)

อยากลองวิธีที่ค่อนข้างแปลกใหม่ แทนที่จะมีรายการของตัวละครทุกตัวและจำนวนคลิกที่ต้องการในการสร้างฉันใช้ค่า ASCII ของตัวละครและคำนวณการกดปุ่มที่ต้องการ คิดว่ามันจะทำให้ฉันมีตัวละครบางตัวก่อนตอนนี้ฉันคิดว่ามันนานกว่าวิธีเรียงตัว

ปัญหาหลักของฉันคือปุ่ม 7 และ 9 ซึ่งมีตัวอักษร 4 ตัวแทนที่จะเป็น 3 ดังนั้นฉันต้องสร้างทางเลือกสองทางซึ่งทำให้โค้ดของฉันเกือบ 200 ตัว

เวอร์ชันที่ไม่ดี

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

ฉันคิดว่ายังมีอีกหลายห้องสำหรับการปรับปรุง แต่ฉันมีความสุขกับเรื่องนี้

อีกสิ่งที่ไม่ดีคือการใช้ที่จำเป็นiconv()สำหรับรายการของอักขระพิเศษ บางส่วนของ ( ,, ¥... ) เหล่านี้ไม่ได้รับการสนับสนุนโดย PHP


€, ฯลฯ ไม่ใช่ตัวอักษร ASCII, นั่นเป็นเหตุผลที่สคริปต์ ธ ของฉันประกาศการเข้ารหัส utf-8 นั่นคือความคิดเห็นพิเศษตีความโดยหลาม
user80551

utf8_decodeจะทำงานที่ดีสำหรับตัวละครทุกตัวยกเว้นของ นั่นเป็นเหตุผลที่ฉันต้องใช้iconvแทน รหัสของฉันไม่ได้คำนวณอักขระพิเศษเหล่านี้เหมือนกับที่มีในตัวอักษรปกติเนื่องจากพวกมันไม่ได้อยู่ในลำดับและฉันไม่สามารถทำงานกับค่า ASCII ที่เกี่ยวข้องได้อย่างน่าเชื่อถือ มันใช้รายการปกติสำหรับพวกเขา
Padarom

2

Python 3, 239 ตัวอักษร

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

แก้ไข

รุ่นของเชลล์ใช้เชลล์ spydermonkey อ่านจากไฟล์ 'source' เขียนถึง 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)

ก่อนอื่นลองทำงานในคอนโซล FireFox โดยใช้ป๊อปอัพสำหรับอินพุตและเอาต์พุต

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

อ่านง่าย

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 ฉันค่อนข้างไกลพร้อมกับรหัสของฉันดังนั้นฉันคิดว่าฉันโพสต์ไว้เพื่อการอ้างอิง ฉันไม่คิดว่าคนอื่นใช้วิธีนี้

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.