23940 याद करने के लिए एक मेमोनी


19

प्रमुख प्रणाली एक है स्मरक शब्दों में संख्या परिवर्तित ताकि वे अधिक आसानी से याद किया जा सकता है के लिए उपकरण।

यह इस बात पर आधारित है कि शब्द किस तरह से ध्वनि करते हैं, लेकिन चुनौती के लिए चीजों को सरल रखने के लिए हम केवल इस बात से चिंतित होंगे कि शब्दों को कैसे वर्तनी दिया जाए। इसका मतलब है कि कुछ गलत रूपांतरण होंगे, लेकिन यह ठीक है।

हमारी सरलीकृत प्रमुख प्रणाली का उपयोग करके किसी संख्या को शब्द में बदलना:

  • प्रत्येक के 0साथ बदलें sया z। (कुछ हो सकते हैं sऔर कुछ हो सकते हैं z। वही नीचे जाता है।)
  • प्रत्येक बदलें 1साथ tया dया th
  • प्रत्येक के 2साथ बदलें n
  • प्रत्येक के 3साथ बदलें m
  • प्रत्येक के 4साथ बदलें r
  • प्रत्येक के 5साथ बदलें l
  • प्रत्येक बदलें 6साथ jया shया ch
  • प्रत्येक बदलें 7साथ kया cया gया q
  • प्रत्येक के 8साथ बदलें fया v
  • प्रत्येक के 9साथ बदलें pया b
  • यदि संभव हो तोaehiouwxy एक वास्तविक अंग्रेजी शब्द बनाने के लिए किसी भी मात्रा में कहीं भी पत्र जोड़ें । एकमात्र अपवाद यह है कि एक के बाद सम्मिलित नहीं किया जा सकता है या
    hsc

संख्या वास्तव में अंकों की कोई स्ट्रिंग हो सकती है 0-9 (कोई दशमलव या अल्पविराम या संकेत नहीं)।
शब्द में केवल निचले अक्षर az हो सकते हैं।

उदाहरण

संख्या 32को इस रूप में परिवर्तित किया जाना चाहिए ?m?n?, जहां ?अक्षरों से बने किसी भी परिमित स्ट्रिंग aehiouwxy( यदि आप चाहें तो मुक्त मोनोइड से एक स्ट्रिंग ) का प्रतिनिधित्व करते हैं। ऐसे कई तरीके है कि यह एक वास्तविक अंग्रेजी शब्द में बनाया जा सकता है: mane, moon, yeoman, आदि

संख्या 05को ?s?l?या के रूप में परिवर्तित किया जा सकता है ?z?l?। कुछ संभावनाएं हैं easily, hassleऔर hazel। शब्द shawlकी अनुमति नहीं है क्योंकि hबाद में नहीं रखा जा सकता है s; इसे गलत तरीके से पढ़ा जाएगा 65

चुनौती

एक प्रोग्राम या फ़ंक्शन लिखिए जो अंकों की एक स्ट्रिंग में 0-9 लेता है और उन सभी शब्दों को ढूंढता है जिन्हें सरल सरलीकृत सिस्टम मेनेमोनिक का उपयोग करके परिवर्तित किया जा सकता है।

आपके कार्यक्रम में एक शब्द सूची पाठ फ़ाइल तक पहुंच है जो परिभाषित करती है कि सभी "वास्तविक" अंग्रेजी शब्द क्या हैं। इस फ़ाइल की प्रत्येक पंक्ति पर एक लोअरकेस शब्द है, और आप वैकल्पिक रूप से मान सकते हैं कि इसमें एक अनुगामी न्यूलाइन है। यहां उन वास्तविक शब्दों की एक सूची दी गई है, जिन्हें आप परीक्षण के लिए उपयोग कर सकते हैं। आप मान सकते हैं कि यह शब्द सूची फ़ाइल f(या कुछ लंबा) कहा जाता है और किसी भी सुविधाजनक निर्देशिका में निहित है।

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

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

यदि संभव शब्द नहीं हैं, तो आउटपुट (या सूची) खाली हो जाएगा। यदि रिक्त स्ट्रिंग इनपुट है तो आउटपुट भी खाली है।

