সংক্ষিপ্তকরণগুলির সাধারণীকরণ


14

শব্দের তালিকা এবং তাদের সংক্ষিপ্তসারগুলির একটি ইনপুট দেওয়া হয়েছে, সংক্ষেপণগুলি তৈরি করা যেতে পারে এমন প্যাটার্ন আউটপুট করুন।

আসুন এর উদাহরণ ইনপুট নেওয়া যাক

potato ptao
puzzle pzze

একটি উদাহরণ হিসাবে (যে জন্য সংক্ষেপ potatoহয় ptao, এবং সংক্ষেপ puzzleহল pzze)।

প্রাপ্ত সম্ভাব্য সকল উপায়ে বিবেচনা করুন ptaoথেকে potato। একটি সম্ভাব্য উপায় হ'ল প্রথম, তৃতীয়, চতুর্থ এবং ষষ্ঠ অক্ষর নেওয়া, যা আমরা উল্লেখ করব 1346। কিন্তু যেহেতু tএবং oশব্দ একাধিক বার প্রদর্শিত সেখানে উৎপন্ন একাধিক অন্যান্য সম্ভাব্য উপায় আছে ptaoথেকে potato: 1546, 1342, এবং 1542

একইভাবে, মনে রাখবেন যে pzzeথেকে উত্পন্ন করা যেতে পারে puzzleসাথে 1336, 1346, 1436, 1446। এই দুটি সংক্ষিপ্তসারগুলির মধ্যে একমাত্র প্যাটার্নটি হ'ল 1346; অতএব, এই ইনপুট জন্য আউটপুট হতে হবে। যদি একাধিক সম্ভাব্য নিদর্শনগুলি সম্ভব হয় তবে আপনি যে কোনও, কিছু বা সমস্ত (কমপক্ষে একটি) আউটপুট করতে পারেন।

আপনি ধরে নিতে পারেন:

  • ইনপুট শব্দ এবং সংক্ষেপে কেবল ছোট হাতের অক্ষর থাকে।

  • ইনপুটটিতে কমপক্ষে একটি শব্দের / সংক্ষিপ্তসার জুটি রয়েছে।

  • প্রতিটি সংক্ষিপ্তসারটির সাথে সম্পর্কিত শব্দ থেকে এটি গঠন করা সম্ভব।

  • সর্বদা সর্বনিম্ন একটি প্যাটার্ন থাকবে যা প্রতিটি সংক্ষেপে রূপ দেয়।

  • প্রতিটি শব্দের সর্বোচ্চ দৈর্ঘ্য 9 টি অক্ষর।

ইনপুট নিম্নলিখিত যে কোনও হিসাবে নেওয়া যেতে পারে:

  • 2-মাত্রিক অ্যারে / তালিকার / টিপলসগুলির অ্যারে / ইত্যাদি। [[word, abbr], [word, abbr], ...]

  • ফ্ল্যাট 1-মাত্রিক অ্যারে / তালিকা [word, abbr, word, abbr, ...]

  • একক স্ট্রিং, কোনও একক অক্ষর দ্বারা সীমিত যা ছোট হাতের অক্ষর নয় "word abbr word abbr"

  • হ্যাশ / সহযোগী অ্যারে / ইত্যাদি। {word => abbr, word => abbr, ...}

এই ইনপুট বিকল্পগুলির মধ্যে আপনার শব্দের / অ্যাব্রির ক্রমটি অদলবদল করার অনুমতি রয়েছে (দয়া করে আপনার পোস্টে ইনপুট ফর্ম্যাটটি পুরোপুরি বর্ণনা করুন)।

আউটপুট একটি একক সংখ্যা হিসাবে দেওয়া যেতে পারে, একটি অ-অঙ্ক দ্বারা সীমিত একটি স্ট্রিং, বা একটি অ্যারে / তালিকা / tuple / ইত্যাদি। সংখ্যার

যেহেতু এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জিতবে।

পরীক্ষার কেসগুলি (মনে রাখবেন যে একাধিক নিদর্শন কাজ করে তবে আপনার কেবলমাত্র ≥1 ফলাফল আউটপুট করতে হবে):

In                                Out
--------------------------------------------------------
potato ptao puzzle pzze         | 1346
aabbcc abc fddeef def           | 246
prgrmming prgmg puzzles pzzlz   | 14353
aaaaa a bbbb b ccc c dd d e e   | 1
aaaaa a bbbb b ccc c            | 1, 2, 3
abcxyz zbcyax                   | 623514
abcxyz acbbacbcbacbbac          | 132213232132213
potato ptao                     | 1346, 1546, 1342, 1542
a aaaaa                         | 11111

