মেটা রেজেক্স গল্ফ


29

এই এক্সকেডির চেতনায়

লিঙ্ক বিবরণ এখানে প্রবেশ করুন

এমন একটি প্রোগ্রাম লিখুন যা তালিকার স্বেচ্ছাসেবী জোড় দিয়ে রেগেক্স গল্ফ খেলবে। প্রোগ্রামটির কমপক্ষে রিজেক্সকে সংক্ষিপ্ত করার চেষ্টা করা উচিত, এমন একটি প্রোগ্রাম যা কেবল আউটপুট /^(item1|item2|item3|item4)$/বা অনুরূপ অনুমোদিত নয়।

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


3
/^item1|atem2|item3|item4$/সম্ভবত অনিচ্ছাকৃত অগ্রাধিকার রয়েছে (স্ট্রিংটি দিয়ে শুরু হওয়া item1, ধারণ করা atem2, ধারণ করা item3বা শেষ হওয়া উচিত item4)।
কনরাড বোরোস্কি

7
এটি আরও আকর্ষণীয় চ্যালেঞ্জ হতে পারে যদি এটিতে প্রাথমিকভাবে উত্পন্ন রেইজেক্সগুলির আকারের উপর ভিত্তি করে একটি স্কোরিং সিস্টেম থাকে।
পিটার টেলর

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

4
আমি অবাক হই যে র্যান্ডাল মুনরো যদি আমাদের চেয়ে কোড-গল্ফ চ্যালেঞ্জের জন্য আরও ভাল লেখক হন ...
জোহানেস কুহান

6
আমি ভাবছি র্যান্ডাল মুনরো যদি এই প্রশ্নটি বাতিল করে দিচ্ছেন।
বুথবি

উত্তর:


8

পার্ল (111 110 122 টি অক্ষর)

