वन लेटर स्वैप


18

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

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

यह आपके अपेक्षित कार्यक्रम का एक उदाहरण है, समान शब्दों के लिए जाँच करना golf

> ./similar golf /usr/share/dict/words
Goff
Wolf
gold
golfs
goof
gulf
wolf

/usr/share/dict/wordsप्रत्येक के बाद लाइन ब्रेक के साथ शब्दों की एक सूची है। आप आसानी से उदाहरण के लिए () के साथ पढ़ सकते हैं।

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

आप किसी भी भाषा का उपयोग करने के लिए स्वतंत्र हैं। पंच कार्ड के साथ भी, कंपनी के पास अधिकांश आधुनिक प्रोग्रामिंग भाषाओं की पहुंच है, जैसे कि कोबोल रूबी या हास्केल या जो भी आप चाहते हैं। यहां तक ​​कि उनके पास गोल्फस्क्रिप्ट भी है, अगर आपको लगता है कि यह स्ट्रिंग हेरफेर के लिए अच्छा है (मुझे नहीं पता, शायद ...)।

विजेता को मुझसे 15 प्रतिष्ठा अंक मिलते हैं, और शायद समुदाय से बहुत सारे अन्य बिंदु। अन्य अच्छे उत्तरों में 10 अंक और समुदाय से भी अंक मिलेंगे। आपने सुना है कि अंक बेकार हैं, लेकिन सबसे अधिक संभावना है कि वे 2050 में डोलर्स की जगह लेंगे। हालांकि इसकी पुष्टि नहीं की गई थी, लेकिन वैसे भी अंक प्राप्त करना अच्छा है।


6
हमें "लेवेंसहाइट दूरी या किसी भी समान एल्गोरिथ्म के बाहरी कार्यान्वयन या उपयोग नहीं करना चाहिए?" वहाँ 30 चरित्र Mathematica समाधान चला जाता है।
माइकल स्टर्न

@ मिचेल स्टर्न और इसी तरह की छोटी अजगर एक इस रेगीक्स लाइब्रेरी
मार्टिन एंडर


"जैसे कि रूबी या हास्केल" - ठीक है, मुझे मिल गया है, आप मुझे भाग लेना चाहते हैं।
जॉन ड्वोरक

कृपया एक बेहतर उदाहरण प्रदान करें, ताकि सभी प्रकार के परिवर्तन दिखाई दें या लोग गलत एल्गोरिदम प्रस्तुत करते रहें।
बेंत की मार

जवाबों:


4

GolfScript, 59 वर्ण

{32|}%"*"%.|(:w;{:x,),{:^[x>.1>]{.[^w=]\+}%{^x<\+w=},},},n*

यकीन है, GolfScript स्ट्रिंग हेरफेर के लिए बहुत अच्छा है !

क्या गोल्फस्क्रिप्ट फ़ाइल I / O या कमांड-लाइन तर्कों को हैंडल करने में बहुत अच्छा नहीं है। इस प्रकार, यह कार्यक्रम स्टड के माध्यम से अपने सभी इनपुट प्राप्त करने की उम्मीद करता है: पहली गैर-रिक्त लाइन को लक्ष्य शब्द के रूप में लिया जाता है, जबकि शेष लाइनों में शब्दकोश होना चाहिए। यूनिक्स प्रणाली पर, आप इस कोड को निम्न प्रकार से चला सकते हैं:

(echo golf; cat /usr/share/dict/words) | ruby golfscript.rb similar.gs

मेरे उबुन्टु लिनक्स बॉक्स पर, उपरोक्त कमांड का आउटपुट है:

goff
wolf
gold
golfs
goof
gulf

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