स्टड, कमांड लाइन या फ़ंक्शन के लिए एक स्ट्रिंग तर्क के रूप में इनपुट लें। शब्द सूची, या इसका फ़ाइल नाम, इनपुट का हिस्सा नहीं होना चाहिए, केवल अंक स्ट्रिंग।

आप शब्द सूची में केवल एकल शब्दों का मिलान कर रहे हैं, शब्दों के अनुक्रम नहीं। यह शब्द noonसंभवतः परिणामों में से एक होगा 22, लेकिन शब्द अनुक्रम no oneनहीं होगा।

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

मान लीजिए कि यह शब्द सूची है:

stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy

इनपुट 0123456789को छोड़कर सभी लंबे शब्द देने चाहिए zdnmrlshchvbऔर shthnmrlchgvb:

stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb

इनपुट 99देना चाहिए:

bob
pop
bop
bopy

(आउटपुट शब्द किसी भी क्रम में हो सकते हैं।)

स्कोरिंग

बाइट्स में सबसे कम सबमिशन जीतता है। टाईब्रेकर पहले पोस्ट किए गए सबमिशन में जाता है।

निफ्टी संबंधित साइट: numzi.com


1
क्या आपको इस वीडियो से इस चुनौती के लिए विचार प्राप्त हुआ ? क्योंकि मैं वास्तव में कल ही देखा था। : पी
दरवाज़े

1
@Doorknob वह वीडियो नहीं, बल्कि वह लड़का है। वर्षों पहले मुझे उनके महान पाठ्यक्रमों में से एक व्याख्यान दिया गया था । वह थोड़े बौड़म है, लेकिन वास्तव में साफ-सुथरा सामान है। :)
केल्विन के शौक

1
वास्तविक जीवन में mnemonic प्रमुख प्रणाली का उपयोग करने में रुचि रखने वालों के लिए ध्यान दें: यह केवल ध्वनि है जो मायने रखती है, न कि वर्तनी। तो "ग", जबकि यहाँ 7 के रूप में सूचीबद्ध है, वास्तव में 0 का अर्थ हो सकता है यदि शब्द में यह "एस" ध्वनि के साथ उच्चारण किया जाता है (जैसा कि "इक्का" = 0 में)। हालाँकि, मुझे यकीन है कि ओपी ने चुनौती को आसान बना दिया, क्योंकि एक पूर्ण शब्द के साथ एक शब्दकोश एक सरल शब्द सूची की तुलना में आने के लिए बहुत कठिन है। ओह, और 23940 का एक प्रतिपादन "संख्या" है।
एरिक

@ ऐरिक मैं बताता हूं कि हम पोस्ट के दूसरे वाक्य में एक वर्तनी आधारित संस्करण का उपयोग कर रहे हैं ...
केल्विन के शौक

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

जवाबों:


6

पर्ल, 87 84

open A,f;"@ARGV"eq s/[cs]h/j/gr=~y/stnmrljkfpzdcgqvb\0-z/0-90177789/dr&&print for<A>

कमांड लाइन पैरामीटर के रूप में इनपुट लेता है:

$perl m.pl 23940

मानक इनपुट पर शब्द सूची की अनुमति दी जाएगी तो कुछ हद तक कम किया जा सकता है:

$perl -lnE'INIT{$;=pop}$;eq s/[cs]h/j/gr=~y/stnmrljkfpzdcgqvba-z/0-90177789/dr&&say' 99 <f

में क्या Aमतलब है open A,f?
feersum

@ Faersum फ़ाइल को पढ़ने के लिए बाद में उपयोग किया जाने वाला फ़ाइल हैंडल ( <A>)।
नटकी

4

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

यह पायथन समाधान कमांड लाइन तर्क द्वारा अनुक्रमित भागों से एक रेगेक्स बनाता है, फिर उस (बल्कि बड़े) रेगेक्स के साथ प्रत्येक शब्द का परीक्षण करता है।

import re,sys
a='[sz] (d|th?) n m r l (j|sh|ch) [kcgq] [fv] [pb]'.split()
b=z='((?<![sc])h|[aeiouwxy])*'
for i in sys.argv[1]:b+=a[int(i)]+z
for d in open('f'):
 d=d.strip()
 if re.match('^'+b+'$',d):print d

मिनीफ़ायर से पहले मूल स्रोत:

