अंग्रेजी को संख्या में परिवर्तित करें [बंद]


27

चुनौती का संक्षिप्त और मीठा विवरण:

इस साइट पर कई अन्य प्रश्नों के विचारों के आधार पर, आपकी चुनौती किसी भी प्रोग्राम में सबसे रचनात्मक कोड लिखने की है जो इनपुट के रूप में अंग्रेजी में लिखे नंबर को लेती है और इसे पूर्णांक रूप में परिवर्तित करती है।

वास्तव में सूखी, लंबी और पूरी तरह से विनिर्देशों:

  • आपके प्रोग्राम को इनपुट के रूप में निम्नzero और अंग्रेजी के बीच के nine hundred ninety-nine thousand nine hundred ninety-nineसमावेश में पूर्णांक प्राप्त होगा ।
  • यह उत्पादन केवल पूर्णांक के बीच संख्या के रूप चाहिए 0और 999999और कुछ नहीं (कोई खाली स्थान के)।
  • इनपुट में या , के रूप में या में नहीं होगा ।,andone thousand, two hundredfive hundred and thirty-two
  • जब दहाई और वे स्थान दोनों 1नॉनजरो होते हैं और दहाई का स्थान इससे अधिक होता है , तो वे -एक स्थान के बजाय एक HYPHEN-MINUS वर्ण द्वारा अलग हो जाएंगे । दस हजार और हज़ारों जगहों के लिए डिट्टो। उदाहरण के लिए, six hundred fifty-four thousand three hundred twenty-one
  • कार्यक्रम में किसी अन्य इनपुट के लिए अपरिभाषित व्यवहार हो सकता है।

एक अच्छी तरह से व्यवहार कार्यक्रम के कुछ उदाहरण:

zero-> 0
fifteen-> 15
ninety-> 90
seven hundred four-> 704
sixty-nine thousand four hundred eleven-> 69411
five hundred twenty thousand two->520002


यह विशेष रूप से रचनात्मक नहीं है, न ही यह यहां के विनिर्देश से ठीक से मेल खाता है, लेकिन यह एक प्रारंभिक बिंदु के रूप में उपयोगी हो सकता है: github.com/ghewgill/text2num/blob/master/text2num.py
ग्रेग हेविग्गन

मैं इस प्रश्न का उत्तर लगभग दे सकता था ।
GRC

जटिल स्ट्रिंग पार्सिंग क्यों करते हैं? pastebin.com/WyXevnxb
Blutorange

1
वैसे, मैंने एक IOCCC प्रविष्टि देखी जो इस प्रश्न का उत्तर है।
स्नैक

2
"चार और बीस" जैसी चीजों के बारे में क्या?
शराबी

जवाबों:


93

applescript

एक मूर्खतापूर्ण, हैकी मैश-अप जो कुछ क्यूपर्टिनो / माउंटेन व्यू के लोगों को परेशान कर सकता है, लेकिन मुझे लगता है कि यह एक रचनात्मक मूर्खतापूर्ण, हैकी मैश-अप है।

set myNumber to text returned of (display dialog ¬
    "Enter number as text:" buttons {"Continue…"} ¬
    default answer "" default button 1)
tell application "Google Chrome"
    activate
    open location "https://www.google.com"
end tell
delay 5
say "ok google. " & myNumber
delay 2
tell application "System Events"
    tell application process "Google Chrome"
        set fullURL to value of text field 1 of toolbar 1 of window 1
    end tell
end tell
set AppleScript's text item delimiters to "="
display alert item 2 of text items of fullURL

पाठ संख्या बोलने के लिए OSX पाठ का उपयोग करता है, और इसके लिए सुनने और इसे पूर्णांक में बदलने के लिए Google ऑडियो खोज।

आवश्यकताओं

  • OSX
  • गूगल क्रोम
  • आपके Google खाते में वाक्-पहचान सक्षम है
  • वॉल्यूम एक उचित स्तर तक बदल गया

विलंब समय को आपके क्रोम लोड समय और Google लुकअप समय के आधार पर समायोजित करने की आवश्यकता हो सकती है।

उदाहरण इनपुट:

यहाँ छवि विवरण दर्ज करें

उदाहरण आउटपुट:

यहाँ छवि विवरण दर्ज करें


13
मुझे लगता है कि बस थोड़ा सा रचनात्मक हो सकता है ...;)
अब्राहम

5
लोल, यह शांत है
जुमला

2
शायद रचनात्मक भी
Cheezey