use Regexp::Assemble;@ARGV=shift;my$r=new Regexp::Assemble;chomp,add$r "^\Q$_\E\$"while<>;$_=as_string$r;s/\(\?:/(/g;print

এটি Regexp::Assembleনিয়মিত এক্সপ্রেশনকে অনুকূলিত করতে সিএনএএন মডিউল ব্যবহার করে। কারণ পার্ল নিয়মিত এক্সপ্রেশনগুলির জন্য ভাল ভাষা কী।

এছাড়াও, পাঠযোগ্য সংস্করণ, কেবল মজাদার জন্য (এর সাহায্যে তৈরি -MO=Deparse)।

use Regexp::Assemble;
my $r = Regexp::Assemble->new;
while (<>) {
    chomp($_);
    $r->add("^\Q$_\E\$");
}
$_ = $r->as_string;
# Replace wasteful (?:, even if it's technically correct.
s/\(\?:/(/g;
print $_;

নমুনা আউটপুট (আমি পরে CTRL-D করেছি item4) did

$ perl assemble.pl
item1
atem2
item3
item4
^(item[134]|atem2)$

এছাড়াও, একটি বোনাস হিসাবে, আমি প্রশ্নের প্রতিটি শব্দের জন্য রেজেক্স লিখছি।

^(a((ttemp)?t|llowed\.|rbitrary)?|\/\^item1\|atem2\|item3\|item4\$\/|s(ho(rt,|uld)|imilar)|p((air|lay)s|rogram)|(Writ|mak|Th)e|l(ists\.|east)|o([fr]|utputs)|t(h(at|e)|o)|(jus|no)t|regex|golf|with|is)$

এছাড়াও, রাষ্ট্রপতিদের তালিকা (262 বাইট)।

^(((J(effer|ack|ohn)s|W(ashingt|ils)|Nix)o|Van Bure|Lincol)n|C(l(eveland|inton)|oolidge|arter)|H(a(r(rison|ding)|yes)|oover)|M(cKinley|adison|onroe)|T(a(ylor|ft)|ruman)|R(oosevelt|eagan)|G(arfield|rant)|Bu(chanan|sh)|P(ierce|olk)|Eisenhower|Kennedy|Adams|Obama)$

এটি একটি তালিকার জন্য স্টিডিন পড়তে এবং অন্যটিকে খালি থাকতে বাধ্য করে। নিশ্চয়ই প্রশ্নটি জিজ্ঞাসা করছে না তাই?
পিটার টেলর

1
@ পিটারটেলর: ঠিক আছে, এটি নয় যে দ্বিতীয় তালিকার কোনও গুরুত্ব নেই। দ্বিতীয় তালিকার প্রথম তালিকার সদৃশ না হওয়া অবধি রেজিপ্স্পটি বৈধ। একটি সংক্ষিপ্ত regexp রাখা ভাল হবে, কিন্তু আমি একরকম অলস।
কনরাড বোরোস্কি

আইএমও-এর আপনার অন্ততপক্ষে এটিকে ইনপুট হিসাবে নেওয়ার কোনও উপায় থাকা উচিত, এমনকি যদি আপনি এটি বাতিল করে দেন।
পিটার টেলর

@ পিটারটেলর: আপনি যদি তাই বলেন। আমার প্রোগ্রামটি এখন দুটি যুক্তি গ্রহণ করে, তাদের মধ্যে প্রথম তালিকা।
কনরাড বোরোস্কি

4
এটি দুর্দান্ত; তবে এটি অকারণে দীর্ঘ প্রকাশ করে যেহেতু এটি প্রতিটি সম্ভাব্য পূর্ণ শব্দের সাথে মিল রেখে বর্জন (অন্য কোনও তালিকার জন্য) তৈরি করে । যা মূল গল্ফের মতো পুরোপুরি একই রকম নয়।
নিকোল

4

না আমার সমাধান (স্পষ্টত পীটার norvig নই!) কিন্তু এখানে (সামান্য পরিবর্তিত) তাকে প্রশ্ন সৌজন্যে একটি সমাধান আছে: http://nbviewer.ipython.org/url/norvig.com/ipython/xkcd1313.ipynb

তিনি যে প্রোগ্রামটি দেন তা নিম্নরূপ (তাঁর কাজ আমার নয়):

def findregex(winners, losers):
    "Find a regex that matches all winners but no losers (sets of strings)."
    # Make a pool of candidate components, then pick from them to cover winners.
    # On each iteration, add the best component to 'cover'; finally disjoin them together.
    pool = candidate_components(winners, losers)
    cover = []
    while winners:
        best = max(pool, key=lambda c: 3*len(matches(c, winners)) - len(c))
        cover.append(best)
        pool.remove(best)
        winners = winners - matches(best, winners)
    return '|'.join(cover)

def candidate_components(winners, losers):
    "Return components, c, that match at least one winner, w, but no loser."
    parts = set(mappend(dotify, mappend(subparts, winners)))
    wholes = {'^'+winner+'$' for winner in winners}
    return wholes | {p for p in parts if not matches(p, losers)}

def mappend(function, *sequences):
    """Map the function over the arguments.  Each result should be a sequence. 
    Append all the results together into one big list."""
    results = map(function, *sequences)
    return [item for result in results for item in result]

def subparts(word):
    "Return a set of subparts of word, consecutive characters up to length 4, plus the whole word."
    return set(word[i:i+n] for i in range(len(word)) for n in (1, 2, 3, 4)) 

def dotify(part):
    "Return all ways to replace a subset of chars in part with '.'."
    if part == '':
        return {''}  
    else:
        return {c+rest for rest in dotify(part[1:]) for c in ('.', part[0]) }

def matches(regex, strings):
    "Return a set of all the strings that are matched by regex."
    return {s for s in strings if re.search(regex, s)}

answer = findregex(winners, losers)
answer
# 'a.a|i..n|j|li|a.t|a..i|bu|oo|n.e|ay.|tr|rc|po|ls|oe|e.a'

যেখানে বিজয়ী এবং হারা হলেন যথাক্রমে বিজয়ী এবং হারা তালিকাগুলি (বা অবশ্যই কোনও 2 টি তালিকা) বিস্তারিত ব্যাখ্যার জন্য নিবন্ধটি দেখুন।


8
লিঙ্কযুক্ত নিবন্ধটি আকর্ষণীয় এবং আমি এটি পড়তে আনন্দিত হয়েছি, তবে এটি উত্থাপিত প্রশ্নের উত্তর দেয় না বলে উত্তর হিসাবে পরিবর্তে প্রশ্নের মন্তব্য হিসাবে আরও ভাল পোস্ট করা উচিত।
গ্যারেথ

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

1
যদি আপনি অন্য কারও কাজের কৃতিত্ব গ্রহণ সম্পর্কে উদ্বিগ্ন হন তবে পতাকাঙ্কিত করুন এবং আপনার উত্তরটিকে "সম্প্রদায় উইকি" তৈরি করার জন্য একটি মোডের জন্য জিজ্ঞাসা করুন।
পিটার টেলর

1
@ পিটারটেলর দুর্দান্ত, আমি জানতাম না যে এটি প্রোটোকল, সম্পন্ন হয়েছিল।
মাইক এইচআর

2

আমার সমাধানটি ফ্যাক্টরে লেখা :

USING:
    formatting fry
    grouping
    kernel
    math math.combinatorics math.ranges
    pcre
    sequences sets ;
IN: xkcd1313

: name-set ( str -- set )
    "\\s" split members ;

: winners ( -- set )
    "washington adams jefferson jefferson madison madison monroe
monroe adams jackson jackson vanburen harrison polk taylor pierce buchanan
lincoln lincoln grant grant hayes garfield cleveland harrison cleveland     mckinley
 mckinley roosevelt taft wilson wilson harding coolidge hoover roosevelt
roosevelt roosevelt roosevelt truman eisenhower eisenhower kennedy johnson     nixon
nixon carter reagan reagan bush clinton clinton bush bush obama obama" name-set ;

: losers ( -- set )
    "clinton jefferson adams pinckney pinckney clinton king adams
jackson adams clay vanburen vanburen clay cass scott fremont breckinridge
mcclellan seymour greeley tilden hancock blaine cleveland harrison bryan bryan
parker bryan roosevelt hughes cox davis smith hoover landon wilkie dewey dewey
stevenson stevenson nixon goldwater humphrey mcgovern ford carter mondale
dukakis bush dole gore kerry mccain romney" name-set winners diff
    { "fremont" } diff "fillmore" suffix ;

: matches ( seq regex -- seq' )
    '[ _ findall empty? not ] filter ;

: mconcat ( seq quot -- set )
    map concat members ; inline

: dotify ( str -- seq )
    { t f } over length selections [ [ CHAR: . rot ? ] "" 2map-as ] with map ;

: subparts ( str -- seq )
    1 4 [a,b] [ clump ] with mconcat ;

: candidate-components ( winners losers -- seq )
    [
        [ [ "^%s$" sprintf ] map ]
        [ [ subparts ] mconcat [ dotify ] mconcat ] bi append
    ] dip swap [ matches empty? ] with filter ;

: find-cover ( winners candidates -- cover )
    swap [ drop { } ] [
        2dup '[ _ over matches length 3 * swap length - ] supremum-by [
            [ dupd matches diff ] [ rot remove ] bi find-cover
        ] keep prefix
    ] if-empty ;

: find-regex ( winners losers -- regex )
    dupd candidate-components find-cover "|" join ;

: verify ( winners losers regex -- ? )
    swap over [
        dupd matches diff "Error: should match but did not: %s\n"
    ] [
        matches "Error: should not match but did: %s\n"
    ] 2bi* [
        dupd '[ ", " join _ printf ] unless-empty empty?
    ] 2bi@ and ;

: print-stats ( legend winners regex -- )
    dup length rot "|" join length over /
    "separating %s: '%s' (%d chars %.1f ratio)\n" printf ;

: (find-both) ( winners losers legend -- )
    -rot 2dup find-regex [ verify t assert= ] 3keep nip print-stats ;

: find-both ( winners losers -- )
    [ "1 from 2" (find-both) ] [ swap "2 from 1" (find-both) ] 2bi ;



IN: scratchpad winners losers find-both 
separating 1 from 2: 'a.a|a..i|j|li|a.t|i..n|bu|oo|ay.|n.e|ma|oe|po|rc|ls|l.v' (55 chars 4.8 ratio)
separating 2 from 1: 'go|e..y|br|cc|hu|do|k.e|.mo|o.d|s..t|ss|ti|oc|bl|pa|ox|av|st|du|om|cla|k..g' (75 chars 3.3 ratio)

এটি নরভিগের মতো একই অ্যালগরিদম। যদি পঠনযোগ্যতাতে আঘাত করা লক্ষ্য হয় তবে আপনি সম্ভবত আরও অনেকগুলি চরিত্র গল্ফ করতে পারেন।


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

1

আমার কোডটি খুব গল্ফ-ইশ এবং ঘনীভূত ফ্যাশনে নেই তবে আপনি https://github.com/amitayd/regexp-golf-coffeescript/ এ (বা বিশেষত src / regexpGolf.c کافی এ অ্যালগরিদম) এ এটি পরীক্ষা করতে পারেন ।

এটি পিটার নরভিগের অ্যালগরিদমের উপর ভিত্তি করে দুটি উন্নতি হয়েছে:

  1. অক্ষর সেটগুলির সাথে ব্যবহারের জন্য অংশগুলি তৈরি করুন (যেমন [অব] জেড, [এসি] জেড, এবং [বিসি] জেড যদি বৈধ অংশগুলি অ্যাজ, বিজেড এবং সিজেড হয়) ব্যবহার করুন।
  2. কভারগুলির "শীর্ষস্থানীয় সর্বোত্তম পথগুলি" তৈরি করার অনুমতি দিন, এবং প্রতিটি পুনরুক্তিতে সেরা প্রার্থীর তৈরি একটি কভার নয়।

(এবং একটি alচ্ছিক এলোমেলোভাবে ছোঁড়ে)

এই কুইজে বিজয়ী / পরাজয়কারীদের সেটগুলির জন্য আমি এটি ব্যবহার করে একটি 76 টি চর রেজেেক্স পেয়েছি:

[Jisn]e..|[dcih]..o|[AaG].a|[sro].i|T[ar]|[PHx]o|V|[oy]e|lev|sh$|u.e|rte|nle

আমার ব্লগের পোস্টে আরও কিছু বিশদ কোফফিস্ট্রিপ্টে সলভার পোর্টিং সম্পর্কে


2
আপনি কি দয়া করে আপনার উত্তরে আপনার কোডটি রাখতে পারবেন? অন্যথায়, লিঙ্কটিতে ক্লিক না করে আমরা কোডটি দেখতে পাচ্ছি না!
wizzwizz4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.