ऐसे शब्द जो अंकीय हो


20

एक अंक शब्द एक शब्द है, जहां संभवतः कुछ अक्षरों को हटाने के बाद, आपको एक अंक के साथ छोड़ दिया जाता है: एक, दो, तीन, चार, पांच, छह, सात, आठ या नौ (शून्य नहीं)।

उदाहरण के लिए, BOUNCE और ANNOUNCE अंक शब्द हैं, क्योंकि इनमें अंक एक होता है।

ENCODE एक अंक शब्द नहीं है, भले ही इसमें O, N और E शामिल हों, क्योंकि वे क्रम में नहीं हैं।

एक प्रोग्राम / फ़ंक्शन लिखें जो एक एकल (अपरकेस या लोअरकेस - आप चुनते हैं) शब्द को इनपुट या एक पैरामीटर के रूप में लिखता है और यह निर्धारित करता है कि क्या यह एक अंक शब्द है। कोड को यथासंभव छोटा करें।

यदि शब्द अंक शब्द नहीं है, तो आपको 'NO', 0 या कोई भी 'फॉल्सी' मान वापस करना चाहिए (यह आपकी भाषा के आधार पर भिन्न हो सकता है)। यदि शब्द एक अंक शब्द है, तो आपको एक अंक के रूप में, उस अंक को आउटपुट करना चाहिए।

आप मान सकते हैं कि किसी भी शब्द में एक से अधिक अंक नहीं हैं, इसलिए आपके पास ONFIVE जैसा कुछ भी नहीं होगा।

परीक्षण के मामलों

BOUNCE
1

ENCODE
NO

EIGHT
8

BLACKJACK
NO

FABULOUS
NO

EXERCISE
NO

DRIFTWOOD
2

SERVICEMAN
7

INSIGNIFICANCE
9

THROWDOWN
2

ZERO
NO

OZNERO
1

यह चुनौती BIO 2009 से प्रश्न 1 से (और बहुत मामूली संशोधन है) ली गई है । अधिकांश परीक्षण मामले मार्क स्कीम से लिए गए हैं ।


3
क्या यह वास्तव में महत्वपूर्ण है कि हम केवल बड़े शब्दों को स्वीकार करते हैं, या क्या हम इसके बजाय निचले शब्दों को स्वीकार करना चुन सकते हैं?
ग्रेग मार्टिन

6
NOFELINEVET5 और 9 दोनों शामिल हैं ... मुझे क्या लौटना चाहिए?
टाइटस

3
क्या हम 0पसंद की भाषा में गलत नहीं होने पर भी अंक अंकों के मामले में वापस आ सकते हैं ?
निमि

@ नियम: नियमों से: "आप मान सकते हैं कि किसी भी शब्द में एक से अधिक अंक नहीं हैं"
nimi

@GregMartin खैर, मुझे लगता है कि यह चुनौती के लिए कुछ भी नहीं जोड़ता है, इसलिए हां, लोअरकेस को अनुमति दी जाती है। मैंने इसे बदल दिया है।
0WJYxW9FMN

जवाबों:


9

जावास्क्रिप्ट (ईएस 6), 101 99 बाइट्स

f=
s=>-~'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split` `.findIndex(x=>s.match([...x].join`.*`))
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value))>
<datalist id=l><option value=BOUNCE>
<option value=ENCODE>
<option value=EIGHT>
<option value=BLACKJACK>
<option value=FABULOUS>
<option value=EXERCISE>
<option value=DRIFTWOOD>
<option value=SERVICEMAN>
<option value=INSIGNIFICANCE>
<option value=THROWDOWN>
<option value=ZERO>
<option value=OZNERO>


7

PHP> = 7.0, 87 बाइट्स

<?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO

यदि केवल एक अंक से वर्णों का सम्मिलन शब्द के रूप में इनपुट तक किया जाता है, तो अंक के साथ कार्यक्रम से बाहर निकलें। या levenshtein("DIGIT $argn",IntlChar::charName("$i"),1,1,0)वर्णों के विलोपन को न गिनने के लिए क्रम बदलें

Levenshtein

IntlChar :: charName

PHP> = 7.0, 112 बाइट्स