import re,sys
regexbits = '[sz] (d|th?) n m r l (j|sh|ch) [kcgq] [fv] [pb]'.split()

regex = other = '((?<![sc])h|[aeiouwxy])*'
for i in sys.argv[1] :
    regex += regexbits[int(i)] + other
print regex     # DEBUG

for word in open('f'):
    word = word.strip()
    if re.match('^'+regex+'$', word) :
        print word

उदाहरण के लिए, परीक्षण के लिए regex 99है:

^((?<![sc])h|[aeiouwxy])*[pb]((?<![sc])h|[aeiouwxy])*[pb]((?<![sc])h|[aeiouwxy])*$

(?<![sc])hबिट घटक है कि यकीन है कि एक बनाता है एक "नकारात्मक दावे के पीछे देखो" है hएक का पालन नहीं करता sया cसामान्य भराव भागों में।

धन्यवाद केल्विन। इस चुनौती ने मुझे अपने रस्टी रेगेक्स कौशल पर ब्रश करने के लिए प्रेरित किया।


b=c='((?<![sc])h|[aeiouwxy])*'दो बाइट्स बचाएंगे।
मत्सजॉय

t|th -> th?एक बाइट बचाता है
Sp3000

आप सीधे int (i) लेकर मानचित्र से बच सकते हैं।
xnor

धन्यवाद matsjoyce, Sp3000, और उपयोगी गोल्फ युक्तियाँ के लिए xnor। अब लागू सुझावों के साथ संपादित किया गया।
लॉजिक नाइट

2

पायथन 3, 170

import sys,re
t=str.maketrans('sztdnmrljkcgqfvpb','00112345677778899','aehiouwxy\n')
for s in open('f'):re.sub('sh|ch','j',s).translate(t)!=sys.argv[1] or print(s,end='')

पठनीय संस्करण:

import sys, re

table = str.maketrans('sztdnmrljkcgqfvpb', '00112345677778899', 'aehiouwxy\n')

for line in open('f'):
    line = re.sub('sh|ch', 'j', line)
    if line.translate(table) == sys.argv[1]:
        print(line, end='')

कोड इस तथ्य का उपयोग करता है कि thयह निरर्थक है (क्योंकि यह उसी संख्या में मैप करता है t, और hएक पैडिंग चरित्र है)।

स्टैटिक maketransफ़ंक्शन दूसरे तर्क के उन लोगों के लिए पहले तर्क के पात्रों की मैपिंग करता है, और तीसरे तर्क के वर्ण None(जिसके परिणामस्वरूप उन वर्णों को हटा दिया जाएगा)।

अंतिम कोड तालिका के प्रत्यक्ष तर्क के रूप में बनाकर कुछ बाइट्स को कम किया जा सकता है translate


आप अपने नियमित अभिव्यक्ति के लिए sys.argv [1] और '[sc] h' के बजाय इनपुट () का उपयोग करके कुछ बाइट्स बचा सकते हैं।
swstephe

@swstephe। प्रतिक्रिया के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि input()इसका इस्तेमाल किया जा सकता है, क्योंकि इसे लूप के अंदर कहा जाता है। इसके अलावा, आपके सुझाए गए रेगेक्स की लंबाई वही है जो मैं पहले से ही उपयोग कर रहा हूं (5 बाइट्स)।
इखुमोरो

मैं "z, t = input (), str.maketrans ..." जैसा कुछ सोच रहा था, तो sys.argv के बजाय बस z का उपयोग करें। ठीक है, मुझे लगा कि मेरा रेगीक्स 4-बाइट्स था।
स्वस्तिक

2

sed, पेस्ट, grep, कट - 109

sed -e 's/[sc]h/6/g;s/[aehiouwxy]//g;y/sztdnmrljkcqgfvpb/00112345677778899/' w|paste w -|grep " $1$"|cut -f1

एक फ़ाइल "डब्ल्यू" लेता है, प्रत्येक शब्द को अपनी संख्या में परिवर्तित करता है, मूल पर वापस पेस्ट करता है, संख्या के लिए संक्षिप्त करता है और मिलान किए गए शब्द को वापस करता है। ध्यान दें कि grep के बाद उद्धरण के बाद व्हॉट्सएप एक टैब है, पेस्ट का डिफ़ॉल्ट सीमांकक।