एक हफ्ते के बाद, आपका जवाब स्पष्ट रूप से 74 वोटों की बढ़त में है, इसलिए मुझे लगता है कि इसका मतलब है कि .. आप जीत गए! वैसे, अगर मैं इस कोड का उपयोग करूं तो क्या होगा? यह वास्तव में बहुत सारी वास्तविक दुनिया की परियोजनाओं के लिए उपयोगी होगा जो मैं अभी काम कर रहा हूं! ;)
अब्राहम

3
@Abhamham धन्यवाद! आप उत्पादन कोड में इसका उपयोग करने के बारे में मजाक कर रहे हैं, है ना?
डिजिटल ट्रामा

34

बैश, 93 64 55 अक्षर *

bsd-gamesअधिकांश लिनक्स ऑपरेटिंग सिस्टम पर उपलब्ध शानदार पैकेज में, एक छोटा कमांड-लाइन खिलौना है जिसे कहा जाता है number। यह संख्याओं को अंग्रेजी पाठ में बदल देता है, अर्थात यह इस प्रश्न के बिल्कुल विपरीत है। यह वास्तव में सटीक विपरीत है: प्रश्न में सभी नियमों का पालन किया जाता है number। यह एक संयोग होने के लिए बहुत अच्छा है।

$ number 42
forty-two.

बेशक, numberइस सवाल का जवाब नहीं है। हम इसे दूसरे तरीके से चाहते हैं। मैंने कुछ समय के लिए इस बारे में सोचा, स्ट्रिंग पार्सिंग और वह सब करने की कोशिश की, फिर एहसास हुआ कि मैं सिर्फ numberसभी 999.999 नंबरों पर कॉल कर सकता हूं और देख सकता हूं कि कुछ इनपुट से मेल खाता है या नहीं। यदि ऐसा है, तो पहली पंक्ति जहां यह मेल खाता है, मैं उस पंक्ति संख्या से दोगुना है जिसकी मुझे तलाश है ( numberहर संख्या के बाद डॉट्स की एक पंक्ति प्रिंट करता है)। इतना ही आसान। तो, आगे की हलचल के बिना, यहाँ मेरी प्रविष्टि का पूरा कोड है:

seq 0 999999|number -l|awk "/$1/{print (NR-1)/2;exit}"

यह शॉर्ट-सर्किट भी है, इसलिए "दो" परिवर्तित करना काफी तेज है, और यहां तक ​​कि उच्च संख्या आमतौर पर मेरे बॉक्स पर एक सेकंड के अंदर डिकोड हो जाती है। यहाँ एक उदाहरण चलाया गया है:

wn@box /tmp> bash unnumber.sh "zero"
0
wn@box /tmp> bash unnumber.sh "fifteen"
15
wn@box /tmp> bash unnumber.sh "ninety" 
90
wn@box /tmp> bash unnumber.sh "seven hundred four"
704
wn@box /tmp> bash unnumber.sh "sixty-nine thousand four hundred eleven"
69411
wn@box /tmp> bash unnumber.sh "five hundred twenty thousand two"    
520002

बेशक, इसके लिए आपको numberकाम करने की आवश्यकता होगी ।


* - हाँ, मुझे पता है, यह एक code-golfचुनौती नहीं है , लेकिन संक्षिप्तता मेरी प्रविष्टि का एकमात्र समझदार गुण है, इसलिए :)


8
+1। मेरे लिए, numberइस उत्तर के बारे में सबसे रचनात्मक चीज का उपयोग करना उल्टा है। यह गोल्फ अच्छा है, हालांकि :)
डिजिटल ट्रॉमा

1
यह वास्तव में काफी रचनात्मक है! मुझें यह पसंद है!
सॉकी

13

जावास्क्रिप्ट

(function parse(input) {
  var pat = "ze/on/tw/th.?r/fo/fi/ix/se/ei/ni/ten/ele".split("/");
  var num = "", last = 0, token = input.replace(/-/g, " ").split(" ");
  for(var i in token) {
    var t = token[i];
    for(var p in pat) if(t.match(RegExp(pat[p])) !== null) num += "+" + p;
    if(t.indexOf("een") >= 0) num += "+10";
    if(t.indexOf("lve") >= 0) num += "+10";
    if(t.indexOf("ty") >= 0) num += "*10";
    if(t.indexOf("dr") >= 0) { last = 100; num += "*100"; }
    if(t.indexOf("us") >= 0) {
      if(last < 1000) num = "(" + num + ")"; last = 0;
      num += "*1000";
    }
  }
  alert(eval(num));
})(prompt());

