আমার প্রত্যয় কি ধরণের?


10

ইন্ট্রো

সুতরাং আমি আমার সময় নষ্ট করে চলেছি প্রত্যয়টি বাছাই করে অ্যালগরিদমগুলি ছড়িয়ে দিয়ে, নতুন আইডিয়াগুলি হাত দিয়ে এবং কোডে মূল্যায়ন করে। তবে আমার প্রত্যয়ের ধরণটি স্মরণ করতে আমি সর্বদা সংগ্রাম করি! আমার প্রত্যয়টি কোন প্রকারের তা বলতে পারেন?

বাম-সবচেয়ে কি?

অনেকগুলি প্রত্যয় বাছাই করা অ্যালগরিদমগুলি (SAIS, KA, আমার নিজের daware) গোষ্ঠী প্রত্যয়গুলি বিভিন্ন ধরণের অনুসারে বাছাই করে types দুটি প্রাথমিক ধরণ রয়েছে: এস-টাইপ এবং এল-টাইপের প্রত্যয়। এস-টাইপের প্রত্যয়গুলি প্রত্যয় যা নিম্নোক্ত প্রত্যয়গুলির তুলনায় শব্দকোষগতভাবে কম ( এস ম্যালার) এবং যদি লিক্সোগ্রাফিকভাবে বৃহত্তর ( এল আরজার) হয় তবে এল-টাইপ হয় । একটি বাম-সর্বাধিক এস-টাইপ ( এলএমএস-প্রকার ) ঠিক এটি: একটি এস-টাইপ প্রত্যয় যা এল-টাইপের প্রত্যয় দ্বারা এগিয়ে থাকে।

এই এলএমএস-ধরণের প্রত্যয়গুলির বিশেষ জিনিসটি হ'ল একবার সেগুলি বাছাই করার পরে আমরা অন্যান্য সমস্ত প্রত্যয়কে রৈখিক সময়ে বাছাই করতে পারি! কি দুর্দান্ত?

চ্যালেঞ্জ

একটি স্ট্রিং দেওয়া হল ধরে নিন এটি একটি বিশেষ অক্ষর দ্বারা সমাপ্ত করা হয়েছে যা সেই স্ট্রিংয়ের অন্য কোনও চরিত্রের চেয়ে কম (যেমন নাল বাইটের চেয়ে ছোট)। প্রতিটি প্রত্যয়ের জন্য একটি প্রকারের কর্সস্পন্ডিং চর আউটপুট করুন।

আপনি অবাধে যা গৃহস্থালির কাজ কোন ধরনের জন্য ব্যবহার করা চয়ন করতে পারেন কিন্তু আমি পছন্দ L, S and *জন্য L-, S- and LMS-typeযতদিন তারা সব মুদ্রণযোগ্য ( 0x20 - 0x7E)।

উদাহরণ

স্ট্রিং mmiissiissiippiআউটপুট দেওয়া হয়েছে (ব্যবহার করার সময় L, S and *):

 LL*SLL*SLL*SLLL

উদাহরণস্বরূপ, প্রথমটি অভিধানের চেয়ে বৃহত্তর (এই সংক্ষিপ্ততর চরিত্রের প্রতিনিধিত্ব করে) এর Lকারণে ঘটে :mmiissiissiippi$miissiissiippi$$

L - mmiissiissiippi$ > miissiissiippi$
L - miissiissiippi$  > iissiissiippi$
* - iissiissiippi$   < issiissiippi     and preceeded by L
S - issiissiippi$    < ssiissiippi$
L - ssiissiippi$     > siissiippi$
L - siissiippi$      > iissiippi$
* - iissiippi$       < issiippi$        and preceeded by L
S - issiippi$        < ssiippi$
L - ssiippi$         > siippi$
L - siippi$          > iippi$
* - iippi$           < ippi$            and preceeded by L
S - ippi$            < ppi$
L - ppi$             > pi$
L - pi$              > i$
L - i$               > $

আরও কয়েকটি উদাহরণ:

"hello world" -> "L*SSL*L*LLL"
"Hello World" -> "SSSSL*SSLLL"
"53Ab§%5qS"   -> "L*SSL*SLL"

লক্ষ্য

