একটি চিঠি অদলবদল


18

ওয়েবে সবচেয়ে বড় ফোরাম, जिसे পোস্টকઉન્ટ ++ বলা হয় একটি নতুন ফোরাম গেম তৈরি করার সিদ্ধান্ত নিয়েছে। এই গেমটিতে লক্ষ্যটি পোস্ট করা, তবে শব্দটির একটি অক্ষর যুক্ত করতে, অপসারণ করতে বা পরিবর্তন করতে হবে। আপনার বস আপনার চেয়েছিলেন যে আপনি এমন একটি প্রোগ্রাম লিখবেন যা শব্দটি পেয়েছে এবং ইউনিক্স অভিধান, যেমন আপনি এমন কোম্পানির হয়ে কাজ করেন যার সাথে আরও বুদ্ধিমান ফোরাম গেম রয়েছে এবং প্রতিযোগিতাটি ধ্বংস করতে চায় (আরে, এটি আপনার বস, না তার সাথে আলোচনা করুন, আপনি যাই হোক না কেন আপনার কাজ থেকে প্রচুর নগদ পান)।

আপনার প্রোগ্রামটি দুটি যুক্তি, শব্দ এবং অভিধান পাবে। যেহেতু ব্যবহারকারী প্রোগ্রামটি পরিচালনা করছেন (হ্যাঁ, একজন ব্যবহারকারী, আপনার সংস্থার কাছে বট চালানোর কোনও সংস্থান নেই) নিখুঁত নয়, আপনার উভয় ক্ষেত্রেই কেসকে স্বাভাবিক করা উচিত। অভিধানের শব্দগুলির মধ্যে ASCII অক্ষর থাকতে পারে (উভয় ক্ষেত্রে বড় হাতের এবং ছোট হাতের অক্ষর থাকে তবে তুলনার সময় এটি উপেক্ষা করা উচিত), ড্যাশস, অ্যাস্টোস্ট্রোফস এবং মাঝখানে ক্রমাগত ফাঁকা স্থান নেই। এগুলি 78 78 টির বেশি অক্ষরের বেশি হবে না। গেমটিতে গ্রহণযোগ্য শব্দের তালিকা তৈরি করতে হবে, ম্যানুয়ালি শব্দের কথা চিন্তা করে এমন লোকদের মজা ভাঙার জন্য।

এটি আপনার প্রত্যাশিত প্রোগ্রামের উদাহরণ, এর অনুরূপ শব্দের জন্য পরীক্ষা করা golf

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

/usr/share/dict/wordsপ্রতিটি পর লাইন বিরতি দিয়ে শব্দের একটি তালিকা করা হয়। উদাহরণস্বরূপ আপনি fgets () সহ এটি সহজেই পড়তে পারেন।

আপনি যে সংস্থায় কাজ করেন তার কাছে খুব বেশি কার্ড কার্ড নেই (হ্যাঁ, এটি 2014, এবং তারা এখনও পাঞ্চ কার্ড ব্যবহার করে), তাই তাদের অপচয় করবেন না। যতটা সম্ভব সংক্ষিপ্ত প্রোগ্রাম লিখুন। ওহ, এবং আপনাকে লেভেনস্টাইন দূরত্ব বা অনুরূপ কোনও অ্যালগরিদম অন্তর্নির্মিত বা বাহ্যিক বাস্তবায়ন না ব্যবহার করতে বলা হয়েছিল। উদ্ভাবিত নয় এমন কিছু এখানে বা পিছনের দিকে যা স্পষ্টত বিক্রেতার ভাষায় sertedোকানো (আপনার কাছে সেগুলির প্রমাণ নেই, তবে আপনার সাহেবের সাথে আলোচনা করবেন না)। সুতরাং আপনি যদি দূরত্ব চান, আপনার নিজেরাই এটি প্রয়োগ করতে হবে।

