सेल-फोन कुंजी की गणना करें


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और बाहर निकलना चाहिए ।

संक्षेप में, आपके प्रोग्राम के इनपुट और आउटपुट को इस (ungolfed) अजगर स्क्रिप्ट से मिलता जुलता होना चाहिए:

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

यह बाइट्स जीत में कोड-गोल्फ, सबसे छोटा कार्यक्रम है।


बेशर्म अस्वीकरण: मैंने इस चुनौती को उपरोक्त अजगर लिपि के विभिन्न भाषाओं में अनुवाद करने के लिए बनाया है जिसका उपयोग सैंडबॉक्स में इस चुनौती को स्कोर करने के लिए किया जाएगा ।


क्या हमें त्रुटि और बाहर निकलना चाहिए या जब अवैध चरित्र का सामना करना पड़ता है?
नौसिखिया h

@ nyuszika7h यह आपके ऊपर है, लेकिन आपको यह छापना होगा कि कौन सा अमान्य चरित्र है। मान लीजिए कि स्रोत में 10 अमान्य वर्ण हैं, तो आप उनमें से किसी एक का चयन कर सकते हैं, यह प्रिंट कर सकते हैं कि वह चरित्र अमान्य है और बाहर निकला है। इसे अमान्य चरित्र की पहली घटना होने की आवश्यकता नहीं है।
user80551

7
इनपुट आवश्यकता एक शर्म की बात है। फ़ाइल I / O कुछ भाषाओं में बहुत महंगा है और दूसरों में पूरी तरह से असंभव है।
डेनिस

1
यदि आप अधिक मुक्त-फॉर्म IO की अनुमति देने के लिए थे, तो मेरे पास 171 वर्णों का J हल है, जो sha1 हैश है 1ce5a2fdd0316e37c0a07d151d02db766a3adbb7
atı

2
@ डेसीन मंजूर STDIN
user80551

जवाबों:


4

गोल्फस्क्रिप्ट, 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
अच्छी तरह से किया :) डेल्फी इस लोल में बेकार है .. बस मेरा और im 459 xD पर सुधार करने की जरूरत है!
त्युन प्रोक

1
इनपुट को नाम की फ़ाइल से होना चाहिए source, न कि STDIN
user80551

फ़ाइल से पढ़ने के लिए, माणिक से उधार लें:"#{File.read('source')}"
जस्टिन

1
@Quincunx आप कोष्ठकों को उस से गिरा सकते हैं:"#{File.read'source'}"
वेंचरो

आप इसे वैसे ही रख सकते हैं, मैंने STDIN को अभी अनुमति दी है।
user80551

3

रूबी 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 बाइट्स में फिट बैठता है।

ध्यान दें कि स्टैक एक्सचेंज टैब (जो मैं लुकअप तालिका में सीमांकक के रूप में उपयोग करता है) को रिक्त स्थान में परिवर्तित करता है, इसलिए आप उपरोक्त कोड को कॉपी और पेस्ट नहीं कर सकते।

प्रयोग

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 द्वारा समर्थित नहीं हैं।


€ €, आदि एससीआई अक्षर नहीं हैं, यही कारण है कि मेरी अजगर स्क्रिप्ट utf-8 एन्कोडिंग की घोषणा करती है। यह अजगर द्वारा व्याख्या की गई एक विशेष टिप्पणी है।
user80551

utf8_decodeहर चरित्र के लिए ठीक काम करेगा सिवाय की । इसलिए मुझे iconvइसके बजाय उपयोग करना था। मेरा कोड इन विशेष वर्णों की गणना नहीं करता है जैसे कि यह सामान्य पात्रों के साथ करता है, क्योंकि वे क्रम में नहीं हैं और मैं उनके संबंधित ASIIII मूल्यों के साथ मज़बूती से काम नहीं कर सकता। यह उनके लिए एक सामान्य सूची का उपयोग कर रहा है।
पडरोम

2

पायथन 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

जावास्क्रिप्ट (E6) 291

संपादित करें

शैल संस्करण, स्पाइडरमोनकी शेल का उपयोग करते हुए। 'स्रोत' फ़ाइल से पढ़ें, 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)

पहला प्रयास, इनपुट और आउटपुट के लिए पॉपअप का उपयोग करके फायरफॉक्स कंसोल में काम करता है

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

गैर-एएससीआईआई चार्ट का समर्थन नहीं करता है। मैं अपने कोड के साथ बहुत दूर था इसलिए मैंने सोचा कि मैं इसे संदर्भ के लिए पोस्ट करूंगा। मुझे नहीं लगता कि किसी और ने इस दृष्टिकोण का इस्तेमाल किया।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.