क्या आपको कुछ पसंद है eval()?

इस स्क्रिप्ट को अपने ब्राउज़र के कंसोल पर चलाएँ।

संपादित करें: प्रतिक्रिया के लिए धन्यवाद। कीड़े तय (फिर से)।


वास्तव में अच्छा कोड ^ ^
zsitro

2
जब आप "एक सौ सोलह" जैसा कुछ लिखते हैं, तो यह 126 देगा।
स्क्रब्लन 3

twelveलौटने पर शुरू होने वाले कुछ नंबरों के लिए यह कार्यक्रम विफल रहता है 23
अब्राहम

पर विफल रहता है "twenty"
200_सेक्यूट

seven thousand three hundred thirty fiveमुझे दे10335
बेबी

7

अजगर

बस गेंद लुढ़कने के लिए है।

import re
table = {'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9,
         'ten':10,'eleven':11,'twelve':12,'thirteen':13,'fourteen':14,'fifteen':15,'sixteen':16,'seventeen':17,'eighteen':18,'nineteen':19,
         'twenty':20,'thirty':30,'forty':40,'fifty':50,'sixty':60,'ninety':90}
modifier = {'hundred':100,'thousand':1000}

while True:
    text = raw_input()
    result = 0
    tmp = 0
    last_multiplier = 1
    for word in re.split('[- ]', text):
        multiplier = modifier.get(word, 1)
        if multiplier > last_multiplier:
            result = (result+tmp)*multiplier
            tmp = 0
        else:
            tmp *= multiplier
        if multiplier != 1:
            last_multiplier = multiplier
        tmp += table.get(word,0)
    print result+tmp

5

पर्ल + सीपीएएन

पहिया को फिर से क्यों मजबूत करें, जब यह पहले से ही किया गया है?

use feature 'say';
use Lingua::EN::Words2Nums;

say words2nums $_ while <>;

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

मैंने चुनौती से दोनों सैंपल इनपुट्स का उपयोग करके इस कोड का परीक्षण किया है, साथ ही 0 से लेकर 999999 तक की संख्या वाले एग्जॉस्टिव टेस्ट सूट को bsd-गेम numberयूटिलिटी (धन्यवाद, वांडर नुटा!) का उपयोग करके टेक्स्ट में परिवर्तित किया गया है , और यह सही ढंग से पेश करता है! उन सभी को। एक बोनस के रूप में, यह भी इस तरह के आदानों को समझता है जैसे minus seven(,7), four and twenty(24), four score and seven(87), one gross(144), a baker's dozen(13), eleventy-one(111) और googol(10 100 )।

( नोट: स्वयं पर्ल दुभाषिया के अलावा, इस कार्यक्रम के लिए CPAN मॉड्यूल लिंगुआ :: EN :: Words2Nums की भी आवश्यकता है । यहाँ CPAN मॉड्यूल को स्थापित करने के लिए कुछ निर्देश दिए गए हैं । डेबियन / उबंटू लिनक्स उपयोगकर्ता एपीटीटी प्रबंधक प्रबंधक के माध्यम से भी इस मॉड्यूल को स्थापित कर सकते हैं। के रूप में liblingua-en-words2nums-पर्ल ।)


4

अजगर

वैधता जाँच के साथ एक सामान्य पुनरावर्ती समाधान। आवश्यक संख्याओं की सीमा के लिए सरलीकरण किया जा सकता है, लेकिन यहाँ मुझे दिखावा करना है:

terms = 'zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen'.split()
tee  = 'twenty thirty forty fifty sixty seventy eighty ninety'.split()
for t in tee:
    terms.append(t)
    for s in terms[1:10]:
        terms.append(t+'-'+s)

terms = dict(zip(terms, range(100)))

modifiers = [('hundred', 100), ('thousand', 1000), ('million', 10**6), ('billion', 10**9)]

def read_num(words):
    if len(words) == 0: return 0
    elif len(words) == 1:
        if words[0] in terms:
            return terms[words[0]]
        else:
            raise ValueError(words[0]+' is not a valid english number.')
    else:
        for word, value in reversed(modifiers):
            if word in words:
                i = words.index(word)
                return read_num(words[:i])*value+read_num(words[i+1:])

    raise ValueError(' '.join(words)+' is not a valid english number.')

while True:
    try:
        print(read_num(input().split()))
    except ValueError as e:
        print(e)

2

VBScript 474