for(;$i<9;)$r+=++$i*preg_match("#".chunk_split(substr(IntlChar::charName("$i"),6),1,".*")."#",$argn);echo$r?:NO;

IntlChar :: charName

PHP, 128 बाइट्स

foreach([ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE]as$v)$r+=++$k*preg_match("#".chunk_split($v,1,".*")."#",$argn);echo$r?:NO;

इसे ऑनलाइन आज़माएं!

अधिक अंक के लिए 143 बाइट्स

foreach([ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE]as$v)$r.=++$k*preg_match("#".chunk_split($v,1,".*")."#",$argn);echo+$r?strtr($r,[""]):NO;

इसे ऑनलाइन आज़माएं!


1
foreach(...)$r+=++$k*preg_match(...);echo$r?:NO;(-1 बाइट)। chunk_split($v,1,".*")के बजाय join(...)(-2 बाइट्स)।
टाइटस

@ chunk_splitमेरे साथ प्रतिस्थापन के साथ बहुत अच्छा विचार पहले कभी नहीं देखा। आपको टिप्स सेक्शन में प्रवेश करना चाहिए
Jörg Hülsermann

दुष्ट विचार! अपने प्रश्न का उत्तर देने के लिए: I´ll पर एक नज़र IntlChar::enumCharNames... कल।
टाइटस

2
levenshtein()काम करने लगता है <?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO:।
user63956

@ user63956 महान विचार धन्यवाद। बाद में खोजने के लिए आपको इसे टिप्स सेक्शन में जोड़ना चाहिए
Jörg Hülsermann

5

पायथन 3, 150 बाइट्स

from itertools import*;lambda x:([i for i in range(10)if(*' OTTFFSSENNWHOIIEIIEORUVXVGN  ERE EHE  E   NT '[i::9],)in[*combinations(x+'  ',5)]]+[0])[0]

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


5

गणितज्ञ, 83 बाइट्स (WindowsANSI एन्कोडिंग)