আমি এখানে পিটার কর্ডেসকে বিরক্ত করার জন্য আসছি না (স্ট্যাকওভারফ্লোতে আমি একসময় এটি করতে যাচ্ছি); আমি কেবল খুব অলস তাই এটি অবশ্যই ! বাইটস মধ্যে সংক্ষিপ্ত উত্তর।


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

সম্পাদনা 2: মতামত আউটপুট বর্ণিত মত প্রতিটি ইনপুট অক্ষরের একক অক্ষর হওয়া উচিত। আমি যখন ধরে নিয়েছিলাম যে এটি "স্ট্রিং রিটার্ন" হিসাবে বোঝা যাবে তবে মনে হয় কমপক্ষে 1 টি উত্তর একক অক্ষরের একটি তালিকা দেয়। বিদ্যমান উত্তরগুলিকে অকার্যকর না করার জন্য আমি আপনাকে একক অক্ষরের একটি তালিকা (বা পূর্ণসংখ্যার মুদ্রণের ফলে কেবল 1 টি লেখার ফলস্বরূপ) প্রদান করতে দেব।


রৈখিক সময়ের জন্য টিপস:

  1. এটি 2 সমান্তরাল ফরোয়ার্ড পুনরাবৃত্তিতে বা একক পিছনের পুনরাবৃত্তিতে করা যেতে পারে।
  2. প্রতিটি প্রত্যয়টির অবস্থা কেবল প্রথম 2 টি অক্ষর এবং দ্বিতীয়টির ধরণের উপর নির্ভর করে।
  3. বিপরীত দিকের ইনপুটটি স্ক্যান করে আপনি এই জাতীয় এল বা এস নির্ধারণ করতে পারেন: $t=$c<=>$d?:$t(পিএইচপি 7), যেখানে পূর্ববর্তী এবং পূর্ববর্তী টাইপের $cবর্তমান চরটি ।$d$t
  4. আমার পিএইচপি উত্তর দেখুন । আগামীকাল আমি অনুদান প্রদান করব।

এটি আমার প্রথম প্রশ্ন :) স্যান্ডবক্সটি দুটি আপভোট পেয়েছে এবং কোনও মন্তব্য নেই তাই আমি মনে করি এটি পোস্ট হওয়ার জন্য প্রস্তুত। নির্দ্বিধায় পরামর্শ দিন!
ক্রিস্টোফ

ইনপুটটিতে কোন অক্ষর উপস্থিত হতে পারে?
মার্টিন ইন্ডার

@ মার্টিনইন্ডার সমস্ত অক্ষরে আপনার স্ট্রিং সমর্থন করে যেমন c++স্টাইলের স্ট্রিংয়ের জন্য এমনকি নাল বাইট । এটি বাইনারি ডেটা হিসাবে ভাবেন।
ক্রিস্টোফ

কী *মানে?
ফাঁস নুন

@ লিকিউন *মানে সংশ্লিষ্ট প্রত্যয়টি টাইপযুক্ত left most s-typeA S-type suffix that is preceeded by a L-type suffix.
ক্রিস্টোফ

উত্তর:


7

হাস্কেল , 64 53 48 42 বাইট

(0!)
k!(x:y)|x:y>y=1:2!y|2>1=k:0!y
_![]=[]

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

Ungolfed সঙ্গে Charপরিবর্তে Int:

suffixes :: String -> String
suffixes = go 'S'
 where
   go :: Char -> String -> String
   go _ "" = ""
   go lorstar s | s > tail s = 'L' : go '*' (tail s)
                | otherwise  = lorstar : go 'S' (tail s)

বেনামে ফাংশন অনুমোদিত, তাই z=অপসারণ করা যেতে পারে।
janrjan জোহানসেন

আমি শুধু হাস্কেল পড়তে পারি না আপনি কি আমাকে একটি সংক্ষিপ্ত ব্যাখ্যা দিতে আপত্তি করবেন?
ক্রিস্টোফ

