ব্যাখ্যা /// (উচ্চারণ 'স্ল্যাশ')


30

যেহেতু আমরা যথেষ্ট রহস্যময় ভাষা গল্ফ পেতে পারি না, তাই না?

/// - উচ্চারিত স্ল্যাশs/// -এটি পার্ল খ্যাতির রিজেক্স-রিপ্লেসমেন্ট ফাংশনের উপর ভিত্তি করে একটি মজাদার ছোট্ট ভাষা । এটিতে কেবল দুটি বিশেষ অক্ষর রয়েছে, স্ল্যাশ /এবং ব্যাকস্ল্যাশ \। আপনি এটির উপর একটি সম্পূর্ণ নিবন্ধ esolangs উইকিতে খুঁজে পেতে পারেন , তবে আমি নীচের ভাষার বর্ণন , পাশাপাশি কয়েকটি উদাহরণ পুনরুত্পাদন করব।

সংক্ষেপে, এটি /pattern/repl/restপ্রোগ্রামে চিহ্নিতকরণ এবং প্রতিস্থাপনকে যতবার সম্ভব সম্ভব করে তৈরি করে কাজ করে। ব্যতীত কোন অক্ষর বিশেষ /এবং \: /demarcates নিদর্শন এবং প্রোগ্রামে প্রতিস্থাপন, যখন \আপনি আক্ষরিক সন্নিবেশ করতে পারেন /অথবা \আপনার কোড মধ্যে অক্ষর। উল্লেখযোগ্যভাবে, এগুলি নিয়মিত প্রকাশ নয়, কেবল সরল স্ট্রিং প্রতিস্থাপন।

আপনার চ্যালেঞ্জটি হ'ল /// ভাষার জন্য একজন অনুবাদক তৈরি করুন, হয় কোনও প্রোগ্রাম যেমন STDIN পড়া বা কোনও ফাংশন যতটা সম্ভব কম অক্ষরে স্ট্রিং আর্গুমেন্ট গ্রহণ করা।

আপনি নিজে /// ব্যতীত অন্য যে কোনও ভাষা ব্যবহার করতে পারেন। আপনি /// ব্যাখ্যা করে এমন কোনও গ্রন্থাগার ব্যবহার করতে পারবেন না; আপনি তবে রেজিেক্সস, রেজেক্স লাইব্রেরি বা স্ট্রিং-ম্যাচিং লাইব্রেরি ব্যবহার করতে পারেন।


ফাঁসি

চারটি রাজ্য, মুদ্রণ , প্যাটার্ন , প্রতিস্থাপন এবং প্রতিস্থাপন রয়েছেপ্রতিস্থাপন ব্যতীত প্রতিটি রাজ্যে :

  • প্রোগ্রামটি ফাঁকা থাকলে কার্যকর করা বন্ধ হয়ে যায়।
  • অন্যথায়, যদি প্রথম চরিত্রটি হয় \তবে পরবর্তী অক্ষরটির সাথে কিছু করুন (উপস্থিত থাকলে) এবং প্রোগ্রামটি থেকে উভয়কে সরিয়ে দিন।
  • অন্যথায়, যদি প্রথম অক্ষর হয় /তবে এটিকে সরিয়ে ফেলুন এবং পরবর্তী অবস্থায় পরিবর্তন করুন।
  • অন্যথায়, প্রথম চরিত্রটি দিয়ে কিছু করুন এবং এটি প্রোগ্রাম থেকে সরিয়ে দিন।
  • পদ্ধতি পুনরাবৃত্তি করুন।

মাধ্যমে চক্র যুক্তরাষ্ট্রের মুদ্রণ , প্যাটার্ন , প্রতিস্থাপন , এবং প্রতিস্থাপন যাতে।

  • ইন মুদ্রণ মোড, মানে আউটপুট অক্ষরটি হ'ল 'কিছু'।
  • ইন প্যাটার্ন মোড, মানে বর্তমান প্যাটার্ন চরিত্র যোগ করা 'কিছু'।
  • ইন প্রতিস্থাপন মোড, মানে বর্তমান প্রতিস্থাপন চরিত্র যোগ করা 'কিছু'।

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

প্রোগ্রামে /foo/foobar/foo foo foo, নিম্নলিখিতটি ঘটে:

/foo/foobar/foo foo foo
foo foo foo
foobar foo foo
foobarbar foo foo
foobarbarbar foo foo
...

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


উদাহরণ

no

আউটপুট: no

/ world! world!/Hello,/ world! world! world!

আউটপুট: Hello, world!

/foo/Hello, world!//B\/\\R/foo/B/\R

আউটপুট: Hello, world!

a/ab/bbaa/abb

আউটপুট: a। প্রোগ্রাম থেমে নেই।

//

আউটপুট: কিছুই না।

///