আপনি যে কোনও ভাষা ব্যবহারে নির্দ্বিধায় এমনকি পাঞ্চ কার্ড সহ, সংস্থার বেশিরভাগ আধুনিক প্রোগ্রামিং ভাষা যেমন কোবল রুবি বা হাস্কেল বা আপনি যা চান তার অ্যাক্সেস রয়েছে । তাদের কাছে এমনকি গলফস্ক্রিপ্ট রয়েছে, যদি আপনি মনে করেন এটি স্ট্রিং ম্যানিপুলেশন জন্য ভাল (আমি জানি না, সম্ভবত ...)।

বিজয়ী আমার কাছ থেকে 15 খ্যাতি পয়েন্ট এবং সম্ভবত সম্প্রদায় থেকে প্রচুর অন্যান্য পয়েন্ট পায়। অন্যান্য ভাল উত্তরগুলি 10 পয়েন্ট এবং সম্প্রদায় থেকেও পয়েন্ট পাবে। আপনি শুনেছেন যে পয়েন্টগুলি মূল্যহীন, তবে সম্ভবত তারা 2050 সালে ডলারগুলি প্রতিস্থাপন করবে That এটি অবশ্য নিশ্চিত হয়নি, তবে যাইহোক পয়েন্টগুলি পাওয়া ভাল ধারণা।


6
আমাদের "লেভেনস্টাইন দূরত্ব বা এই জাতীয় কোনও অ্যালগরিদম অন্তর্নির্মিত বা বাহ্যিক প্রয়োগগুলি ব্যবহার করা উচিত নয়? 30 অক্ষরের গাণিতিক সমাধান রয়েছে।
মাইকেল স্টারন

@ মিশেলস্টারন এবং একইভাবে একটি সংক্ষিপ্ত অজগর একটিকে এই রেজেক্স লাইব্রেরির अस्पष्ट মিলটি
মার্টিন এন্ডার

2
হিসাবে প্রায় একই codegolf.stackexchange.com/questions/6939/...
হাওয়ার্ড

"যেমন রুবি বা হাস্কেল" - ঠিক আছে, আমি পেয়েছি, আপনি আমাকে অংশগ্রহণ করতে চান।
জন ডিভোরাক

দয়া করে একটি আরও ভাল উদাহরণ সরবরাহ করুন, যাতে সমস্ত ধরণের পরিবর্তন উপস্থিত হয় বা লোকেরা ভুল অ্যালগরিদম জমা দিতে থাকে।
ফিটফাট

উত্তর:


4

গল্ফস্ক্রিপ্ট, 59 টি অক্ষর

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

অবশ্যই, গল্ফস্ক্রিপ্ট স্ট্রিং ম্যানিপুলেশন জন্য দুর্দান্ত !

গল্ফস্ক্রিপ্টটি এতটা ভাল না যে ফাইল I / O বা কমান্ড-লাইন আর্গুমেন্ট পরিচালনা করা। সুতরাং, এই প্রোগ্রামটি স্টিডিনের মাধ্যমে তার সমস্ত ইনপুট প্রাপ্তির প্রত্যাশা করে: প্রথম নন-ফাঁকা লাইনটি লক্ষ্য শব্দ হিসাবে নেওয়া হয়, যখন বাকী রেখাগুলিতে অভিধান থাকতে পারে। ইউনিক্সিশ সিস্টেমে আপনি এই কোডটি চালাতে পারেন যেমন:

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

আমার উবুন্টু লিনাক্স বাক্সে উপরের কমান্ডটির ফলাফল:

goff
wolf
gold
golfs
goof
gulf

নোট করুন যে সমস্ত শব্দ ছোট হাতের অক্ষরে রূপান্তরিত হয়েছে এবং কোনও সদৃশকে মুছে ফেলা হয়েছে; সুতরাং, আপনার নমুনা আউটপুট Wolfথেকে wolfপৃথক , খনি তালিকাভুক্ত এবং পৃথকভাবে না। আপনার চ্যালেঞ্জের বর্ণনার ভিত্তিতে, আমি ধরে নিই এটি গ্রহণযোগ্য।