আমি বুঝতে পেরেছি তা নিশ্চিত করার জন্য, সংক্ষেপণ প্রক্রিয়াটি কী অক্ষরগুলি পুনঃক্রম করতে পারে?
xnor

@ এক্সনর সঠিক, যেমন পরীক্ষার বেশ কয়েকটি ক্ষেত্রে দেখা যায়।
ডুরকনব

2 ডি অ্যারেতে কি অন্য দিক রয়েছে? প্রতিটি কলামে, প্রতিটি সারিতে নয়, এক জোড়া শব্দ / সংক্ষেপ থাকবে
লুইস মেন্ডো

পছন্দ করুন
ডোরকনবব

আমরা কি শূন্য-সূচক ব্যবহার করতে পারি, তাই 1346 এর পরিবর্তে 0235 মুদ্রণ করব?
ডেনকার

উত্তর:


3

পাইথ, 19 বাইট

mhh@Fd.TmmxkmbhdedQ

এখানে চেষ্টা করুন!

নিম্নলিখিত বিন্যাসে একটি তালিকা নেয়:

[["word","abbr"],["word","abbr"],...]

বিকল্প 17 বাইট সমাধান যা শূন্য-ভিত্তিক সূচকগুলির তালিকা হিসাবে ফলাফলকে আউটপুট দেয় যা 1-উপাদান তালিকায় আবৃত রয়েছে:

m@Fd.TmmxkmbhdedQ

ব্যাখ্যা

উদাহরণ: [["potato", "ptao"],["puzzle", "pzze"]]

প্রথমে আমরা প্রতিটি চরকে সংক্ষেপে ম্যাপ করি শব্দের মধ্যে সমস্ত উপস্থিতির সূচকগুলির একটি তালিকা যা ফলন করে

[[[0], [2, 4], [3], [1, 5]], [[0], [2, 3], [2, 3], [5]]]

তারপরে আমরা এই তালিকাটি স্থানান্তর করি যা আমাদের দেয়

[[[0], [0]], [[2, 4], [2, 3]], [[3], [2, 3]], [[1, 5], [5]]]

সুতরাং প্রতিটি সংক্ষেপের প্রতিটি চরের সূচকগুলি এক তালিকায় এক সাথে থাকে।

তারপরে আমাদের কেবলমাত্র সেই তালিকাগুলির মধ্যে একটি সাধারণ সূচক খুঁজে পেতে হবে যা ফলন করে:

[[0], [2], [3], [5]]

এটি উপরের আমার বিকল্প 17 বাইট সমাধানের আউটপুট। এটি তখন রূপান্তরিত হয় [1,3,4,6]

কোড ভাঙ্গা

mhh@Fd.TmmxkmbhdedQ # Q = ইনপুট

মি কিউ # মানচিত্রের সাথে ইনপুট
        এম এডি # কে মুলত প্রতিটি সংক্ষিপ্তসার
            এমবিএইচডি # মানচিত্রের শব্দটি চর তালিকাতে
         এমএক্সকে # মানচিত্রে প্রতিটি সংক্ষেপের তালিকা সূচকের একটি তালিকাতে থাকে
      .T # ট্রান্সপোজ
    এফডি # প্রতিটি উপাদান ভাঁজ করুন
   @ # এবং উপস্থিতিতে ফিল্টার করুন
 এইচ এইচ # ফলাফলের প্রথম উপাদানটি নিন এবং এটি বৃদ্ধি করুন

আপনি কি dmঠিক আগে ডিলিট করতে পারবেন না @?
ডোরকনবব

@ ডুরকনব আমি পারি দাগ দেওয়ার জন্য ধন্যবাদ!
ডেনকার

3

এমএটিএল , 29 বাইট

!"@Y:!=2#fX:wX:h]N$v1XQtv4#X>

ইনপুটটি নিম্নলিখিত ফর্ম্যাটে একটি 2D অ্যারে:

{'potato' 'ptao'; 'puzzle' 'pzze'}

এটি অনলাইন চেষ্টা করুন! ( এই উত্তর পোস্ট হওয়ার পরে লিঙ্কযুক্ত কোডটিতে ভাষার পরিবর্তনের কারণে কিছু পরিবর্তন রয়েছে )

!       % take input. Transpose
"       % for each column
  @Y:   %   push column. Unpack the two strings and push them onto the stack
  !     %   transpose second string
  =     %   matrix with all pairwise matchings of characters in word and abbreviation
  2#f   %   find row and col indices of those matchings
  X:    %   transform into column vector
  wX:   %   swap, transform into column vector
  h     %   concat into a two-col matrix
]       % end for
N$v     % concatenate all matrices containing the indices
1       % push 1
XQ      % build matrix adding 1 for each (row,col) index
tv      % concat vertically with itself, so that it has at least two rows.
        % This forces the following function to work on each col.