यह एक काफी नियमित उत्तर है ... दुर्भाग्य से, इतना नियमित रूप से @Snack ने एक ही प्रक्रिया पोस्ट की, लेकिन मुझसे पहले।

i=split(REPLACE(REPLACE(inputbox(""),"lve","een"),"tho","k"))
o=split("z on tw th fo fi si se ei ni ten ele")
y=split("red *100) k )*1000 ty *10) een +10)")
z=""
p=0
for t=0 to UBOUND(i)
    s=split(i(t),"-")
    u=ubound(s)
    r=s(0)
    for x=0 to UBOUND(o)    
        IF INSTR(r,o(x)) THEN
            z=z+"+"+CSTR(x)
        END IF
        IF u Then
            IF INSTR(s(1),o(x)) THEN
                z=z+CSTR(x)
            END IF
        END IF
    next
    for m=0 to UBOUND(y)
        IF INSTR(r,y(m))AND u=0 THEN
            z=z+y(m+1)
            p=p+1
        END IF
    next
next
Execute("MSGBOX "+String(p,"(")+z)

1

हास्केल

अन्य पुनरावर्ती समाधानों के समान, जो मुझे लगता है, लेकिन मुझे इसे साफ करने में समय लगा।

यहाँ सभी स्पष्टीकरण के साथ पूर्ण स्रोत है: http://ideone.com/fc8zcB

-- Define a type for a parser from a list of tokens to the value they represent.
type NParse = [Token] -> Int    

-- Map of literal tokens (0-9, 11-19 and tens) to their names.
literals = [
        ("zero", 0), ("one", 1), ("two", 2), ("three", 3), ("four", 4), ("five", 5), ("six", 6), ("seven", 7), ("eight", 8), ("nine", 9),
        ("eleven", 11), ("twelve", 12), ("thirteen", 13), ("fourteen", 14), ("fifteen", 15), ("sixteen", 16), ("seventeen", 17), ("eighteen", 18), ("nineteen", 19),
        ("ten", 10), ("twenty", 20), ("thirty", 30), ("fourty", 40), ("fifty", 50), ("sixty", 60), ("seventy", 70), ("eighty", 80), ("ninety", 90)
    ]

-- Splits the input string into tokens.
-- We do one special transformation: replace dshes by a new token. Such that "fifty-three" becomes "fifty tens three". 
prepare :: String -> [Token]

-- Let's do the easy stuff and just parse literals first. We just have to look them up in the literals map.
-- This is our base parser.
parseL :: NParse
parseL [tok] = case lookup tok literals of 
    Just x -> x

-- We're going to exploit the fact that the input strings have a tree-like structure like so
--                    thousand
--          hundred             hundred
--      ten       ten       ten         ten
--    lit   lit lit  lit   lit  lit    lit  lit
-- And recursively parse that tree until we only have literal values.
--
-- When parsing the tree
--       thousand
--     h1       h2
-- The resulting value is 1000 * h1 + h2.
-- And this works similarly for all levels of the tree.
-- So instead of writing specific parsers for all levels, let's just write a generic one :

{- genParse :: 
    NParse      : the sub parser
    -> Int      : the left part multiplier
    -> Token    : the boundary token 
    -> NParse   : returns a new parser -}   
genParse :: NParse -> Int -> Token -> NParse    
genParse delegate mul tok = newParser where
    newParser [] = 0
    newParser str = case splitAround str tok of
        -- Split around the boundary token, sub-parse the left and right parts, and combine them
        (l,r) -> (delegate l) * mul + (delegate r)  

-- And so here's the result: 
parseNumber :: String -> Int
parseNumber = parseM . prepare
    where   -- Here are all intermediary parsers for each level
    parseT = genParse   parseL  1       "tens"       -- multiplier is irregular, because the fifty in fifty-three is already multiplied by 10
    parseH = genParse   parseT  100     "hundred"
    parseK = genParse   parseH  1000    "thousand"
    parseM = genParse   parseK  1000000 "million" -- For fun :D

test = (parseNumber "five hundred twenty-three thousand six hundred twelve million two thousand one") == 523612002001

0

आम लिस्प, 94

(write(cdr(assoc(read-line)(loop for i to 999999 collect(cons(format()"~r"i)i)):test #'equalp)))

पाठ रूपांतरण की संख्या सीएल में बनाई गई है, लेकिन चारों ओर नहीं। संख्याओं के लिए एक रिवर्स मैपिंग बनाता है और उस पर इनपुट की जांच करता है।

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