इसके अलावा, कोड वास्तव में धीमा है, क्योंकि यह एक काफी बल बल दृष्टिकोण का उपयोग करता है, और यह भी स्पष्ट अनुकूलन का उपयोग नहीं करता है जैसे कि उम्मीदवार शब्द की लंबाई लक्ष्य शब्द से मेल खाती है Still 1. फिर भी, यह जाने का प्रबंधन करता है पूर्ण, अनफ़िल्टर्ड /usr/share/dict/wordsसूची के माध्यम से ... उम ... मैं आपको बता दूंगा कि यह कब खत्म होगा, ठीक है?

संपादित करें: ठीक है, इसमें लगभग 25 मिनट लगे, लेकिन यह खत्म हो गया।


स्ट्रिंग हेरफेर (और गोल्फस्क्रिप्ट में स्ट्रिंग हेरफेर करने के लिए कितना अच्छा है) के सटीक प्रतिनिधित्व के लिए +1
प्लाज़्मापॉवर

6

बैश + कोरुटिल्स, 99 बाइट्स

या तो मैं पूरी तरह से इस सवाल को गलत समझा ( @ lambruscoAcido का जवाब बहुत अलग परिणाम देता है ), या यह एक बिल्कुल सीधा regexp अनुप्रयोग है:

for((i=0;i<${#1};i++)){
a=${1:0:i}
b=${1:i+1}
egrep -i "^($a$b|$a.$b|$a.${1:i}|$1.)$" $2
}|sort -u

आउटपुट:

$ ./similar.sh गोल्फ / यूएसआर / शेयर / तानाशाही / शब्द
गौफ
सोना
गोल्फ़
golfs
मूर्ख
खाड़ी
भेड़िया
भेड़िया
$ 

क्या आप बता सकते हैं कि क्या ${a:b:c} करते हैं?
AL

1
@ n.1 यह पदों पर पात्रों लेता bकरने cमें चरa

2
@professorfish बंद - लंबाई की अपनी-स्ट्रिंग cस्थिति पर शुरू b(शून्य आधारित) अलग-अलग से a। प्रतिस्थापन विस्तार बैश पैरामीटर विस्तार में से एक है
डिजिटल ट्रॉमा

2
@DigitalTrauma ओह मैं भूल गया, भले ही मैं इसे अपने बैश

3

पायथन 3, 291 वर्ण

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

from itertools import*
from sys import*
a=argv[1].lower()
r,l=range,len
n=l(a)
print('\n'.join((b for b in(s.strip()for s in open(argv[2]).readlines())if l(b)>n-2and b.lower()in(''.join(compress(a,(i!=j for j in r(n))))for i in r(n))or n==l(b)and sum(1for i in r(n)if a[i]!=b.lower()[i])<2)))

1
उन कार्यों को l=lenऔर r=rangeकम करने के लिए उपयोग कर सकते हैं ।
टाइरवेंटवे

1

स्काला - 403 130

[अद्यतित]: पूरी तरह से अद्यतन क्योंकि पूर्व समाधान भी अनुमति पत्र के लिए अनुमति दी। रेगेक्स या किसी बिलिन टूल्स का उपयोग नहीं करता है।

def f(x:String,d:List[String])={for{y<-d;c=(x zip y filter(t=>t._1!=t._2)length);n=y.length-x.length;if c<2&n==0|c==0&n==1}yield y

Ungolfed:

def f(x:String, d:List[String]) = {
  for {
    y <- d
    c = (x zip y filter (t=>t._1!=t._2) length)  // #letter changes.
    n = y.length-x.length                        // Difference in word length.
    if c<2 & n==0 | c==0 & n==1
  } yield y
}

उपयोग:

f("golf", io.Source.fromFile("/usr/share/dict/words").getLines.toList)

@DigitalTrauma क्या आप मुझे उस मुद्दे के लिए एक उदाहरण दे सकते हैं?
लैंब्रुस्कोअकिडो

मुझे यह मिल गया: मैंने पत्रों के सभी क्रमपरिवर्तन पर भी विचार किया। आह - तो वास्तविकता आसान है। धन्यवाद ...
lambruscoAcido

atechnyएक अक्षर नहीं बदलता। यह समाधान प्रश्न से असंबंधित कुछ करता है।
कोनराड बोरोस्की

+1। ऐसा लगता है कि यह अब बेहतर युक्ति फिट बैठता है ;-)
डिजिटल ट्रॉमा

एक पूर्ण कार्यक्रम अच्छा होगा, न कि केवल कार्य।
बेंत की मार

1

पायथन, 174 वर्ण:

त्वरित और बात तक।

import re;from sys import*;w=argv[1]
print"\n".join(set(sum([re.findall(r"\b%s%s?[^'\n]?%s\b"%(w[:i],w[i],w[i+1:]),open(argv[2]).read(),re.I)for i in range(len(w))],[]))-{w})

उदाहरण:

python similar.py golf /usr/share/dict/words

आउटपुट:

goof
gola
gulf
gold
gol
gowf
goli
Golo
Gulf
goaf
Wolf
Goll
Rolf
wolf
goff
Gold

मुझे लगता है कि OS X शब्द फ़ाइल में बस अधिक प्रविष्टियाँ हैं।


सूची में शब्द ही शामिल नहीं होना चाहिए और यह एपोस्ट्रोफिस को भी नजरअंदाज नहीं करता है: UNIX शब्दकोश के साथ यह भी है golf'
बेंत की मार

प्रेरितों की अनदेखी करने से आपका क्या मतलब है? प्रॉम्प्ट को फिर से पढ़ने के बाद, मैं अभी भी नहीं देख पा रहा हूं कि आपको क्या मिल रहा है।
xleviator

अगर मैं इसमें आपका कोड डिक्शनरी पर चलाऊंगा golf', तो यह प्रिंट हो जाएगा।
बेंत की मार

आह, मैंने संकेत को गलत बताया था, लेकिन अब यह तय हो गया है।
xleviator

0

हास्केल - 219

import System.Environment
import Data.Char
u@(x:a)%w@(y:b)|x==y=a%b|1>0=1+minimum[a%w,u%b,a%b]
x%y=max(length x)$length y
main=do[w,d]<-getArgs;readFile d>>=mapM putStrLn.filter((==1).(%map toLower w).map toLower).words

0

प्रतिबल - 213

set[i d]split system/script/args" "r:[skip i | i skip]repeat n length? i[append r compose[|(poke s: split i 1 n 'skip s)|(head remove at copy i n)]]foreach w read/lines to-file d[if all[w != i parse w r][print w]]


अनगुल्ड (कुछ टिप्पणियों के साथ):

set [i d] split system/script/args " "

; build parse rule
r: [skip i | i skip]       ; RULE - one letter added (prefix and postfix)

; sub-rule for each letter in word
repeat n length? i [
    append r compose [
        | (poke s: split i 1 n 'skip s)     ; RULE - letter changed
        | (head remove at copy i n)         ; RULE - letter removed
    ]
]

foreach w read/lines to-file d [
    if all [w != i parse w r] [print w]
]

उपयोग उदाहरण (OS X शेर पर Rebol 3 में परीक्षण किया गया):

$ rebol similar.reb golf /usr/share/dict/words
goaf
goff
gol
gola
Gold
gold
goli
Goll
Golo
goof
gowf
Gulf
gulf
Rolf
Wolf
wolf

नीचे गोल्फ केparse समान शब्दों से मेल करने के लिए नियम बनाया गया है :

[
    skip "golf"
  | "golf" skip
  | skip "o" "l" "f"
  | "olf"
  | "g" skip "l" "f"
  | "glf"
  | "g" "o" skip "f"
  | "gof"
  | "g" "o" "l" skip
  | "gol"
]

-1

पायथन (103):

f=lambda x:[a for a in open('/usr/share/dict/words')if len(x)==len(a)&sum(b!=c for b,c in zip(a,x))==1]

काफी कुशल, मुझे लगता है। इसके अलावा, मुझे यह पसंद है कि पायथन में यह कितना अच्छा है।


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