4#X>    % arg max of each col: position that produces a match in all pairs.
        % If there are several maximizers in each col this gives the first

কোডটির জন্য কিছু জড়িত (এবং লম্বা!) কৌশলগুলি প্রয়োজন

  • ইনপুট আকারের উপর নির্ভর করে find( f) দ্বারা উত্পাদিত ভেক্টরগুলির অরিয়েন্টেশনকে আটকাবেন । এগুলি বিবৃতি X:wX:: উভয় আউটপুটকে কলাম ভেক্টর হতে বাধ্য করুন।
  • min( X>) ফাংশনের ডিফল্ট আচরণের "প্রথম অ-সিঙ্গলটন মাত্রা সহ কাজ করুন" প্রতিরোধ করুন । এগুলি বিবৃতিগুলি tv: কমপক্ষে দুটি সারি নিশ্চিত করার জন্য নিজের অনুলিপি তৈরি করুন);

2

পার্ল, 46 45 42 বাইট

এর জন্য +1 অন্তর্ভুক্ত -p

STDIN- তে অনুক্রমিক শব্দ হিসাবে ইনপুট দিন

perl -p abbrev.pl
prgrmming
prgmg
puzzles
pzzlz

সঙ্গে stdin বিনষ্ট ^Dবা ^Zবা যাই হোক না কেন আপনার সিস্টেমে প্রয়োজন হয়

abbrev.pl:

s#.#${${--$_.$.%2}.=$&}||=-$_#eg;$_ x=eof

ব্যাখ্যা

এই ইনপুটটি বিবেচনা করুন (ধারণাগত বিন্যাস, এই প্রোগ্রামটির জন্য ইনপুট দেওয়ার আসল উপায় নয়):

potatoes     ptao
puzzle       pzze

প্রোগ্রামটি বিল্ড স্ট্রিংগুলি কলাম আইডিতে সূচিত পূর্ণ স্ট্রিংয়ের উল্লম্ব কলামগুলিকে উপস্থাপন করে

id1    pp     -> 1
id2    ou     -> 2
id3    tz     -> 3
id4    az     -> 4
...

ইত্যাদি এটি সংক্ষিপ্তসারগুলির জন্যও একই কাজ করে তবে ভিন্ন আইডি ব্যবহার করে

ID1    pp     -> 1
ID2    tz     -> 3
ID3    az     -> 4
ID4    oe     -> 6

শব্দগুলি শব্দ ব্যবহার করে -pবিকল্প একের পর এক প্রক্রিয়া করা হয় । প্রতিটি শব্দ ব্যবহার করে চলার সময় কলামগুলির স্ট্রিংগুলি পুনরাবৃত্তি যুক্ত করে ব্যবহার করে তৈরি করা হয় s#.# ...code.. #eg, সুতরাং প্রতিটি কলামে পুনরাবৃত্তিযোগ্য আইডি প্রয়োজন। আমি কলাম নম্বরটি লাইন নম্বর মডিউল 2 এর পরে মাইনাসটি ব্যবহার করি --$_যা কলাম নম্বরটি ব্যবহার করে তৈরি করা যেতে পারে যা বর্তমান শব্দ হিসাবে শুরু হয় যা কেবলমাত্র ব্যবহারের কারণে a-zএকটি সংখ্যার প্রসঙ্গে 0 হিসাবে মূল্যায়নের গ্যারান্টিযুক্ত। তাই আমি পেয়েছি -1, -2, -3, ...। আমি সত্যিই ব্যবহার করতে চাই1, 2, 3, ... ব্যবহার $_++করতে , তবে ব্যবহার করার ফলে একটি সাধারণ সংখ্যার কাউন্টারের পরিবর্তে পার্ল ম্যাজিক স্ট্রিং ইনক্রিমেন্টটি ট্রিগার হয়ে যায়। আমি করি ব্যবহার চাই না$_ এবং না কিছু অন্যান্য পরিবর্তনশীল কারণ অন্য যে কোনও ভেরিয়েবল আমাকে প্রতি লুপে শূন্যে শুরু করতে হবে যা অনেকগুলি বাইট নেয়।

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

কলামের স্ট্রিংগুলি তৈরি করতে আমি কোনও কঠোর রেফারেন্সের মাধ্যমে পার্ল গ্লোবাল নেম স্পেসটি আপত্তি করি:

${--$_.$.%2}.=$&

এরপরে আমি প্রতিটি কলামের স্ট্রিংটিকে প্রথম কলাম নম্বরটিতে ম্যাপ করি যা স্ট্রিংটি উপস্থিত হয় (উপরে উল্লিখিত ম্যাপিংটি ইতিমধ্যে উল্লিখিত) পার্ল গ্লোবাল নেমস্পেসটি ব্যবহার করে (তবে লক্ষ্য করুন যে নামগুলি সংঘটিত হতে পারে না তাই গ্লোবালগুলি একে অপরের সাথে হস্তক্ষেপ না করে):

