সংক্ষিপ্ততম অনন্য সাবস্ট্রিং


14

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

স্ট্রিংগুলিতে যে কোনও মুদ্রণযোগ্য আসকি অক্ষর থাকতে পারে।

এসটিডিআইএন-এ দেওয়া ইনপুট প্রতিটি লাইনের একটি স্ট্রিং সহ দেওয়া হবে। আপনার অনুরোধে ইনপুটটির শেষে একটি খালি লাইন যুক্ত করা যেতে পারে।

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম বৈধ প্রোগ্রামটি জয়ী।

কিছু পরীক্ষার কেস

ইনপুট:

STRING ONE
STRING TWO

আউটপুট:

E

ইনপুট:

A&&C
A&$C

ভাল আউটপুট:

&&
&C

ইনপুট:

(দুটি এলোমেলোভাবে উত্পন্ন 80-অক্ষরের স্ট্রিং)

QIJYXPYWIWESWBRFWUHEERVQFJROYIXNKPKVDDFFZBUNBRZVUEYKLURBJCZJYMINCZNQEYKRADRYSWMH
HAXUDFLYFSLABUCXUWNHPSGQUXMQUIQYRWVIXGNKJGYUTWMLLPRIZDRLFXWKXOBOOEFESKNCUIFHNLFE

সমস্ত ভাল্ড আউটপুট:

AD
BJ
BR
CZ
DD
EE
ER
EY
EY
FF
FJ
FW
FZ
HE
IJ
IN
IW
JC
JR
JY
KL
KP
KR
KV
LU
MH
MI
NB
NQ
OY
PK
PY
QE
QF
QI
RA
RB
RF
RO
RV
RY
RZ
SW
UE
UH
UN
UR
VD
VQ
VU
WB
WE
WI
WU
XN
XP
YI
YK
YK
YM
YS
YW
YX
ZB
ZJ
ZN
ZV

1
সবচেয়ে কম বা দীর্ঘতম?
লিকি নুন

@ ফ্রাইআম দ্য এজিগম্যান তারপরেও আমার সমাধান পোস্ট করা উচিত ...
লিকি নুন

"প্রতিটি লাইনে একটি স্ট্রিং" উদ্ধৃতি সহ বা ছাড়াই?
লিকি নুন

1
আমরা কি স্ট্রিংগুলির একটি অ্যারে নিতে পারি?
ডেনিস

"বি" "এবিসি" এর একটি স্ট্রিং?
ডাউনরেপ_নেশন

উত্তর:


4

ব্র্যাচল্যাগ , 23 বাইট