मुझे पता है कि पर्ल आगे है, बस एक उदाहरण के रूप में एक बेहतर शेल संस्करण चाहता था।

अरे हाँ, $ 1 भाग का मतलब है कि इसे शेल स्क्रिप्ट से चलाया जाना चाहिए, (अधिकांश शेल को काम करना चाहिए), इसलिए यह एक कमांड-लाइन तर्क लेता है।


मैं sedपर्ल के खुले और @ARGVओवरहेड से बचने के लिए अपने उत्तर को शुद्ध में बदलने के बारे में सोच रहा था , लेकिन सीमाओं की कमी और y///इसे तोड़ने में कार्यों को हटा दिया। हैरानी की बात है कि भले ही कोई चर नहीं है लेकिन आप सीधे ही तर्क को व्यक्त कर सकते हैं sed। यहाँ मेरा 92 समाधान है:sed -e'h;s/[sc]h/6/g;y/sztdnmrljkcqgfvpb/00112345677778899/;s/[^0-9]*//g;T;s/^$1$//;x;t;d' f
नटकी

यह काम करने लगता है, क्यों यह एक जवाब नहीं है?
स्वस्तिक

1

बैश + कोरुटिल्स, 216

sed -n "$(sed 's/[aeiouwxy]//g
:l
s/\([^sc]\)h/\1/g
tl'<w|grep -nf <(eval printf '%s\\n' `sed 's/0/{s,z}/g
s/1/{t,th,d}/g
y/2345/nmrl/
s/6/{j,sh,ch}/g
s/7/{k,c,g,q}/g
s/8/{f,v}/g
s/9/{p,b}/g'<<<$1`)|sed s/:.\*/p/)" w
  • फ़ाइल नामक शब्द सूची w
  • अंतर sedउनके संभावित प्रतिस्थापनों के साथ अंकों को बदलता है
  • eval printfशेल ब्रेस एक्सपैन्शन का उपयोग सभी संभावित प्रतिस्थापनों का विस्तार करने के लिए किया जाता है
  • sed1 लाइन पर दूसरा शब्द सूची से हटाता है aeiouwxyऔर h(जब इससे पहले नहीं [sc])
  • Grep सभी नंबरों को प्रिंट करता है, जिसमें लाइन नंबर होते हैं
  • जब से हम बाहर छीन लिया है aeiouwxyऔर hशब्द सूची से, पिछले sedदूसरे करने के लिए बदल जाता है ग्रेप के परिणाम (प्रत्येक मैच के लाइन नंबर) sedअभिव्यक्ति है, जो सबसे बाहरी द्वारा संसाधित किया जाता है sedwordlist से सभी संभव शब्द प्रकट करने के लिए।

आउटपुट:

शब्द सूची फ़ाइल को एक कमांड-लाइन arg के रूप में निर्दिष्ट किया गया है, उसके बाद mnemonicize करने के लिए संख्या:

ubuntu@ubuntu:~$ ./numzi.sh 99
bob
pop
bop
bopy
boppy
$ ./numzi.sh 0123456789
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
$ 

@ केल्विन के शौक पूरे हुए।
डिजिटल ट्रामा

लगता है कि आप अपना उदाहरण अपडेट करना भूल गए।
केल्विन के शौक

-1

tr, sed, grep, xargs, sh, 77

tr 0123456789 ztnmrljkfp|sed 's/ */[aehiouwxy]*/g'|xargs sh -c 'grep -x $0 f'

स्टड में संख्या की अपेक्षा करता है और शब्द सूची को फ़ाइल में संग्रहीत किया जाना चाहिए f

सभी प्रतिस्थापनों का उपयोग नहीं करता है (1 हमेशा z होगा, 7 हमेशा k होगा), इसलिए इसे एक आलसी समाधान कहा जा सकता है, लेकिन यह [1-100] में 95 संख्याओं के लिए कम से कम एक mnemonic पाता है।


3
सवाल पूछता है कि आपको शब्द सूची में सभी मिलान शब्द मिलते हैं। आप 1हमेशा zया 7हमेशा नहीं हो सकते k। यह अमान्य है।
केल्विन के शौक

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