${${--$_.$.%2}.=$&} ||= -$_

আমাকে উপেক্ষা করতে হবে $_কারণ আমি উপরে বর্ণিত মত আমি কলামগুলি গণনা করি -1, -2, -3, ...||=নিশ্চিত করুন শুধুমাত্র একটি প্রদত্ত কলামের প্রথম আবির্ভাব একটি নতুন কলাম নম্বর পায়, অন্যথায় পূর্ববর্তী কলাম নম্বর সংরক্ষিত আছে এবং মান হিসাবে ফিরে আসেন। এটি প্রতিটি সংক্ষিপ্ত শব্দের জন্য বিশেষত ঘটবে কারণ স্পেসিফিকেশন গ্যারান্টি দেয় যে পুরো শব্দের একটি কলাম রয়েছে যা আগে উপস্থিত হয়েছিল। সুতরাং খুব শেষ সংক্ষিপ্ত শব্দের প্রতিটি অক্ষর পূর্ণ সংক্ষিপ্ত শব্দের জন্য কলামের সাথে মিলিত পূর্ণ শব্দের কলাম নম্বর দ্বারা প্রতিস্থাপিত হবে। সুতরাং খুব শেষ প্রতিস্থাপনের ফলাফল চূড়ান্ত ফলাফল যা চেয়েছিল। সুতরাং ইনপুটটির শেষে থাকলে এবং কেবল যদি মুদ্রণ করুন:

$_ x=eof

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


1

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

import Data.List
foldl1 intersect.map(\(w,a)->mapM(`elemIndices`(' ':w))a)

ইনপুট ফর্ম্যাট হল জোড়গুলির স্ট্রিংগুলির একটি তালিকা, যেমন:

*Main > foldl1 intersect.map(\(w,a)->mapM(`elemIndices`(' ':w))a)  $ [("potato","ptao"),("puzzle","pzze")]
[[1,3,4,6]]

এটি কীভাবে কাজ করে: mapM(একইভাবে sequence . map) প্রথমে প্রতিটি জুটিকে (w,a)সংক্ষেপে অক্ষরের সূচকের তালিকার তালিকায় পরিণত করে ( ' ':হাস্কেলের স্থানীয় 0-ভিত্তিক সূচক 1-ভিত্তিক স্থির করে), ("potato", "ptao") -> [[1],[3,5],[4],[2,6]]এবং তারপরে যেখানে তার সমস্ত সংমিশ্রনের তালিকায় পরিণত হয় অবস্থানের উপাদানটি তম সাবলিস্ট iথেকে অঙ্কিত হয় i, যেমন [[1,3,4,2],[1,3,4,6],[1,5,4,2],[1,5,4,6]]foldl1 intersectএই জাতীয় সমস্ত তালিকার ছেদ খুঁজে পেয়েছে।


0

ES6, 92 বাইট

(w,a)=>[...a[0]].map((_,i)=>[...w[0]].reduce((r,_,j)=>w.some((s,k)=>s[j]!=a[k][i])?r:++j,0))

শব্দের একটি অ্যারে এবং সংক্ষেপের অ্যারে হিসাবে ইনপুট গ্রহণ করে। 1-ভিত্তিক সূচকগুলির একটি অ্যারে প্রদান করে (যার জন্য আমার 2 বাইট দামের দাম হয়)। একাধিক সমাধানের ক্ষেত্রে, সর্বোচ্চ সূচকগুলি ফিরে আসে are


0

পাইথন 3, 210 বাইট

এখানে টপসকোর্সগুলি দেখে একটি চিত্তাকর্ষক উত্তর নয়, তবে এটি সত্যই আমি পাইথনের সাথে কিছুটা ক্রেজিস্ট তালিকা বোধগম্য করেছি। পন্থাটি বেশ সোজা is

 def r(p):
    z=[[[1+t[0]for t in i[0]if l==t[1]]for l in i[1]]for i in[[list(enumerate(w[0])),w[1]]for w in p]]
    return[list(set.intersection(set(e),*[set(i[z[0].index(e)])for i in z[1:]]))[0]for e in z[0]]

ফাংশনটি ইনপুটটিকে সর্বদা 2-D অ্যারের মতো স্ট্রিং হিসাবে প্রত্যাশা করে: [[word, abbr],...]এবং পূর্ণসংখ্যার একটি তালিকা প্রদান করে।

PS: শীঘ্রই একটি বিশদ ব্যাখ্যা আসছে

PS2: আরও গল্ফিং পরামর্শ স্বাগত জানানো হয়!

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