:1foh.,{,.[A:B]hs?'~sB}

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

দুর্ভাগ্যক্রমে আমি এখনও নতুন প্রোলোগ ট্রান্সপ্লেলারটিতে অন্তর্নির্মিত সাবসেটটি কোড করে নি।

ব্যাখ্যা

:1f               Find all bindings which satisfy predicate 1 with that binding as input and
                  with the Input of the main predicate as output.
   oh.,           Order that list of bindings, and unify the output with the first one.

{
 ,.[A:B]          Unify the output with the list [A,B]
        hs?       Unify the input with a subset of A
           '~sB   Check that no subset of B can be unified with the input
               }

4

পাইথন, 119 115 91

lambda a,b:[a[m:m+n]for n in range(1,len(a)+1)for m in range(len(a))if a[m:m+n]not in b][0]

পরীক্ষার কেস:

| Input 1  | Input 2     | Output        |
|----------+-------------+---------------|
| 'abcd'   | 'abc'       |  'd'          |
| 'abcd'   | 'dabc'      |  'cd'         |
| 'abcd'   | 'dcbabbccd' |  'abc'        |
| 'abcdf'  | 'abcdebcdf' |  'abcdf'      |
| 'abc'    | 'abc'       |  (IndexError) |

এটি খাটো করে তোলার বিষয়ে কাজ করা, তবে এটি আমার মস্তিষ্কের প্রবৃত্তি। এখনও একটি গল্ফার খুব বেশি না।

অতিরিক্ত বাইটের জন্য @ ব্যবহারকারী 81655 এবং @ ননলাইনারফ্রুটকে ধন্যবাদ।

সম্পাদনা করুন :

Dang। এই কোড চেষ্টা করে:

def z(a,b):
 for s in [a[m:m+n]for n in range(1,len(a)+1)for m in range(len(a)-n+1)]:
  if s not in b:return s
 return''

ভেবেছিলাম এটি কয়েক বাইট সংক্ষিপ্ত ছিল। দেখা যাচ্ছে যে এটি সম্পাদনার আগে আমার চেয়ে 1 বাইট বেশি ছিল longer


আমি খুব অজগর জানি না, তবে আপনি কি (r=range)(1,len(a)+1)তাহলে ব্যবহার করতে পারেন r?
কনর

@ CᴏɴᴏʀO'Bʀɪᴇɴ এটি বেশিরভাগভাবে করতে পারে না। যদি আমি দায়িত্ব অর্পণ rangeকরতে rউপরের লাইনটি, এটা আসলে একটি বাইট যোগ করা হয়েছে। যদিও ভাল ধারণা। সাবস্ট্রিংগুলির মাধ্যমে পুনরাবৃত্তি করার সম্ভবত একটি ছোট্ট উপায় আছে।
টেলর লোপেজ

range(1,len(a))এবং range(len(a)-1)কাজ করা উচিত নয়? এছাড়াও আমি মনে করি দুটি স্পেস ইনডেন্টের জন্য একটি ট্যাব অক্ষর ব্যবহার করা একটি বাইট সংরক্ষণ করতে পারে।
ব্যবহারকারী81655

না, এর সাথে range(1,len(a)), চতুর্থ পরীক্ষার কাস্ট ব্যর্থ হয়েছে কারণ এটি সম্পূর্ণ স্ট্রিং চেষ্টা করে না; এটি কেবল স্ট্রিংয়ের দৈর্ঘ্যে চলে যাবে - ১. এবং এর সাথে range(len(a)-1)প্রথম পরীক্ষার কেস 'cd'কেবলমাত্র পরিবর্তে ফিরে আসতে ব্যর্থ হয় 'd'। যদিও সেখানে কিছু থাকতে পারে।
টেলর লোপেজ

দুঃখিত, আমি পাইথনের সাথে পরিচিত নই এবং আমি ধরে নিয়েছিলাম যে রেঞ্জগুলি অন্তর্ভুক্ত ছিল। সেক্ষেত্রে চেষ্টা করুন range(1,len(a)+1)এবং range(len(a))
ব্যবহারকারী81655

3

পাইথন, 87 86 বাইট

lambda s,t,e=enumerate:[s[i:i-~j]for j,_ in e(s)for i,_ in e(s)if(s[i:i-~j]in t)<1][0]

যদি এটি বিদ্যমান থাকে, তবে এটি সমস্ত সংক্ষিপ্ত অনন্য সাবস্ট্রিংগুলির মধ্যে বামতমটি ফিরিয়ে দেবে।

যদি কোনও অনন্য সাবস্ট্রিং না থাকে তবে একটি সূচিপত্র উত্থাপিত হয়।

আইডিয়নে এটি পরীক্ষা করুন ।


এটা আছে। আমি অপেক্ষা করছিলাম আমার নন-ল্যাম্বদা বাস্তবায়ন কারও জন্য হত্যা করা হবে। দুর্দান্ত এলওএল
টেলর লোপেজ

আমি মনে করি আপনি secondচ্ছিক দ্বিতীয় যুক্তির সরবরাহ করে এই সংক্ষিপ্ত করতে পারেন enumerate শুরু করার জন্য ji+1
ব্যবহারকারী 2357112

দুর্ভাগ্যক্রমে @ ব্যবহারকারী 2357112 এটি একটি নেমরর ফেলেছে । কোডটি jপ্রথমে সংজ্ঞা দেয় , তারপরে i
ডেনিস

@ ডেনিস: হ্যাঁ, তবে এটির দরকার নেই। আপনি লুপ ক্রম পরিবর্তন করতে পারেন।
ব্যবহারকারী 2357112

1
@ ব্যবহারকারী 2357112 যদি আমি লুপ ক্রমটি স্যুইচ করি তবে এটির প্রথম অনন্য স্ট্রাস্টিংটি সংক্ষিপ্ততম নাও হতে পারে। সহজভাবে অদলবদল 'ab'ইনপুট জন্য ফিরে আসে 'abc','aaa'
ডেনিস

2

পাইথন, 82 বাইট

g=lambda u:{u}|g(u[1:])|g(u[:-1])if u else{''}
f=lambda s,t:min(g(s)-g(t),key=len)

ব্যবহার: f('A&&C', 'A&$C')-> রিটার্ন'&&'

যদি উপযুক্ত সাবস্ট্রিং না থাকে তবে মান বাড়িয়ে তোলে।

ব্যাখ্যা:

g=lambda u:{u}|g(u[1:])|g(u[:-1])if u else{''}পুনরাবৃত্তির সাথে সাবস্ট্রিংগুলির একটি সেট তৈরি u f=lambda s,t:min(g(s)-g(t),key=len)করে সেট পার্থক্য থেকে স্বল্পতম সাবস্ট্রিং নেয় ring


2

জাভাস্ক্রিপ্ট (ES6), 79 বাইট

f=
(a,b)=>[...a].some((_,i,c)=>c.some((_,j)=>b.indexOf(s=a.substr(j,i+1))<0))?s:''
<div oninput=o.textContent=f(a.value,b.value)><input id="a"/><input id="b"/><pre id=o>

যদি ফেরত falseগ্রহণযোগ্য হয়, &&sপরিবর্তে ব্যবহার করে 2 বাইট সংরক্ষণ করুন?s:''



1

জাভাস্ক্রিপ্ট (ফায়ারফক্স), 80 বাইট

solution=

a=>b=>[for(_ of(i=0,a))for(_ of(j=!++i,a))if(b.includes(s=a.substr(j++,i)))s][0]

document.write("<pre>"+
[ [ "test", "best" ], [ "wes", "west" ], [ "red", "dress" ] ]
.map(c=>c+": "+solution(c[0])(c[1])).join`\n`)

পরীক্ষা কেবল ফায়ারফক্সে কাজ করে। ফেরত পাঠায় undefinedযদি কোন সাবস্ট্রিং হয়।


স্ট্রিংগুলিতে মুদ্রণযোগ্য এএসসিআইআই অক্ষর যেমন \ বা অন্যান্য রেজিএক্সপ্যাক মেটাচার্যাক্টর থাকতে পারে তবে আপনি যদি ফায়ারফক্সে নিজেকে সীমাবদ্ধ রাখেন তবে b.includesপরিবর্তে ব্যবহার করবেন না কেন ?
নীল

@ নীল প্রশ্নটি বলেনি যে স্ট্রিংগুলির আগে কোনও চরিত্র হতে পারে তবে আমাকে জানানোর জন্য ধন্যবাদ! ব্যবহার আপডেট হয়েছে includes
ব্যবহারকারী81655

1
পরীক্ষার স্নিপেটটি একটি ছুড়ে ফেলেSyntaxError: unexpected token 'for'
নন আইনিহির

@ নন আইইনএইইর ত্রুটিটি আপনি পেয়ে যাবেন যদি আপনি ফায়ারফক্স ব্যবহার না করেন ...
ব্যবহারকারীর ১165৫৫

1

রেটিনা , 37 বাইট

M!&`\G(.+?)(?!.*¶.*\1)
O$#`.+
$.&
G1`

কোনও বৈধ সাবস্ট্রিং পাওয়া না গেলে আউটপুট খালি A

এটি অনলাইন চেষ্টা করুন!(একযোগে কয়েকটি পরীক্ষার কেস চালানোর জন্য সামান্যভাবে সংশোধন করা হয়েছে The ইনপুট ফর্ম্যাটটি আসলে লাইনফিডকে আলাদা করা হয় তবে টেস্ট স্যুটগুলি প্রতি লাইনে একটি পরীক্ষার কেস দিয়ে লিখতে সহজ The পরীক্ষার কাঠামোটি আসল কোডটি শুরুর আগেই স্থানটিকে একটি লাইনেফিডে পরিণত করে))

ব্যাখ্যা

M!&`\G(.+?)(?!.*¶.*\1)

প্রতিটি সম্ভাব্য প্রারম্ভিক অবস্থার জন্য A, সংক্ষিপ্ততম স্ট্রিংয়ের সাথে মিল দিন যা উপস্থিত হয় না B&ম্যাচ, যেমন যে আমরা আসলে যে শুরু অবস্থানে চেষ্টা, এমনকি যদি একটি ম্যাচ একটি অক্ষর চেয়ে দীর্ঘতর হয় ওভারল্যাপিং জন্য। এটি \Gনিশ্চিত করে যে আমরা কোনও অবস্থান এড়িয়ে যাব না - বিশেষত, আমাদের এভাবে লাইনফিডে থামতে হবে, যাতে আমরা Bনিজের থেকে অতিরিক্ত ম্যাচ না পাই । এই বিষয়গুলিতে গোলযোগ না করার কারণটি আসলে খুব সূক্ষ্ম: কারণ যদি এমন কোনও শুরুর অবস্থান থাকে Aযেখানে আমরা কোনও বৈধ সাবস্ট্রিং পাই না, তবে এটিও ব্যর্থতা যা \Gপরবর্তী কোনও অবস্থান পরীক্ষা করা বন্ধ করে দেবে। তবে, যদি (বর্তমান শুরুর অবস্থান থেকে) সমস্ত সাবস্ট্রিং উপস্থিত থাকেBসুতরাং, বর্তমান পজিশনের আরও ডানদিকে শুরু হওয়া সমস্ত সাবস্ট্রিংগুলিও তাই এইগুলি ত্যাগ করা কোনও সমস্যা নয় (এবং আসলে কার্যকারিতা উন্নত করে)।

M!কনফিগারেশনের কারণে , এই সমস্ত ম্যাচই মঞ্চ থেকে ফিরে আসবে, লাইনফিডের সাথে যোগ দিয়ে।

O$#`.+
$.&

এটি দৈর্ঘ্য অনুসারে পূর্ববর্তী ফলাফলের লাইনগুলি সাজায়। এর সাথে লাইনটি মিলিয়েই করা হয় .+। তারপরে $"সাজানো বাই" এর একটি ফর্ম সক্রিয় করে, যাতে ম্যাচটি $.&সাজানোর ক্রম নির্ধারণের জন্য প্রতিস্থাপিত হয় । $.&নিজেই তার দৈর্ঘ্য ম্যাচটি প্রতিস্থাপন করে। পরিশেষে, #বিকল্পটি রেটিনাকে সংখ্যাগতভাবে বাছাই করতে বলেছে (অন্যথায়, এটি ফলাফলকে সংখ্যার স্ট্রিং হিসাবে গণ্য করবে এবং তাদের অভিধান হিসাবে বাছাই করবে)।

G1`

অবশেষে, আমরা খালি রেগেক্স (যা সর্বদা মেলে) এবং একটি সীমা সহ একটি গ্রেপ স্টেজ ব্যবহার করে কেবল কেবল প্রথম লাইন রাখি 1


1

পার্ল, 87 85

sub{(grep{$_[1]!~/\Q$_/}map{$}=$_;map{substr($_[0],$_,$})}@}}(@}=0..length$_[0]))[0]}

এটি একটি বেনাম ফাংশন যা সংক্ষিপ্ত সাবস্ট্রিংগুলির মধ্যে প্রথমটি (অবস্থান অনুসারে) প্রদান করে $_[0]না $_[1], বা undefযদি এরকম কোনও স্ট্রাস্টিং বিদ্যমান না থাকে।

@ IAmMortos এর উত্তর থেকে নেওয়া স্ট্রিং সহ পরীক্ষার প্রোগ্রাম, পার্ল 5.22.1 এর সাথে পরীক্ষিত:

#!/usr/bin/perl -l
use strict;
use warnings;

my $f = <see above>;
print $f->('abcd', 'abc');
print $f->('abcd', 'dabc');
print $f->('abcd', 'dcbabbccd');
print $f->('abcdf', 'abcdebcdf');
print $f->('abc', 'abc');

1

হাস্কেল, 72 বাইট

import Data.Lists
a#b=argmin length[x|x<-powerslice a,not$isInfixOf x b]

ব্যবহারের উদাহরণ: "abcd" # "dabc"-> "cd"

একটি সরল বাস্তবায়ন: সমস্ত সাবস্ট্রিংগুলি তৈরি করুন aএবং যা প্রদর্শিত না হয় সেগুলি রাখুন bargminএকটি তালিকা যা ফাংশন একটি 2nd যুক্তি, এখানে দেওয়া ছোট একটি উপাদান ফেরৎ: length


আমি জানতাম না argmin! এটি অত্যন্ত দরকারী বলে মনে হচ্ছে।
জাগারব

0

ক্রসড আউট 9 এখনও 9
বিড়াল

আমি কিভাবে এটি কাজ করে তা জানতে আগ্রহী।
mroman

@ ম্রোমান দ্য।: একটি আর্গ সঙ্গে সমস্ত সাবস্টার রয়েছে। সুতরাং আমি উভয় স্ট্রিংয়ের উপরে ম্যাপ করছি, তারপরে সেটওয়্যারের চেয়ে আলাদা করুন, তাই আমার কাছে প্রথমটির দ্বিতীয়টির আর্টের সমস্ত সাবস্ট্রার রয়েছে, তারপরে আমি প্রথমটি বেছে নিলাম, যা সবচেয়ে ছোট কিউজ: সাজানো হয়েছে।
মালটিসেন

0

সি #, 152 বাইট

string f(string a,string b){int x=a.Length;for(int i=1;i<=x;i++)for(int j=0;j<=x-i;j++){var y=a.Substring(j,i);if(!b.Contains(y))return y;}return null;}

0

রুবি, 70 বাইট

প্রথম স্ট্রিং থেকে একটি নির্দিষ্ট দৈর্ঘ্যের সমস্ত সাবস্ট্রিংগুলি সংগ্রহ করে এবং যদি দ্বিতীয় স্ট্রিংয়ের মধ্যে নেই এমন একটি থাকে, তবে এটি ফিরিয়ে দিন।

->a,b{r=p;(1..l=a.size).map{|i|(0...l).map{|j|b[s=a[j,i]]?0:r||=s}};r}

0

বার্লেস্ক - 26 বাইট

এই মুহুর্তে আমি সবচেয়ে সংক্ষিপ্ততম উপায়টি নিয়ে আসতে পারি:

lnp^sujbcjz[{^p~[n!}f[-][~

0

জাপট , 14 বাইট

Êõ!ãU c k!èV g

এটি অনলাইন চেষ্টা করুন!

রিটার্নস undefinedআছে যদি কোনো বৈধ সাবস্ট্রিং । এটি "অপরিজ্ঞাত" স্ট্রিংটি ফিরিয়ে দেওয়া থেকে পৃথক , যদিও পার্থক্যটি কেবল-কিউ পতাকার কারণে দৃশ্যমান।

ব্যাখ্যা:

Ê                 :Length of the first input
 õ                :For each number in the range [1...length]:
  !ãU             : Get the substrings of the first input with that length
      c           :Flatten to a single array with shorter substrings first
        k         :Remove ones which return non-zero to:
         !èV      : Number of times that substring appears in second input
             g    :Return the shortest remaining substring

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