±w_:=Rest@Position[Subsets@w~Cases~#&/@Characters@*IntegerName~Array~9,Except@{},1]

एक यूनीरी फ़ंक्शन को परिभाषित करता है जो ±इनपुट के रूप में लोअरकेस वर्णों की एक सूची लेता है और या तो एक अंक देता है, जैसे कि फॉर्म में {{7}}, या फिर एक खाली सूची {}। मुझे ऐसा नहीं लगता है कि मैंने यहां पर एक टन की गॉल्फ़ी की थी, सिवाय इसके कि Characters@*IntegerName~Array~9नंबर-नाम के मैचों को बिना हार्ड-कोडिंग के देखने के लिए उत्पन्न करता है।

उदाहरण का उपयोग:

±{"i", "n", "s", "i", "g", "n", "i", "f", "i", "c", "a", "n", "c", "e"}

पैदावार {{9}}


1
उपयोग स्पष्ट करने के लिए संपादित
ग्रेग मार्टिन

4

जेली , 31 28 बाइट्स

-2 बाइट्स अब लोअरकेस इनपुट स्वीकार्य है

“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»Ḳe€ŒPT

एक पूर्ण प्रोग्राम जो लोअरकेस इनपुट की अपेक्षा करता है और परिणाम को प्रिंट करता है, 0फाल्सी केस के लिए उपयोग करता है।

एक मोनाडिक लिंक के रूप में, पात्रों की एक सूची लेने के कारण यह वास्तव में पूर्णांकों की एक सूची देता है, जो 0कि फाल्सी केस में एकल होता है, अपेक्षित उपयोग के मामलों में 1और बीच में एक ही पूर्णांक शामिल होता है और 9ऐसे मामलों में कई प्रविष्टियाँ होती हैं जहाँ एक से अधिक संख्याएँ मौजूद होती हैं। शब्द।

इसे ऑनलाइन आज़माएं!

कैसे?

“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»Ḳe€ŒPT - Main link: list of characters, s
“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»       - dictionary lookup of "one two three four five six seven eight nine"
                      Ḳ      - split on spaces
                         ŒP  - partitions of s
                       e€    - exists in? for €ach
                           T - truthy indexes

आप संपीड़ित तारों का उपयोग कैसे करते हैं ??? > _> लिन द्वारा कंप्रेसर मेरे लिए काम नहीं करता है, कोई सुझाव?
हाइपरएन्यूट्रीनो

जेली चैट रूम में जाएं और त्रुटि / समस्या पोस्ट करें।
जोनाथन एलन

1
अपरकेस की आवश्यकता नहीं है।
एरिक आउटगोल्फर

3

रूबी + to_words : 49 48 + 12 = 61 60 बाइट्स

झंडे का उपयोग करता है -rto_words -n। लोअरकेस शब्द लेता है। nilयदि कोई "अंक" नहीं मिलता है, तो लौटाता है।

-1 बाइट अब कि लोअरकेस इनपुट की अनुमति है, iरेग्ज पर ध्वज को हटाने की अनुमति देता है ।

p (1..9).find{|i|$_=~/#{i.to_words.chars*".*"}/}

बाहरी रत्नों के बिना अधिक शुद्ध रूबी उत्तर के लिए, 91 + 1 = 92 बाइट्स:

p (1..9).find{|i|$_=~/#{%w"0 ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"[i].chars*".*"}/}

2

05AB1E , 26 बाइट्स

यहाँ मिथ्या मूल्य 0 है

æ‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘#å1k>

स्पष्टीकरण:

æ                           # Compute the powerset of the input
 ‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘       # Push "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"
                     #      # Break on spaces
                      å     # Check each for membership
                       1k   # Get the index of 1 in the array (-1 if not found)
                         >  # Increment by one

05AB1E एन्कोडिंग का उपयोग करता है । इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें!


2

हास्केल, 113 111 बाइट्स

import Data.List
last.((`elemIndices`([]:words"ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"))=<<).subsequences

इसे ऑनलाइन आज़माएं!

0यदि कोई अंक नहीं मिलता है, तो वापस लौटता है।

अंकों की सूची में इनपुट शब्द के सभी बाद का पता लगाएं। []इंडेक्स 0 पर एक खाली स्ट्रिंग को प्रेप करें जो हर परवर्ती का हिस्सा है। elemIndicesसूचकांकों की सूची लौटाता है और =<<उन्हें एक सूची में समतल करता है। आखिरी इंडेक्स उठाओ।


2

जावास्क्रिप्ट (ईएस 6), 121 बाइट्स

f=
s=>[...s].map(c=>a=a.map(s=>s.slice(s[0]==c)),a=`ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE`.split` `)&&1+a.indexOf(``)
<input oninput=o.textContent=f(this.value)><pre id=o>0

सबसे कम पाए गए अंकों को लौटाता है या 0यदि कोई अंक नहीं पाया गया (+6 NOआवश्यक हो तो)।



2

रेटिना , 160 126 120 बाइट्स

O.*N.*E
1
T.*W.*O
2
T.*H.*R.*E.*E
3
F.*O.*U.*R
4
F.*I.*V.*E
5
S.*I.*X
6
S.*E.*V.*E.*N
7
E.*I.*G.*H.*T
8
N.*I.*N.*E
9
\D

इसे ऑनलाइन आज़माएं!

यदि इनपुट में अंक नहीं है तो एक रिक्त स्ट्रिंग लौटाता है।

-6 बाइट्स @CalculatorFeline को धन्यवाद ।


1 बाइट बचा: के 0बजाय का उपयोग करें NO
कैलक्यूलेटरफलाइन

@CalculatorFeline या यहां तक ​​कि एक खाली स्ट्रिंग जो कि 6 char सेव है। धन्यवाद!
eush77

1

PHP, 134 132 128 बाइट्स

<?=preg_match(strtr(chunk_split("#(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE",1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO;

पाइप के साथ चलाएं -nFया इसे ऑनलाइन आज़माएं

कोष्ठक में शब्दों के साथ एक रेगेक्स बनाता है; यानी प्रत्येक शब्द Nमें है Nवें उप अभिव्यक्ति।
यदि कोई शब्द पाया जाता है, तो मिलान स्ट्रिंग में $m[0]और Nवें तत्व में होगा, उनके बीच के तत्वों के साथ खाली और पीछे कोई खाली स्ट्रिंग नहीं होगा; का $mहैN+1 तत्वों।


ग्रेट आई लव
इट

1
आप अपने खुद के विचार से 3 बाइट्स बचा सकते हैं थोड़ा सुधार <?=preg_match("#(".strtr(chunk_split(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE,1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO; इसे ऑनलाइन आज़माएं!
जोर्ग हल्सरमैन

क्या आप मेरे नए दृष्टिकोण का उपयोग कर सकते हैं?
जॉर्ग हुल्सरमैन

1

पायथन , 148 बाइट्स

from itertools import*
lambda s:[tuple(w)in combinations(s,len(w))for w in("x ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE "+s).split()].index(1)%10

एक अनाम समारोह एक अपरकेस केवल शब्द ले रहे हैं और (पूर्णांक लौटने 1के लिए 9), या 0के लिए NO

इसे ऑनलाइन आज़माएं!

कैसे?

एक इनपुट स्ट्रिंग के लिए sसमारोह स्ट्रिंग की एक सूची के माध्यम से पार करता: "x", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", और s। खुद कोई मैच की तलाश में *

उपयोग की जाने वाली तुलना यह है कि क्या यह स्ट्रिंग, wइनपुट से क्रम में अक्षरों के संयोजन से बन सकती है। combinationsहमारे लिए यह फ़ंक्शन मिलता है (और केवल आवश्यक लंबाई वाले का उपयोग करके len(w)), लेकिन वे ट्यूपल्स के रूप में हैं, इसलिए तार तुलना के लिए ट्यूपल्स में डाले जाते हैं।

ग्यारह परिणामों में से एक "x"हमेशा के लिए होगा False, जबकि एक sस्वयं के लिए हमेशा रहेगा True"x"वहाँ के साथ एक मैच के सूचकांक सुनिश्चित करने के लिए है ONEके माध्यम से NINEआवश्यक मान रहे हैं (के बाद से अजगर सूचियों हैं 0-अनुक्रमित), sवहाँ के लिए कॉल सुनिश्चित करने के लिए है index(1)(का पर्याय बन गया index(True)) नहीं होते असफल जब कोई अंकों शब्द जिस जिसके परिणामस्वरूप मिला था 10का 0उपयोग कर दस के एक modulo के साथ परिवर्तित किया जाता है%10

* यदि sकिसी कारण से रिक्त स्थान हैं, तो wएस की सूची लंबी हो जाएगी, लेकिन प्रक्रिया अभी भी काम करेगी क्योंकि अंक शब्द मैच उसी तरह काम करेंगे, और यदि कोई भी मैच से पहली स्पेस-स्प्लिट सबस्ट्रिंग sमैच नहीं करेगा, तो एक बार फिर से दे रहा है 10और लौट रहा है 0

यदि कई अंकों के शब्द मौजूद हैं, तो फ़ंक्शन न्यूनतम एक को वापस करेगा।


1

जावा, 167 153 बाइट्स

s->{for(int i=0;i<9;)if(s.matches(".*"+"".join(".*","ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i++].split(""))+".*"))return i;return"NO";}

एक भोली कार्यान्वयन, रेगेक्स पर मेल।

परीक्षण और अपुष्ट

import java.util.function.Function;

public class Main {

  public static void main(String[] args) {
    Function<String, Object> f = s -> {
      for (int i = 0; i < 9;) {
        if (s.matches(".*" + "".join(".*", "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i++].split("")) + ".*")) {
          return i;
        }
      }
      return "NO";
    };

    String[] tests = {
      "BOUNCE",
      "ENCODE",
      "EIGHT",
      "BLACKJACK",
      "FABULOUS",
      "EXERCISE",
      "DRIFTWOOD",
      "SERVICEMAN",
      "INSIGNIFICANCE",
      "THROWDOWN",
      "ZERO",
      "OZNERO"
    };

    for (String test : tests) {
      System.out.printf("%s%n%s%n%n", test, f.apply(test));
    }
  }
}

बचाता है

  • 167 -> 153: @KevinCruijssen के लिए विभिन्न अनुकूलन धन्यवाद

1
आप केवल सरणी एक बार उपयोग करते हैं, तो आप उपयोग कर सकते हैं "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i].split("")के लिए लूप में सीधे, और से छुटकारा पाने String[]N=और ;। और आप फॉर-लूप के क्रम को बदलकर एक अतिरिक्त 2 बाइट्स बचा सकते हैं: अगर-चेक की जगह का for(int i=0;i<9;)उपयोग करें, और वापसी में छुटकारा पाएं । [i++][i]+1
केविन क्रूज़सेन

आप को बदलने के द्वारा एक और बाइट बचा सकते हैं "".joinकरने के लिए s.join
केविन क्रूजसेन

1

बैश , 163 बाइट्स

a=NO;case $1 in *O*N*E*)a=1;;*T*W*O*)a=2;;*T*H*R*E*E*)a=3;;*F*O*U*R*)a=4;;*F*I*V*E*)a=5;;*S*I*X*)a=6;;*S*E*V*E*N*)a=7;;*E*I*G*H*T*)a=8;;*N*I*N*E*)a=9;;esac;echo $a

इसे ऑनलाइन आज़माएं!

a=NO;
case $1 in
 *O*N*E*)a=1;;
 *T*W*O*)a=2;;
 *T*H*R*E*E*)a=3;;
 *F*O*U*R*)a=4;;
 *F*I*V*E*)a=5;;
 *S*I*X*)a=6;;
 *S*E*V*E*N*)a=7;;
 *E*I*G*H*T*)a=8;;
 *N*I*N*E*)a=9;;