1
@ ক্রিসটফ: ফাংশনটিতে goদুটি যুক্তি লাগে takes প্রথমটি এমন চরিত্র যা প্রতিনিধিত্ব করে যা Sপরিস্থিতি বর্ণনা করতে ব্যবহার করা উচিত । দ্বিতীয়টি একটি স্ট্রিং। এটি প্রতিটি স্টেপে প্রথম অক্ষরটিকে অপসারণ করে পুনরাবৃত্তিমূলকভাবে স্ট্রিংয়ের মধ্য দিয়ে যায় (এটিই tailঘটে)। কৌশলটি হ'ল প্রথম যুক্তিটি সেট করা হয় *যখন পূর্ববর্তী ফলাফলটি ছিল অন্যথায় Lবা Sঅন্যথায়। এইভাবে, যে ক্ষেত্রে যেখানে একটি *বা একটি Sব্যবহার করা উচিত, সেই প্রথম যুক্তিটি সরাসরি ব্যবহার করা যেতে পারে। আশা করি তা বোধগম্য হয়।
বার্তাভেল

এটি বেশ সুন্দর ধারণা! আমি আরও চতুর ধারণাগুলি দেখার আশা করছি :)
ক্রিস্টোফ

@ আরজান জোহানসেন টিআইও-তে ফলাফল কীভাবে প্রস্তুত করবেন?
বার্তাভেল

6

জেলি ,  25 23 21 20  19 বাইট

Ṛ;\UỤỤIṠµI2n×ịØDṚ;0

একটি সম্পূর্ণ প্রোগ্রাম যা অক্ষরগুলির তালিকাটি মুদ্রণ করে:

L: 0
S: 8
*: 9

(একটি লিঙ্ক হিসাবে এটি একটি তালিকা দেয় যেখানে সমস্ত আইটেম শেষের ব্যতীত অক্ষর, যা শূন্য।)

এটি অনলাইন চেষ্টা করুন! অথবা পরীক্ষা স্যুট (রূপান্তর সহLS*) দেখুন।

কিভাবে?

Ṛ;\UỤỤIṠµI2n×ịØDṚ;0 - Link: list of characters, s  e.g. "cast"
Ṛ                   - reverse                           "tsac"
  \                 - cumulative reduce by:
 ;                  -   concatenation                   ["t","ts","tsa","tsac"]
   U                - upend (reverse each)              ["t","st","ast","cast"] (suffixes)
    Ụ               - sort indexes by value             [3,4,2,1] (lexicographical order)
     Ụ              - sort indexes by value             [4,3,1,2] (order of that)
      I             - incremental differences           [-1,-2,1] (change)
       Ṡ            - sign                              [-1,-1,1] (comparisons)
        µ           - monadic chain separation, call that x
         I          - incremental differences           [0,2] (only (-1,1) produce 2s)
          2         - literal 2                         2
           n        - not equal?                        [1,0] (indexes of * will be 0)
            ×       - multiply by x (vectorises)        [-1,0,1] (make indexes of *s 0)
              ØD    - decimal yield                     "0123456789"
             ị      - index into (1-indexed & modular)  ['8','9','0']
                Ṛ   - reverse                           ['0','9','8']
                 ;0 - concatenate a zero                ['0','9','8',0]
                    - implicit print                     0980
                    -                              i.e. "L*SL"

আপনি আমার জন্য একটি ছোট ব্যাখ্যা যোগ করতে আপত্তি করবেন?
ক্রিস্টোফ

2
আমি অবশ্যই করব - আমি প্রথমে সম্ভাব্য গল্ফ সম্পর্কে চিন্তা করছি ...
জোনাথন অ্যালান


আপনি কীভাবে কাজ করেছেন? আপনার কাছে একটি ত্রুটি সেখানে আমি মনে করি ব্যবহার করছেন +স্ট্রিং উপর vectorise বলে মনে হয় কিন্তু অন্তর্নিহিত ফলাফল নয় আসলে জেলি iterables কিন্তু স্ট্রিং (যেমন চেষ্টা (!) +@/L€বা +@/L€€বা ...)
জোনাথন অ্যালান

@ জোনাথান অ্যালান হ্যাঁ, +প্রকৃত স্ট্রিং উত্পাদন করে। এটি একটি অনিবন্ধিত বৈশিষ্ট্য, বা আপনি যাকে বাগ বলেছেন।
ফাঁস নুন

3

পাইথন 3, 92 87 74 69 65 বাইট

s=input()
c=1
while s:d=s<s[1:];print(d+(c<d),end='');s=s[1:];c=d