এছাড়াও কোডটি সত্যই ধীর, কারণ এটি মোটামুটি ব্রুটি ফোর্স পদ্ধতির ব্যবহার করে এবং পরীক্ষার্থীর শব্দের দৈর্ঘ্য লক্ষ্য শব্দটির সাথে মিল রয়েছে কিনা তা যাচাই করার মতো সুস্পষ্ট অপ্টিমাইজেশন ব্যবহার করে না Still তবুও, এটি যেতে পরিচালনা করে না সম্পূর্ণ, অপরিবর্তিত /usr/share/dict/wordsতালিকার মাধ্যমে ... হুম ... আমি শেষ করব কখন আপনাকে জানাবো, ঠিক আছে?

সম্পাদনা: ঠিক আছে, এটি প্রায় 25 মিনিট সময় নিয়েছে, তবে এটি শেষ হয়েছে।


স্ট্রিং ম্যানিপুলেশন (এবং গল্ফস্ক্রিপ্টে স্ট্রিং ম্যানিপুলেশন করা) এর সঠিক উপস্থাপনের জন্য +1
প্লাজমাপাওয়ার

6

বাশ + কোর্টিলস, 99 বাইট

হয় আমি পুরোপুরি প্রশ্নটি ভুল বুঝেছি ( @ ল্যাম্ব্রস্কো অ্যাসিডোর উত্তরটি খুব আলাদা ফলাফল দেয় ), অথবা এটি মোটামুটি সোজা রিজেক্সপ অ্যাপ্লিকেশন:

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

আউটপুট:

/ ./simarr.sh গল্ফ / usr / ভাগ / ডিক / শব্দ
গফের
স্বর্ণ
গলফ
golfs
বোকা লোক
উপসাগর
নেকড়ে
নেকড়ে
$ 

আপনি কি দয়া করে ব্যাখ্যা করতে ${a:b:c} পারেন?
আওয়ামী লীগের

1
@ n.1 এটা অবস্থানের সময়ে অক্ষর লাগে bকরার cমধ্যে পরিবর্তনশীলa

2
@ প্রফেসরফিশ ক্লোজ - এর দৈর্ঘ্যের স্তরটি পরিবর্তনশীল থেকে cঅবস্থান b(শূন্য-ভিত্তিক) থেকে শুরু হয় a। সাবস্ট্রিং সম্প্রসারণ বাশ প্যারামিটার সম্প্রসারণগুলির মধ্যে একটি
ডিজিটাল ট্রমা

2
@

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)

@ ডিজিটালট্রামুমা আপনি কি আমাকে এই সমস্যার জন্য একটি উদাহরণ দিতে পারেন?
ল্যাম্ব্রস্কো এসিডো

আমি এটি পেয়েছি: আমি চিঠিগুলির সমস্ত অনুমতি বিবেচনা করেছি। দীর্ঘশ্বাস ফেলুন - তাই বাস্তবতা আরও সহজ। ধন্যবাদ ...
ল্যাম্ব্রস্কো এসিডো

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

আমি মনে করি ওএস এক্স ওয়ার্ড ফাইলটিতে আরও বেশি এন্ট্রি রয়েছে।


তালিকায় শব্দটি নিজেই অন্তর্ভুক্ত করা উচিত নয় এবং এটি অ্যাডোস্ট্রোফগুলিও উপেক্ষা করে না: ইউনিক্স অভিধানের সাথে এটিও রয়েছে 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]
]

ব্যবহারের উদাহরণ (ওএস এক্স সিংহের রেবোল 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]

বেশ দক্ষ, আমি মনে করি। এছাড়াও, আমি পাই পাই যে এটি কতটা ভালভাবে পাইথনে ছড়িয়ে পড়ে।


আপনি কোনও চরিত্র অপসারণ বা যুক্ত করার জন্য অ্যাকাউন্ট করবেন না।
ফিটফাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.