esac;
echo $a

RETINA नहीं जानते, लेकिन उस उत्तर का एक सीधा पोर्ट लगता है।


के *साथ कम करने की कोशिश की गई j=0;for i in ONE TWO .. ; do ((j++)); printf "%s)a=%s;;" $(sed 's/./\*&\*/g' <<<$i) $j ; done थी, लेकिन लंबे समय तक था
17:04

0

जावास्क्रिप्ट, 121 बाइट्स

(s,a=0)=>'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split``.map((p,i)=>RegExp(p.split``.join`.*`).exec(s)?a=i+1:0)&&a

या 116

(s,a=0)=>' ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split` `.map((p,i)=>a|=~s.search(p.split``.join`.*`)&&i)&&a

लेकिन इस बिंदु पर सिर्फ रीसाइक्लिंग सामग्री।


0

पायथ, -44- 41 बाइट्स

+1xm}dyQc."EX%~)Û#lº,îQÓCe¯4Aô4"\P1

एक उद्धृत स्ट्रिंग लेता है, NO के लिए 0 आउटपुट देता है।

कोशिश करो!

व्याख्या

+1xm}dyQc."EX%~)Û#lº,îQÓCe¯4Aô4"\P1
         ."EX%~)Û#lº,îQÓCe¯4Aô4"      # Compressed string: "ONEPTWOPTHREEPFOURPFIVEPSIXPSEVENPEIGHTPNINE" (P is close to the other letters, makes the compression better)
        c                       \P    # split on P: ['ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE']
   m                                  # map over this list (variable: d)
    }dyQ                              # is d a (ordered) subset of the input (Q)? (= element of the powerset)
  x                                1  # get the index of the first true
+1                                    # add one, because the list was indexed at 0 and conveniently -1 (not found) becomes 0 

0

जावा, 254 बाइट्स

int g(String a,String b){int i=0,p=0;for(char c:a.toCharArray()){p=i;i=b.indexOf(c);if(i<=p)return 0;}return 1;}
String f(String a){String[]T={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};for(String t:T)if(g(t,a)>0)return t;return"NO";}

ऑनलाइन प्रयास करें

boolean g(String a,String b)
{
    int i = 0, p = 0;
    for(char c:a.toCharArray())
    {
        p = i;
        i = b.indexOf(c);
        if(i <= p) return false;
    }
    return true;
}

String f(String a)
{
    String[]T={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};
    for(String t:T)if(g(t,a))return t;
    return"NO";
}


0

पायथन 2, 155 बाइट्स

import re;lambda k:next((i for i,j in enumerate([re.search('.*'.join(list(s)),k)for s in'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split()])if j),-1)+1

एक अनाम फ़ंक्शन regex समूह की खोज कर रहा है। पायथन में यहां पर सबसे अच्छा समाधान नहीं बल्कि एक वैकल्पिक तरीका है।

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