ব্যবহার 0জন্য L, 1জন্য S, এবং 2জন্য *। উদ্ধৃতি অক্ষরগুলিতে ইনপুট স্ট্রিং মোড়ানো; আমি বিশ্বাস করি এটি কনভেনশন দ্বারা অনুমোদিত।

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

উদাহরণ ব্যবহার:

mmiissiissiippi
002100210021000

5 টি বাইট সংরক্ষণ করেছেন লিকি নুনকে, ওভিএসকে 4 বাইট ধন্যবাদ




3

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

f=(c,d)=>c&&(d<(d=c<(c=c.slice(1))))+d+f(c,d)

সংরক্ষিত 6 বাইট @ নীলকে ধন্যবাদ

অনুশীলনের একটি পুনরাবৃত্ত সমাধান।

f=(c,d)=>c&&(d<(d=c<(c=c.slice(1))))+d+f(c,d)

console.log(f('mmiissiissiippi')); //LL*SLL*SLL*SLLL   002100210021000
console.log(f('hello world'));     //L*SSL*L*LLL       02110202000
console.log(f('Hello World'));     //SSSSL*SSLLL       11110211000
console.log(f('53Ab§%5qS'));       //L*SSL*SLL         021102100


6 বাইট সংরক্ষণ করুন:f=(c,d)=>c&&(d<(d=c<(c=c.slice(1))))+d+f(c,d)
নিল

ধন্যবাদ, @ নীল, আমি জানতাম সেখানে কোথাও একটি অপ্টিমাইজেশন থাকতে হবে।
রিক হিচকক

2

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

f=
s=>s.replace(/./g,_=>(c<(c=s<(s=s.slice(1))))+c,c=1)
<input oninput=o.textContent=f(this.value)><pre id=o>

@ L3viathan এর উত্তর বন্দর।


1
@RickHitchcock ওহো, একরকম আমি বন্দর পরিচালিত c=1যেমন c=0...
নিল


1

হাস্কেল , 77 75 বাইট, রৈখিক সময়

f(a:b:c)|let g"L"|a<b="SL";g"S"|a>b="L*";g d=d++d;d:e=f$b:c=g[d]++e
f _="L"

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

কিভাবে এটা কাজ করে