আউটপুট: কিছুই না। প্রোগ্রাম থেমে নেই।

/\\/good/\/

আউটপুট: good

উইকিতে একটি কুইন রয়েছে যা আপনি চেষ্টা করতে পারেন।


/-/World//--/Hello//--W/--, w/---!কি ভালবাসা না? (শেষ থেকে ড্যাশ অপসারণের চেষ্টা করুন)
seequ

@ লুভজো \ চরিত্রটি অনুসরণ করে এমন কোনও চরিত্রকে ছাড়িয়ে যায়, এগুলি সহ /, যা পরে সাধারণ হিসাবে ব্যবহার করা যেতে পারে। যদিও এটি খুব বেশি দেখাচ্ছে না, এটি /// ট্যুরিং-সম্পূর্ণ করে তোলে ।
অ্যালগরিদমশার্ক

আমি মনে করি এটি এওসোলংস উইকি নিবন্ধের চেয়ে ভাষার আরও ভাল ব্যাখ্যা। আমার তৈরি ///আইডিইতে এই তথ্যটি ব্যবহার করবে !
ক্লাব 45

উত্তর:


7

এপিএল (১৩৩)

{T←''∘{(0=≢⍵)∨'/'=⊃⍵:(⊂⍺),⊂⍵⋄(⍺,N⌷⍵)∇⍵↓⍨N←1+'\'=⊃⍵}⋄⍞N←T⍵⋄p N←T 1↓N⋄r N←T 1↓N⋄''≡N:→⋄∇{⍵≡p:∇r⋄∨/Z←p⍷⍵:∇(r,⍵↓⍨N+≢p),⍨⍵↑⍨N←1-⍨Z⍳1⋄⍵}1↓N}

এটি এমন একটি ফাংশন যা কোডটিকে ///তার সঠিক যুক্তি হিসাবে গ্রহণ করে ।

বর্ণহীন, ব্যাখ্যা সহ:

slashes←{
   ⍝ a function to split the input string into 'current' and 'next' parts,
   ⍝ and unescape the 'current' bit
   split←''∘{
       ⍝ if the string is empty, or '/' is reached,
       ⍝ return both strings (⍺=accumulator ⍵=unprocessed)
       (0=≢⍵)∨'/'=⊃⍵:(⊂⍺),⊂⍵
       ⍝ otherwise, add current character to accumulator,
       ⍝ skipping over '\'s. (so if '\/' is reached, it skips '\',
       ⍝ adds '/' and then processes the character *after* that.)
       idx←1+'\'=⊃⍵
       (⍺,idx⌷⍵)∇idx↓⍵
   }

   ⍞   next ← split ⍵      ⍝ output stage
   pat next ← split 1↓next ⍝ pattern stage, and eat the '/'
   rpl next ← split 1↓next ⍝ replacement stage, and eat the '/'

   ⍝ if there are no characters left, halt.
   ''≡next:⍬

   ⍝ otherwise, replace and continue.
   ∇{  ⍝ if the input string equals the pattern, return the replacement and loop
       ⍵≡pat:∇rpl

       ⍝ otherwise, find occurences, if there are, replace the first and loop
       ∨/occ←pat⍷⍵:∇(rpl, (idx+≢pat)↓⍵),⍨ (idx←(occ⍳1)-1)↑⍵

       ⍝ if no occurences, return string
       ⍵

   }1↓next
}

"যদি কোনও অক্ষর না থাকে, থামুন" " এটি কি ( ///এবং //foo/চিরকালের জন্য লুপ) সঠিকভাবে কাজ করে ?
অ্যালগরিদমশার্ক

@ অ্যালগরিদমশর্ক: হ্যাঁ, এই পরিস্থিতিতে পরিস্থিতি /এখনও সেই পর্যায়ে থাকবে।
মেরিনাস

11

জে - 181 190 170 চর

এটি ছিল একটি দুঃস্বপ্ন। আমি স্ক্র্যাচ থেকে এটি আবার লিখলাম, দু'বার, কারণ এটি আমাকে ত্রুটিযুক্ত করে চলেছে। এটি STDOUT এ আউটপুট করে একটি একক স্ট্রিং আর্গুমেন্ট গ্রহণ করে এমন একটি ফাংশন।

(0&$`((2{.{:@>&.>)((j{.]),-i@=`p@.~:~/@[,]}.~#@p+j=.0{p I.@E.])i 5;@}.&,'/';"0;&.>)@.(2<#)@}.[4:1!:2~{:@>@p=.>@{.@[)@((0;(0,:~1 0,.2);'\';&<1 0)<;._1@;:'/'&,)i=. ::](^:_)

ব্যাখ্যা করার জন্য, আমি এটি subexpresstions মধ্যে বিভক্ত করা হবে।

i =. ::](^:_))
parse =: ((0;(0,:~1 0,.2);'\';&<1 0)<;._1@;:'/'&,)
print =: 4:1!:2~{:@>@p=.>@{.@[
eval  =: 0&$`((2{.{:@>&.>)sub 5;@}.&,'/';"0;&.>)@.(2<#)@}.
sub   =: ((j{.]),-i@=`p@.~:~/@[,]}.~#@p+j=.0{p I.@E.])i

interp =: (eval [ print) @ parse i
  • i( পুনরাবৃত্তির জন্য সংক্ষিপ্ত ) একটি বিশেষণ এটি বামদিকে ক্রিয়া যুক্তি গ্রহণ করে এবং একটি ক্রিয়া ফিরিয়ে দেয় (f)i, যখন একটি যুক্তির উপর প্রয়োগ fকরা হয়, যুক্তির সাথে বারবার প্রয়োগ হয় যতক্ষণ না দুটি জিনিসের একটি ঘটে থাকে: এটি একটি নির্দিষ্ট বিন্দু ( y = f y) আবিষ্কার করে, বা এটি ত্রুটি ছুঁড়ে দেয়। স্থির-অবস্থানের আচরণটি সহজাত ^:_এবং ::]ত্রুটি পরিচালনা করে।

  • parseআমি অর্ধ-পার্স করা ফর্মটিকে কী বলে ইনপুটটিকে টোকেনাইজ করে এবং তারপরে এটি আটকানো '/' এ কেটে দেয়। এটি তাদের অক্ষরগুলির সাথে পালিয়ে যাওয়া ব্যাকস্ল্যাশকে আবদ্ধ করে, তবে ব্যাকস্ল্যাশগুলি থেকে মুক্তি পাওয়া যায় না — তাই আমরা হয় তা ফিরিয়ে দিতে পারি বা আমরা যা চাই তার উপর নির্ভর করে এটি শেষ করতে পারি।

    আকর্ষণীয় কাজের বেশিরভাগ অংশটি ঘটে ;:। এটি একটি অনুক্রমিক-মেশিন ইন্টারপ্রেটার আদিম, (0;(0,:~1 0,.2);'\';&<1 0)বামদিকে মেশিনের ( ) বিবরণ এবং ডানদিকে পার্স করার জন্য কিছু গ্রহণ করে। এটি টোকেনাইজিং করে। আমি নোট করব যে এই নির্দিষ্ট মেশিনটি আসলে প্রথম চরিত্রটিকে বিশেষভাবে বিবেচনা করে না, এমনকি যদি এটি একটি হয় \এবং আবদ্ধ হয়। আমি কয়েকটি কারণে এটি করছি: (1) রাষ্ট্রীয় টেবিলটি সহজ, তাই এটি আরও গল্ফ করা যেতে পারে; (২) সমস্যাটি ডজ করতে আমরা সহজেই সামনের দিকে একটি ডামি চরিত্র যুক্ত করতে পারি; এবং (3) যে ডামি-চরিত্রটি কোনও অতিরিক্ত ব্যয় ছাড়াই অর্ধ-পার্স হয়, তাই আমি পরবর্তীটি কাটার পর্বে সেট আপ করতে এটি ব্যবহার করতে পারি।

    আমরা <;._1অনস্কেপডে টোকেনাইজড ফলাফলটি কাটতেও ব্যবহার করি /(যা আমি প্রথম চর হিসাবে বেছে নিই)। এটি out/patt/repl/restএক ধাপে সমস্ত থেকে আউটপুট, প্যাটার্ন এবং প্রতিস্থাপনটি টানতে সহজ , তবে দুর্ভাগ্যক্রমে বাকি প্রোগ্রামটিও কেটে যায়, যেখানে আমাদের /অচ্ছুত থাকার প্রয়োজন । আমি এগুলি পিছনে ছড়িয়ে দিয়েছি eval, কারণ <;._1এগুলি একা রেখে দেওয়ার ফলে আরও অনেক বেশি ব্যয় হয়।

  • কাঁটাচামচ (eval [ print), executes printথেকে ফলাফলে parseতার পার্শ্ব প্রতিক্রিয়া জন্য, এবং তারপর রান evalprintএটি একটি সাধারণ ক্রিয়া যা প্রথম বাক্সটি খোলে (যা আমরা নিশ্চিতভাবে জানি এটি আউটপুট), এটি পার্সিং শেষ করে এবং এটি STDOUT এ প্রেরণ করে। তবে আমরা কোনও ইউটিলিটি ক্রিয়া সংজ্ঞায়নের সুযোগটিও নিই p

    pহিসাবে সংজ্ঞায়িত করা হয় >@{.@[, সুতরাং এটি তার বাম দিকটি ধরে রাখে (কেবলমাত্র একটি আর্গ দেওয়া থাকলে সনাক্তকরণের মতো কাজ করে) that এর প্রথম আইটেমটি (একটি স্কেলার দেওয়ার সময় পরিচয়) নেয় এবং এটি আনবক্স করে না (ইতিমধ্যে আনবক্স না থাকলে পরিচয়)। এটি খুব কাজে আসবে sub

  • evalপ্রক্রিয়াজাত প্রোগ্রামের বাকী মূল্যায়ন করে। যদি আমাদের কাছে পুরো প্যাটার্ন বা পুরো প্রতিস্থাপন না থাকে তবে evalএটিকে ছুঁড়ে ফেলে দেয় এবং কেবল একটি খালি তালিকা দেয়, যা পরবর্তী পুনরাবৃত্তিতে ত্রুটি ;:(থেকে parse) তৈরি করে মূল্যায়ন বন্ধ করে দেয়। অন্যথায়, evalনিদর্শন এবং প্রতিস্থাপনের পুরোপুরি বিশ্লেষণ করে, উত্সের বাকী অংশগুলি সংশোধন করে এবং তারপরে উভয়তে চলে যায় sub। বিস্ফোরণ দ্বারা:

                                                  @}.  NB. throw out printed part
                                           @.(2<#)     NB. if we have a pattern and repl:
          2{.                                          NB.  take the first two cuts:
                 &.>                                   NB.   in each cut:
             {:@>                                      NB.    drop escaping \ from chars
         (          )                                  NB.  (these are pattern and repl)
                                       &.>             NB.  in each cut:
                                      ;                NB.   revert to source form
                                '/';"0                 NB.  attach a / to each cut
                              &,                       NB.  linearize (/ before each cut)
                         5  }.                         NB.  drop '/pattern/repl/'
                          ;@                           NB.  splice together
        (            sub                  )            NB.  feed these into sub
       `                                               NB. else:
    0&$                                                NB.  truncate to an empty list
    
  • subযেখানে বিকল্পগুলির এক (সম্ভবত অসীম) রাউন্ডটি ঘটে। যেভাবে আমরা সেট আপ করেছি eval, উত্সটি হ'ল সঠিক যুক্তি এবং প্যাটার্ন এবং প্রতিস্থাপনটি বামে একসাথে বান্ডিল করা হয়েছে। যেহেতু আর্গুমেন্টগুলি এইভাবে অর্ডার করা হয় এবং আমরা জানি যে প্যাটার্নটি এবং প্রতিস্থাপনগুলি প্রতিস্থাপনের চক্রের মধ্যে পরিবর্তন হয় না, তাই আমরা iএটির আরও একটি বৈশিষ্ট্য ব্যবহার করতে পারি - এটি কেবলমাত্র সঠিক যুক্তিটি সংশোধন করে এবং একই বামে প্রবেশ করে deleg প্রতিনিধি হিসাবে জে রাষ্ট্রের ট্র্যাক রাখা সম্পর্কে চিন্তা করা প্রয়োজন।

    যদিও সমস্যা দুটি দাগ আছে। প্রথমটি হ'ল J ক্রিয়াপদের সর্বাধিক দুটি আর্গুমেন্ট থাকতে পারে, সুতরাং এখানে প্যাটার্ন এবং প্রতিস্থাপনের মতো একত্রে বান্ডিলযুক্ত কোনও অ্যাক্সেসের সহজ উপায় আমাদের কাছে নেই। pআমাদের সংজ্ঞায়িত ইউটিলিটির চতুর ব্যবহারের মাধ্যমে , এটি কোনও সমস্যা নয়। প্রকৃতপক্ষে, আমরা pএর >@{.@[সংজ্ঞাটির কারণে কেবলমাত্র একটি অক্ষরে প্যাটার্নটি অ্যাক্সেস করতে পারি : বাম দিকের আর্গুমেন্টের প্রথম আইটেমটির আনবক্স। প্রতিস্থাপনটি পাওয়া কৌশলটি জটিল, তবে স্বল্পতম উপায় হ'ল p&|.ম্যানুয়ালি এটির বাইরে আসার চেয়ে 2 টি অক্ষর ছোট।

    দ্বিতীয় সমস্যাটি হ'ল iচিরতরে লুপিংয়ের পরিবর্তে স্থির পয়েন্টগুলিতে প্রস্থান করে, এবং যদি প্যাটার্ন এবং প্রতিস্থাপন সমান হয় এবং আপনি বিকল্প প্রতিস্থাপন করেন, এটি জেতে একটি নির্দিষ্ট পয়েন্টের মতো দেখায় We আমরা 1 ওভারটিকে উপেক্ষা করার অসীম লুপটি প্রবেশ করে এটি পরিচালনা করি and ওভার যদি আমরা সনাক্ত করি যে তারা সমান: এই -i@=`p@.~:~/অংশটি প্রতিস্থাপন করা হচ্ছে p&|.

                                        p    E.]    NB. string search, patt in src
                                          I.@       NB. indices of matches
                                      0{            NB. take the first (error if none)
                                   j=.              NB. assign to j for later use
                               #@p+                 NB. add length of pattern
                           ]}.~                     NB. drop that many chars from src
                       /@[                          NB. between patt and repl:
                      ~                             NB.  patt as right arg, repl as left
                  @.~:                              NB.  if equal:
            -i@=                                    NB.   loop forever
                `p                                  NB.  else: return repl
     (j{.])                                         NB. first j chars of src
           ,              ,                         NB. append all together
    (                                           )i  NB. iterate
    
  • এই চক্রটি ত্রুটির iবাইরে কিছু না বের হওয়া পর্যন্ত ব্যবহারের কারণে পুনরাবৃত্তি subকরে। যতদূর আমি সচেতন, এটি কেবল তখনই ঘটতে পারে যখন আমরা অক্ষরের বাইরে থাকি এবং যখন আমরা প্যাটার্ন-এবং-প্রতিস্থাপনের একটি অসম্পূর্ণ সেট ফেলে দেব।

এই গল্ফ সম্পর্কে মজার তথ্য:

  • একবারের জন্য, ;:ব্যবহারটি স্ট্রিংটির মাধ্যমে ম্যানুয়ালি পুনরাবৃত্ত হওয়ার চেয়ে কম।
  • 0{subঅসীম লুপে যাওয়ার আগে ত্রুটির বাইরে যাওয়ার সুযোগ থাকা উচিত , সুতরাং প্যাটার্নটি প্রতিস্থাপনের সাথে মেলে তবে উত্সের বাকী অংশে কখনই দেখাবে না যদি এটি কাজ করে। তবে এটি অনির্দিষ্ট আচরণ বা নাও হতে পারে, যেহেতু আমি ডক্সে কোনওভাবেই উদ্ধৃতি পাই না itation উপস্।
  • কীবোর্ড বিঘ্নগুলি চলমান ফাংশনের অভ্যন্তরে স্বতঃস্ফূর্ত ত্রুটি হিসাবে প্রক্রিয়া করা হয়। তবে প্রকৃতির কারণে iএই ত্রুটিগুলিও আটকা পড়ে। আপনি যখন Ctrl + C চাপছেন তখন তার উপর নির্ভর করে আপনি:
    • নেগেটিভ-চিরকালীন লুপ থেকে বেরিয়ে subআসুন, কোনও সংখ্যাকে একটি স্ট্রিংয়ের সাথে যুক্ত করার চেষ্টা করে লুপের বাইরে ত্রুটিটি বের করুন এবং তারপরে /// ব্যাখ্যা করতে যান যেন আপনি নিজের সাথে একটি স্ট্রিংকে অসীম সংখ্যার বার স্থির করে ফেলেছেন।
    • subঅর্ধেক পথ ছেড়ে যান এবং একটি অর্ধ subbed /// এক্সপ্রেশন ব্যাখ্যা করতে যান।
    • দোভাষী থেকে বিরত থাকুন এবং একটি অবমূল্যায়িত /// প্রোগ্রামটি REPL- এ ফিরিয়ে দিন (যদিও STDOUT নয়)।

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

   f=:(0&$`((2{.{:@>&.>)((j{.]),-i@=`p@.~:~/@[,]}.~#@p+j=.0{p I.@E.])i 5;@}.&,'/';"0;&.>)@.(2<#)@}.[4:1!:2~{:@>@p=.>@{.@[)@((0;(0,:~1 0,.2);'\';&<1 0)<;._1@;:'/'&,)i=. ::](^:_)
   f 'no'
no
   f '/ world! world!/Hello,/ world! world! world!'
Hello, world!
   f '/foo/Hello, world!//B\/\\R/foo/B/\R'
Hello, world!
   f '//'  NB. empty string

   f '/\\/good/\/'
good

কি দারুন. আমি এই masochistic কল করব। +1

আমি যখন এটি চালাই, আমি প্রতিটি পরীক্ষার ক্ষেত্রে খালি স্ট্রিংটি পাই। আমি jqt64 ব্যবহার করছি, আপনি এটি চালানোর জন্য কী ব্যবহার করছেন?
বিসিএসবি 1001

@ বিসিএসবি 1001 আমি সরাসরি (64-বিট) জকনসোল বাইনারি ব্যবহার করছি। এখন jqt পরীক্ষা করা হচ্ছে, আমি /\\/good/\/পরীক্ষার কেস বাদে প্রকৃত ফলাফল পাচ্ছি ; 1!:2&4ডিবাগিংটি আমাকে জানায় যে বিষয়টি আমার ব্যবহার , কারণ জিকিটিতে স্টিডিন / আউট নেই। তদন্ত করবে। আপনার 9!:12''এবং 9!:14''কি?
অ্যালগরিদমশর্ক

@ অ্যালগরিদমশার্ক আমার 9!:12''বয়স 6, এবং 9!:14''এটি জে 701 / 2011-01-10 / 11: 25।
বিসিএসবি 1001

4

পার্ল - 190

$|=1;$/=undef;$_=<>;while($_){($d,$_)=/(.)(.*)/;eval(!$e&&({'/','$a++','\\','$e=1'}->{$d})||('print$d','$b.=$d','$c.=$d')[$a].';$e=0');if($a==3){while($b?s/\Q$b/$c/:s/^/$c/){}$a=0;$b=$c=''}}

স্টিডিন ///থেকে ইওএফ পর্যন্ত প্রোগ্রাম পড়ে।


m/^(.*?)(?<!\\)\/(.*?)(?<!\\)\/(.*?)(?<!\\)\/(.*)$/s---- মিলের আউটপুট, প্যাটার্ন এবং প্রতিস্থাপনের রেখাগুলির সাথে সাথে কী কোনও পদ্ধতির সাথে একবারে - একটি সংক্ষিপ্ত গল্ফ তৈরি করতে পারে? আমি নিজেই কোনও পার্লকে চিনি না।
অ্যালগরিদমশর্ক

আমি বিশ্বাস করি /a/\0/a
এটির

3

পিপ , 100 102 বাইট

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

101 টি বাইট কোডের, -rপতাকাটির জন্য +1 :

i:gJnf:{a:xW#i&'/NE YPOia.:yQ'\?POiya}W#iI'\Q YPOiOPOiEIyQ'/{p:VfY0s:VfIyQ'/WpNi&YviR:Xp{++y?ps}}E Oy

প্রচুর মন্তব্য সহ এখানে আমার অদম্য সংস্করণ:

; Use the -r flag to read the /// program from stdin
; Stdin is read into g as a list of lines; join them on newline and assign to c for code
c : gJn

; Loop while c is nonempty
W #c {
 ; Pop the first character of c and yank into y
 Y POc
 ; If y equals "\"
 I yQ'\
  ; Pop c again and output
  O POc
 ; Else if y equals "/"
 EI yQ'/ {
  ; Build up pattern p from empty string
  p : ""
  ; Pop c, yank into y, loop while that is not equal to "/" and c is nonempty
  W #c & '/ NE Y POc {
   ; If y equals "\"
   I yQ'\
    ; Pop c again and add that character to p
    p .: POc
   ; Else, add y to p
   E p .: y
  }

  ; Yank 0 so we can reliably tell whether the /// construct was completed or not
  Y0
  ; Build up substitution s from empty string
  s : ""
  ; Pop c, yank into y, loop while that is not equal to "/" and c is nonempty
  W #c & '/ NE Y POc {
   ; If y equals "\"
   I yQ'\
    ; Pop c again and add that character to s
    s .: POc
   ; Else, add y to s
   E s .: y
  }

  ; If the last value yanked was "/", then we have a complete substitution
  ; If not, the code must have run out; skip this branch, and then the outer loop
  ; will terminate
  I yQ'/ {
   ; While pattern is found in code:
   W pNc {
    ; Set flag so only one replacement gets done
    i : 0
    ; Convert p to a regex; replace it using a callback function: if ++i is 1,
    ; replace with s; otherwise, leave unchanged
    c R: Xp {++i=1 ? s p}
   }
  }
 }
 ; Else, output y
 E Oy
}

এটি অনলাইন চেষ্টা করুন! (নোট করুন যে প্রোগ্রামটি সমাপ্ত না হওয়াতে টিআইও কোনও আউটপুট দেয় না এবং এর একটি সময়সীমাও রয়েছে larger


আমি মনে করি এটি pip + -r101 101 বাইট হওয়া উচিত
Asone Tuhid

3

সি ++: ভিজ্যুয়াল সি ++ 2013 = 423, জি ++ 4.9.0 = 442

এটি কখনই জিতবে না তবে যেহেতু আমি সিদ্ধান্ত নিয়েছি যে আমার ভবিষ্যতের সমস্ত সফ্টওয়্যার প্রকল্পগুলি এই দুর্দান্ত ভাষায় লেখা হবে আমার এর জন্য একজন ইন্টারপ্রিটারের দরকার ছিল এবং আমি বুঝতে পেরেছিলাম যে আমি যেটি তৈরি করেছি তাও ভাগ করে নিতে পারি ...

স্কোরের পার্থক্যটি হ'ল ভিজ্যুয়াল সি ++ এর জন্য প্রথম অন্তর্ভুক্ত হওয়া দরকার নেই তবে জি ++ রয়েছে। স্কোর ধরে নেয় যে লাইন শেষ 1 হিসাবে গণনা।

#include<string.h>
#include<string>
#define M(x)memset(x,0,99);
#define P o[i])
#define N(x)P;else if(n<x)(P==92?
#define O (o[++i]):(P==47?n++:
#define S std::string
int main(int n,char**m){S o=m[1];char p[99],*q=p,r[99],*s=r;M(p)M(r)for(int i=0,t;i<=o.size();++i){if(!N(3)putchar O putchar(N(4)*q++=O(*q++=N(5)*s++=O(*s++=P;if(n>4){for(;;){if((t=o.find(p,i+1))==S::npos)break;o=o.substr(0,t)+r+o.substr(t+strlen(p));}M(p)M(r)n=2;q=p;s=r;}}}

1
আপনি পুনর্লিখন করতে পারি if(!o[i]);যেমন if(Pঅক্ষর সংরক্ষণ করতে, অথবা আমি ভুল বুঝা করছি # define কিভাবে কাজ করে?
অ্যালগরিদমশার্ক

@ অ্যালগরিদমশর্ক আমি কীভাবে মিস করেছি ?! যদি (! পি নিখুঁত হয় it আমি এটি পরিবর্তন করব
জেরি যেরেমিয়া

প্রত্যেকটা নিদর্শনের Pমধ্যে mainযাতে আপনি সেমিকোলন যাদের স্পেস প্রতিস্থাপন এবং থেকে এটি সরানোর দ্বারা একটি অক্ষর সংরক্ষণ করতে পারবেন, এটা পরে একটি স্থান আছে #define। তারপর, যদি আপনি ব্যবহার করতে পারেন #defineঅন্যান্য বেশী ভিতরে এস, আপনি আরো কিছু rewriting দ্বারা সংরক্ষণ করতে পারেন N(x)হিসাবে (92==Pপরিবর্তে o[i]==92এবং Oএকইভাবে।
অ্যালগরিদমশর্ক

@ অ্যালগরিদমশর্ক আপনার চেয়ে স্পষ্টতই আমি এই তুলনায় অনেক ভাল the সাহায্যের জন্য ধন্যবাদ।
জেরি যেরেমিয়া

আমি জানি এই চার বছর পুরানো, কিন্তু rewriting N(x)যেমন P;else if(n<x)(P==92?এবং কলের পরিবর্তন Nঅনুসারে কয়েক বাইট সংরক্ষণ করতে পারিনি।
জাকারি

2

পাইথন 2 (236), পাইথন 3 (198?)

from __future__ import print_function
def d(i):
 t=0;p=['']*3+[1]
 while i:
  if'/'==i[0]:t+=1
  else:
   if'\\'==i[0]:i=i[1:]
   p[t]+=i[0]
  i=i[1:]
  print(end=p[0]);p[0]=''
  if t>2:
   while p[1]in i:i=i.replace(*p[1:])
   d(i);i=0

হিসাবে ডাকা হয় d(r"""/foo/Hello, world!//B\/\\R/foo/B/\R""")। ট্রিপল উদ্ধৃতিগুলি কেবলমাত্র তখনই প্রয়োজন হয় যখন ///প্রোগ্রামটিতে নতুন লাইন থাকে: অন্যথায় সরল উদ্ধৃতিগুলি ঠিক আছে।

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


সমাপ্তি সমস্যাযুক্ত না হওয়া পর্যন্ত দোভাষী কোনও কিছুই মুদ্রণ করছেন না। /// এ একটি অসীম লুপ লেখা সম্ভব, সুতরাং আপনার দোভাষী আর-টার্মিনেটিং-কিন্তু-স্টিল-প্রিন্টিং-কিছু প্রোগ্রামে ব্যর্থ।
গর্বিত হাসেলেলার

পছন্দ করুন
ব্রুনো লে ফ্লাচ

আসলে, এটি স্থির নয়, এটি এর জন্য কিছু মুদ্রণ করে না /a/ab/bbaa/abb
বিটা ক্ষয়

@ বেটাডেকে /a/ab/bbaa/abbকোনও প্রিন্ট না করেই অন্তহীন লুপে আটকে যাবে, কারণ প্রথম প্রতিস্থাপনটি a=> ab। সঠিক a/ab/bbaa/abbহিসাবে বিজ্ঞাপন হিসাবে কাজ করে।
অ্যালগরিদমশার্ক

@ বেটাডেকে: অ্যালগরিদমশার্কের প্রস্তাবিত পরিবর্তনের পাশাপাশি -uআউটপুট বাফারকে ভারসাম্যহীন হতে বাধ্য করার জন্য আপনাকে কমান্ড লাইন বিকল্প অন্তর্ভুক্ত করতে হবে।
ব্রুনো লে ফ্লাচ

2

কোবরা - 226

sig Z as String
def f(l='')
    m=Z(do=[l[:1],l=l[1:]][0])
    n as Z=do
        if'/'<>(a=m())>'',return if(a=='\\',m(),a)+n()
        else,return''
    print n()stop
    p,s=n(),n()
    if''<l
        while p in l,l=l[:l.indexOf(p)+1]+s+l[p.length:]
        .f(l)

2

রুবি , 119 110 বাইট

ব্যতিক্রম সহ শেষ হয়

r=->s,o=$>{s[k=s[0]]='';k==?/?o==$>?s.gsub!([r[s,''],e=r[s,'']][0]){e}:t=o:o<<(k==?\\?s[0]+s[0]='':k);t||redo}

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

পরিষ্কারভাবে শেষ হয় (116 বাইট)

r=->s,o=$>{s[k=s[0]||exit]='';k==?/?o==$>?s.gsub!([r[s,''],e=r[s,'']][0]){e}:t=o:o<<(k==?\\?s[0]+s[0]='':k);t||redo}

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


1

পাইথন 2/3 (211 বাইট)

ব্রুনো লে ফ্ল্যাচের উত্তরের উপর ভিত্তি করে নিম্নলিখিত কোডটি পাইথন 2 এবং পাইথন 3 সামঞ্জস্যপূর্ণ।

তদুপরি, পুনরাবৃত্তির পরিবর্তে পুনরাবৃত্তি হওয়া এটি পাইথনের সর্বাধিক পুনরাবৃত্তির গভীরতায় আঘাত হানার ঝুঁকি রাখে না।

def S(c):
 while c:
  B=["","",1]
  for m in 0,1,2:
   while c:
    if"/"==c[0]:c=c[1:];break
    if"\\"==c[0]:c=c[1:]
    if m:B[m-1]+=c[0]
    else:yield c[0]
    c=c[1:]
  while c and B[0]in c:c=c.replace(*B)

হ্যালো এবং পিপিসিজিতে আপনাকে স্বাগতম। আপনি গলফ পারেন in(0,1,2)করতে in 0,1,2এবং [""]*2+[1]করতে ["","",1]ফলে, 211 বাইট
জোনাথন ফ্রেচ

আমি রেফার করা উত্তরের সাথে লিঙ্ক করেছি এবং "বাইটস" শব্দটি যুক্ত করেছি। আপনি যদি আমার সম্পাদনার সাথে একমত না হন তবে নির্দ্বিধায় ফিরে যান।
জোনাথন ফ্রেচ

ধন্যবাদ জোনাথন, আপনার পরামর্শগুলি খুব স্বাগত!
কার্লোস লুনা

0

বেকন , 391 387 395 বাইট

এই পৃষ্ঠায় অবদানগুলি থেকে আমি পাইথন প্রোগ্রামটি কাজ করতে পেরেছি। অন্যরা কিছু /// নমুনার জন্য কাজ করে, বা মোটেও কাজ করে না। অতএব, আমি আমার সংস্করণটি যুক্ত করার সিদ্ধান্ত নিয়েছি, যা বেসিকের একটি বাস্তবায়ন।

বেসিকের সাথে কোডগল্ফের প্রতিযোগিতায় অংশ নেওয়া সহজ নয়, কারণ বেসিক দীর্ঘ বিবৃতি হিসাবে বিবৃতি হিসাবে ব্যবহার করে। বেসিকের সাধারণত সংক্ষিপ্তসার পাওয়া যায় '?' চিহ্ন, যার অর্থ PRINT।

সুতরাং নীচের প্রোগ্রামটি কখনও জিততে পারে না, তবে কমপক্ষে এটি এই কোডগল্ফ পৃষ্ঠায় এবং এসোলাংস উইকিতে সমস্ত বিক্ষোভ কোডের সাথে কাজ করে । "বিয়ারের 99 টি বোতল" এর সমস্ত সংস্করণ সহ।

p$=""
r$=""
INPUT i$
WHILE LEN(i$)
t$=LEFT$(i$,1)
i$=MID$(i$,2)
IF NOT(e) THEN
IF t$="\\" THEN
e=1
CONTINUE
ELIF t$="/" THEN
o=IIF(o<2,o+1,0)
IF o>0 THEN CONTINUE
FI
FI
IF o=1 THEN
p$=p$&t$
ELIF o=2 THEN
r$=r$&t$
ELIF o=0 THEN
IF LEN(p$) THEN i$=REPLACE$(i$,p$,r$)
IF NOT(INSTR(t$&i$,"/")) THEN
?t$;
BREAK
ELSE
?LEFT$(i$,INSTR(i$,"/")-1);
i$=MID$(i$,INSTR(i$,"/"))
FI
p$=""
r$=""
FI
e=0
WEND
?i$

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