এটি পুনরুক্তি ব্যবহার করে স্ট্রিংয়ের শুরু থেকে একবারে একটি করে অক্ষর ছড়িয়ে দেয়। (হাস্কেল স্ট্রিং টাইপ হ'ল অক্ষরগুলির একক-সংযুক্ত তালিকা, সুতরাং এই পদক্ষেপগুলির প্রতিটি ধ্রুবক-সময়)

  • স্ট্রিং অ্যাবসি-র জন্য যেখানে a এবং b একক অক্ষর এবং সি যে কোনও (সম্ভবত খালি) স্ট্রিং,
    • f ( abc ) = SL e , if f ( bc ) = L e এবং a < b ;
    • f ( abc ) = L * e , if f ( bc ) = S e এবং a > b ;
    • f ( abc ) = LL e , if f ( bc ) = L e এবং ab ;
    • f ( abc ) = এস , যদি f ( বিসি ) = এস এবং বি
  • একটি একক-অক্ষরের স্ট্রিংয়ের জন্য a , f ( a ) = L.

1
আপনি দয়া করে একটি ব্যাখ্যা দিতে পারেন?
আর কাপ,

দয়া করে একটি বিবরণ সরবরাহ করুন যাতে আমি বৈধতা পেতে পারি যে এটি লিনিয়ার সময়ে চলে।
ক্রিস্টোফ

পছন্দ করেছেন
অ্যান্ডারস ক্যাসরগ

পছন্দ করার জন্য @AndersKaseorg ধন্যবাদ! দুঃখজনকভাবে অন্যান্য হাস্কেল উত্তরের তুলনায় এটি বেশ ভার্জোজ মনে হয়। এটি ব্যবহার না করে আরও গল্ফ করা যেতে পারে S, L and *?
ক্রিস্টোফ

1
@ ক্রিসটফ পরিষ্কার হওয়ার জন্য, [1,1,2,0,1,1,2,0,1,1,2,0,1,1,1]একক সংখ্যাগুলির তালিকা, একক অক্ষরের তালিকা নয়। আমার ক্ষেত্রে, আমি মনে করি সংখ্যাগুলির তালিকা আউটপুট করা আমার কোনও বাইট সংরক্ষণ করতে পারে না।
অ্যান্ডারস ক্যাসরগ

1

পাইথন 2 , 65 55 বাইট

L3viathan এর উত্তরের ভিত্তিতে পুনরাবৃত্ত সংস্করণ, এটি ব্যবহার 012করে LS*:

def g(s,d=2):c=s<s[1:];return s and`c+(d<c)`+g(s[1:],c)

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

পাইথন 3 , 65 59 বাইট

Recursive সমাধান ব্যবহার L, Sএবং *:

f=lambda s:s and('LS'[s<s[1:]]+f(s[1:])).replace('LS','L*')

সামনে থেকে স্ট্রিংয়ের মধ্য দিয়ে চলে এবং এর LSসাথে সমস্ত দৃষ্টান্ত প্রতিস্থাপন করেL*

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


1
blah if s else''s and blahছয় বাইট পরিমাণ সঞ্চয় হয়। পাইথন 2 সালে str(blah)`blah`দ্বিতীয় সমাধান আরেকটি তিন বাইট পরিমাণ সঞ্চয় হয়।
অ্যান্ডারস ক্যাসরগ

1

পিএইচপি, 82 বাইট, লিনিয়ার সময়

for($a=$argn;a&$c=$a[$i-=1];$d=$c)$a[$i]=2+$t=$d<=>$c?:$t;echo strtr($a,[13=>12]);

ডান থেকে বামে ইনপুট ধরে হাঁটছে এবং টাইপের সাথে প্রতিটি চরকে প্রতিস্থাপন করবে।

$t=$d<=>$c?:$t

বর্তমান এবং পূর্বের চরটি (-1 বা 1) প্রদত্ত প্রকার গণনা করে। সমান হলে টাইপ পরিবর্তন হয় না।


ধারণার সাথে +1strtr
জার্গ হালসারম্যান

1

পিএইচপি , 70 বাইট

এল = 1, এস = 0, * = 2

শেষ টেস্টকেসটির পরিবর্তে §+3 বাইট সহ মাল্টিবাইট সমর্থন প্রয়োজনmb_substrsubstr

for(;$s=&$argn;$s=$u)$r.=$l=($l&1)+(1&$l^($s>$u=substr($s,1)));echo$r;

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

পিএইচপি , 71 বাইট

এল = 1, এস = 0, * = 2

for(;$s=&$argn;$s=$u)$r.=+($s>$u=substr($s,1));echo strtr($r,[10=>12]);

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

পিএইচপি , 74 বাইট

for(;$s=&$argn;$s=$u)$r.=SL[$s>$u=substr($s,1)];echo strtr($r,[LS=>"L*"]);

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


$s=&$argnবেশ চালাক! আমি নিশ্চিত যে এর চেয়ে আরও ভাল উত্তর আছে যদিও;) আশা করি এর সাথে কেউ এলো :)
ক্রিস্টোফ

@ ক্রিসটফের অনুভূতি আছে যে আমি কিছু মিস করছি। আমি সর্বশেষ এলএস * একটি
ভেরিবেলে

@ ক্রিসটফ মানে আপনার পছন্দ হয়েছে? সর্বশেষ টেস্টকেসটি মিথ্যা কেন আমি সত্যিই দেখি না অনলাইনে চেষ্টা করে দেখুন!
জার্গ হালসারম্যান

@ ক্রিসটফ ঠিক আছে আমি এটি দেখেছি কেন এটি শেষ টেস্টকেসটির জন্য কাজ করে না তবে ইনপুটটি যদি সাধারণ অ্যাস্কি পরিসরে না থাকে তবে তার mb_substrপরিবর্তে আমাকে অবশ্যই ব্যবহার করতে হবে substr। এটি শেষ টেস্টকেস সমর্থন করা প্রয়োজন?
জার্গ হালসারম্যান

1
@Christoph আপনি এই ক্ষেত্রে ধন্যবাদ আমি গত testcase উপেক্ষা§
Jörg Hülsermann
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.