ওভারফ্লো প্রুফ বাফার


23

পটভূমি

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

সংক্ষিপ্ত বিবরণ

আপনার একটি সন্নিবেশ-কেবল বাফার রয়েছে যা এতে উপাদান যুক্ত হওয়ার সাথে সাথে আকারে বৃদ্ধি পায়। বাফারটি শূন্য-সূচকযুক্ত এবং এর বর্তমান আকারকেও সূচকযুক্ত । এই চ্যালেঞ্জের জন্য বিশেষ নিয়মটি হ'ল:

  • একটি আইটেম সূচিতে ঢোকাতে আমি গনা মানে , j = i % buffer.length()এবং পরে নতুন আইটেম সন্নিবেশ jth তালিকায় আইটেম।

একমাত্র বিশেষ ক্ষেত্রে হ'ল বাফারটি খালি থাকে, কারণ পাটিগণিতের মডুলো শূন্য কাজ করে না। সুতরাং, যদি বাফারটি বর্তমানে খালি থাকে তবে নতুন আইটেমটি সূচক 0 হবে

বাফার যদি কেবল একটি আইটেম থাকে তবে আপনি সর্বদা 0 তম আইটেমের পরে সন্নিবেশ করছেন । এটি সাধারণ মামলার মাত্র একটি উদাহরণ।

যদি বাফারে 6 টি আইটেম থাকে: [4, 9, 14, 8, 5, 2]এবং আপনাকে 10সূচী 15 এ একটি নতুন আইটেম সন্নিবেশ করানোর কথা বলা হয় , আপনি এটি খুঁজে পান 15 % 6 == 3এবং তারপরে সূচক 3 এর10 পরে নতুনটি সন্নিবেশ করান যা ফলস্বরূপ বাফার দেয় 8[4, 9, 14, 8, 10, 5, 2]

সমস্যা

একটি ক্রিয়াকলাপ বা প্রোগ্রাম লিখুন যা ইতিবাচক পূর্ণসংখ্যার একটি অর্ডার তালিকাভুক্ত তালিকা এবং সেগুলি সন্নিবেশ করার জন্য ধনাত্মক পূর্ণসংখ্যার সূচকগুলি লিখুন।

একটি খালি বাফার দিয়ে শুরু করুন, এবং সম্পর্কিত সূচকগুলিতে বাফারে নির্দিষ্ট পূর্ণসংখ্যা যুক্ত করুন।

সমস্ত নির্দিষ্ট সন্নিবেশ করার পরে বাফারে থাকা পূর্ণসংখ্যার ক্রম তালিকাটি আউটপুট করুন।

এটি একটি কোড-গল্ফ চ্যালেঞ্জ, তাই সংক্ষিপ্ততম কোড জয়ী।

ইনপুট নির্দেশিকা

আপনি উপযুক্ত দেখেন তবে আপনি ইনপুট তালিকাগুলি নিতে পারেন। উদাহরণ:

  • জোড়গুলির তালিকা: [ [1,1], [2,4], [3,9], [4,16], [5,25]...]
  • আইটেমের তালিকা এবং সূচী তালিকা: [1, 2, 3, 4, 5...], [1, 4, 9, 16, 25]
  • চ্যাপ্টা: [1, 1, 2, 4, 3, 9, 4, 16, 5, 25 ...]
  • প্রভৃতি

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

পরীক্ষার মামলা

স্কোয়ার কেস উপরে থেকে:

[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64)] -> [1, 2, 8, 7, 6, 5, 4, 3]

আমি এলোমেলোভাবে উত্পন্ন:

[(11, 9), (13, 14)] -> [11, 13]
[(1, 18), (11, 7), (3, 35), (16, 22)] -> [1, 11, 16, 3]
[(3, 16), (16, 37), (0, 28), (18, 24)] -> [3, 18, 0, 16]
[(7, 26), (8, 20), (11, 39), (1, 23), (17, 27)] -> [7, 8, 11, 1, 17]
[(15, 35), (17, 7), (16, 15), (1, 13), (2, 6), (11, 34)] -> [15, 17, 1, 2, 16, 11]
[(2, 13), (1, 20), (16, 25), (8, 21), (5, 2), (16, 37), (3, 0)] -> [2, 3, 8, 1, 16, 5, 16]
[(6, 20), (15, 15), (12, 26), (10, 27), (17, 13), (7, 18), (4, 16)] -> [6, 10, 17, 12, 7, 4, 15]
[(18, 9), (5, 34), (15, 4), (12, 29), (2, 5), (7, 0), (7, 10), (16, 38)] -> [18, 7, 15, 2, 16, 5, 7, 12]
[(0, 12), (12, 0), (4, 16), (15, 12), (6, 28), (8, 10), (11, 24), (0, 25)] -> [0, 11, 8, 6, 15, 0, 4, 12]
[(6, 12), (14, 13), (10, 33), (11, 35), (1, 3), (0, 28), (15, 27), (8, 10), (1, 2)] -> [6, 14, 10, 1, 11, 8, 15, 0, 1]
[(2, 29), (19, 30), (18, 17), (13, 3), (0, 21), (19, 19), (11, 13), (12, 31), (3, 25)] -> [2, 13, 3, 11, 0, 12, 19, 18, 19]

পাইথন 3 রেফারেন্স বাস্তবায়ন

def f(inputs):
    # `inputs` is a list of pairs
    buff = []
    for item, index in inputs:
        if len(buff) == 0:
            buff.insert(0, item)
        else:
            insert_after = index % len(buff)
            buff.insert(insert_after+1, item)
    return buff

বিপরীতে কি ইনপুট নেওয়া যেতে পারে?
ফ্লিপট্যাক

হ্যাঁ, আমি মনে করি ইনপুটটি যতটা চাইবে তত নমনীয় হতে পারে।
টারবুলেশনটো

উত্তর:


4

এমএটিএল , 24 22 বাইট

"N?@2)yn\Q:&)@1)wv}@1)

ইনপুট হল একটি ম্যাট্রিক্স ( ;সারি বিভাজক হিসাবে) প্রথম সারিতে মানগুলি এবং দ্বিতীয়টিতে সূচকগুলি অন্তর্ভুক্ত।

আউটপুট একটি কলাম অ্যারে, নিউলাইনগুলি দ্বারা পৃথক করা সংখ্যা হিসাবে প্রদর্শিত হয়।

এটি অনলাইন চেষ্টা করুন! বাপ্রতিটি পরীক্ষার কেস যাচাই করুন , প্রতিটি ফলাফল একক লাইনে প্রদর্শিত হবে।

ব্যাখ্যা

"          % Input matrix (implicit). For each column 
  N        %   Number of elements in the stack
  ?        %   If nonzero (true for all iterations but the first)
    @2)    %     Push second element of current column: new index
    yn     %     Duplicate current buffer; push its number of elements
    \      %     Modulo
    Q      %     Add 1
    :&)    %     Split buffer at that point. This gives two pieces, one
           %     of which may be empty
    @1)    %     Push first element of current column: new value
    wv     %     Swap; concatenate all stack. This places the new value
           %     between the two pieces of the buffer
  }        %   Else (this is executed only in the first iteration)
    @1)    %     Push first element of current column: new value
           %   End (implicit)
           % End (implicit)
           % Display (implicit)

8

পার্ল, 37 বাইট

-lpপতাকাগুলির জন্য 35 বাইট কোড + 2 বাইট ।

splice@F,1+<>%(@F||1),0,$_}{$_="@F"

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

বাস্তবায়নটি বেশ সোজা এগিয়ে রয়েছে, সূচকে spliceঅ্যারেতে সন্নিবেশ করায় (দ্রষ্টব্য যে অ্যারের ক্ষেত্রে খালি থাকার বিষয়টি পরিচালনা করে)।@F1+<>%(@F||1)@F||1

(আপাতদৃষ্টিতে) তুলনাহীন ধনুর্বন্ধনী সম্পর্কে মাত্র কয়েকটি শব্দ }{(কারণ আমার এটি সম্পর্কে একটি মন্তব্য ছিল, এবং আমি মনে করি এটি পার্লকে চেনে না এমন লোকদের জন্য এটি বেশ অদ্ভুত), এবং এটি পার্ল গল্ফিংয়ের একটি সাধারণ সাধারণ কৌশল:
-pপতাকা কোডটিকে ঘিরে রেখেছে (মোটামুটি) দিয়ে while(<>){ CODE } continue { print }, ( continueপ্রতিটি পুনরাবৃত্তির পরে কার্যকর করা হয়)। অতুলনীয় এই মিলগুলির সাথে}{ , আমি আমার কোডটিতে পরিবর্তন করি while(<>) { CODE}{ } continue { print }। সুতরাং এটি আমার কোডের ঠিক পরে একটি ফাঁকা ব্লক তৈরি করে (তবে এটি কোনও সমস্যা নয়), এবং continueকেবলমাত্র একবার প্রয়োগ করা হবে while(যখন সমস্ত ইনপুটটি পড়েছে) after


3
এটি }{আমাকে বাদাম চালাচ্ছে ...
ETH প্রোডাকশনগুলি

@ ইথ প্রডাকশনগুলি আমি এটিতে অভ্যস্ত তবে আমি এটি অন্য লোকদের কাছে দেখাতে পছন্দ করি, তারা সর্বদা কিছু ভুল বলে মনে করে! :) (নেতিবাচক দিকটি আমার ইমাস ইনডেন্টেশনের সাথে আবদ্ধ হয় ..)
দাদা


হ্যা, আমি করেছিলাম. :-)
ডেনিস

5

ES6 (জাভাস্ক্রিপ্ট), 58,57,53, 50 বাইট

Golfed

a=>a.map((e,i)=>b.splice(1+e[1]%i,0,e[0]),b=[])&&b

ইনপুট হিসাবে সূচক-মান জোড়াগুলির একটি অ্যারে নেয়।

সম্পাদনাগুলি

  • &&মান ফেরত দিতে ব্যবহার করুন , -1 বাইট
  • সরানো |0(স্প্লাইস হিসাবে স্পষ্টতই NaN হ্যান্ডেল করতে পারে), -2 বাইট
  • () , -২ বাইট (THX @ETH প্রোডাকশন!) মানচিত্রেb=[] দ্বিতীয় "যুক্তি" তৈরি করেছেন
  • মানচিত্র () সূচক (i), -3 বাইট (Thx @ পেট্রিক রবার্টস!) দিয়ে b.leth প্রতিস্থাপন করা হয়েছে

পরীক্ষা

F=a=>a.map((e,i)=>b.splice(1+e[1]%i,0,e[0]),b=[])&&b

F([[11, 9], [13, 14]])
[ 11, 13 ]

F([[2, 29], [19, 30], [18, 17], [13, 3], [0, 21], [19, 19], [11, 13], [12, 31], [3, 25]])
[ 2, 13, 3, 11, 0, 12, 19, 18, 19 ]

1
ভাল লাগল, আমার পুনরাবৃত্ত পদ্ধতির চেষ্টা করা উচিত ছিল। আমি মনে করি আপনি করতে পারেনa=>a.map(e=>...,b=[])&&b
ETH প্রোডাকশনগুলি

2
পরিবর্তে এবং পরিবর্তে ব্যবহার করে e=>আপনি 3 বাইট বিয়োগ করতে পারেন(e,i)=>ib.length
প্যাট্রিক রবার্টস

@ পেট্রিকরোবার্টস এটি একটি দুর্দান্ত ধারণা! ধন্যবাদ !
জেপেলিন

5

হাস্কেল , 70 69 বাইট

b!(x,i)|b==[]=[x]|j<-1+i`mod`length b=take j b++x:drop j b
foldl(!)[]

এটি অনলাইন চেষ্টা করুন! ব্যবহার: foldl(!)[] [(1,5),(2,4),(3,7)]। একটি বাইট সংরক্ষিত হয়েছে @ নিমিকে ধন্যবাদ!

ব্যাখ্যা:

b!(x,i)                         -- b!(x,i) inserts x into list b at position i+1
 | b==[] = [x]                  -- if b is empty return the list with element x
 | j <- 1 + i `mod` length b    -- otherwise compute the overflow-save insertion index j
     = take j b ++ x : drop j b -- and return the first j elements of b + x + the rest of b
foldl(!)[]                      -- given a list [(1,2),(3,5),...], insert each element with function ! into the initially empty buffer

মডিউল গণনা ছাড়াই সমাধান: (90 বাইট)

f h t(x,-1)=h++x:t
f h[]p=f[]h p
f h(c:t)(x,i)=f(h++[c])t(x,i-1)
g((x,_):r)=foldl(f[])[x]r

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


j<-1+i`mod`length bএকটি বাইট সংরক্ষণ করে।
নিমি

4

পাইথন 2 , 64 62 58 56 বাইট

x=[]
for n,i in input():x[i%(len(x)or 1)+1:0]=n,
print x

2x বাইট বন্ধ করে গল্ফ করার জন্য @ এক্সনরকে ধন্যবাদ!

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


(len(x)or 1)দৈর্ঘ্যের সূচনা করার পরিবর্তে আপনি কি করতে পারেন ?
xnor

আরও খাটো উপায় খুঁজছি। উভয় len(x or[0])এবং -~len(x[1:])টাই।
xnor

4

পাইথন 2 , 62 60 বাইট

জোড়া তালিকা হিসাবে ইনপুট নেয়, ফলাফল মুদ্রণ। সম্পাদনা: ডেনিস আউটগল্ফড

b=[]
for x,y in input():b.insert(1+y%(len(b)or 1),x)
print b

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

এটি বেশ সহজ - ইনপুটটি দিয়ে লুপ করুন, আইটেমগুলিকে সঠিক জায়গায় serোকান এবং তারপরে ফলাফলটি মুদ্রণ করুন। কোন সূচকটি সন্নিবেশ করানো হবে তা সিদ্ধান্ত নিয়েছে 1+y%(len(b)or 1)or 1খালি তালিকার প্রান্তের কেসটি পরিচালনা করার সাথে এটি মডুলার ইনডেক্সিংয়ের মানক উপায় ।


3

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

f=([[q,r],...a],z=[])=>z.splice(r%z.length+1,0,q)+a?f(a,z):z

পরীক্ষার স্নিপেট


2

ভি , 38 40 35 বাইট

এই উত্তরটি তালিকার সংজ্ঞাটি বাঁকায় এবং সাধারণত আপনি তালিকার কারসাজির জন্য কোনও ভাষা ব্যবহার করেন না তবে [count]/{regex}আমি সম্প্রতি ভিতে যুক্ত করেছি যা ইনপুটটি গ্রহণ করা হয়েছিল [index] [num] [index] [num] ...এবং পছন্দ মতো ফিরে এসেছে [num] [num] [num]

Í ¨ä«© ½/¯ÜdÜ+òhea ±^
Hdd2xdG@"
X

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

2 লুকানো অক্ষরের জন্য হেক্সডাম্প:

00000000: cd20 a8e4 aba9 20bd 2faf dc64 dc2b f268  . .... ./..d.+.h
00000010: 6561 20b1 161b 5e0a 4864 6432 7864 4740  ea ...^.Hdd2xdG@
00000020: 220a 58                                  ".X

ব্যাখ্যা

কোডটি dG@"সমস্ত জোড় ফর্ম্যাট করে \d+ \d+যাতে একটি তালিকা 1 2 3 4 5 6 এর মত শেষ হয়

a 2^[^3/\d\+
hea 4^[^5/\d\+
hea 6^[^

এবং তারপরে নীচের dG@"মতো ভি কোড হিসাবে সেগুলি সমস্ত কার্যকর করে:

a 2^[                 | insert " 2" and return to command mode
     ^                | LOOP: go to the first number
      3/\d\+          | find the 3rd number (0 indexed)
h                     | move one character left
 e                    | go to the end of the next word
  a 4^[               | append " 4" and return to command mode
       ^5/\d\+        | basically the same as LOOP on, just with different numbers

কেবল বলছি, প্রতিদ্বন্দ্বিতামূলক অবস্থা কেবল সেই ভাষা বা ভাষার বৈশিষ্ট্যগুলির জন্য যা চ্যালেঞ্জের চেয়ে নতুন
ক্রিতিক্সিত লিথোস

আহ, আপনাকে ধন্যবাদ জানত না আমি এটি অনুসারে তৈরি করব
nmjcman101

2

পিএইচপি, 72 92 বাইট

for($b=[];++$i<$argc;)array_splice($b,$b?$argv[$i]%count($b)+1:0,0,$argv[++$i]);print_r($b);

কমান্ড লাইন আর্গুমেন্ট থেকে সমতল ইনপুট নেয়। সাথে চালাও -nr


আমি মোটামুটিভাবে নিশ্চিত জানি এই উত্তরটি অবৈধ: আমি একটি পেয়েছি Fatal error: Uncaught DivisionByZeroError: Modulo by zero, এটি স্থির করেছিলাম , তারপরে চেষ্টা করেছি 1 1 1 2 1 3এবং এর [1=>null]পরিবর্তে আউটপুট হিসাবে পেয়েছি[1,3,2]
user59178

এটি j+1পরে ting োকানোর চেয়ে ওভাররাইট করে j, না? 18 1 7 11 35 3 22 16=> এর [1,11,16]পরিবর্তে[1,11,16,3]
user59178

@ ব্যবহারকারী59178: ওহ আমি insertকীওয়ার্ডটি মিস করেছি । ধন্যবাদ; স্থির করেছি।
তিতাস

2

জাভা 7, 125 124 বাইট

import java.util.*;List z(int[]a){List r=new Stack();for(int i=0,q=a.length/2;i<q;)r.add(i<1?0:a[i+q]%i+1,a[i++]);return r;}

সূচকের পরে মানগুলির একটি সমতল তালিকা গ্রহণ করে। স্কোয়ার পরীক্ষার ক্ষেত্রে ইনপুট হবেnew int[] {1, 2, 3, 4, 5, 6, 7, 8, 1, 4, 9, 16, 25, 36, 49, 64}

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


1

গণিত, 62 বাইট

Fold[Insert[#,#2[[1]],Mod[Last@#2,Tr[1^#]]+2/.0/0->-1]&,{},#]&

প্রথম যুক্তির সাথে খাঁটি ফাংশনটি জোড়গুলির #তালিকা হবে বলে আশা করা হচ্ছে। খালি তালিকা দিয়ে শুরু করে, নিম্নলিখিত ফাংশনটির সাথে ইনপুট তালিকাটি {}ছেড়ে গেছে :Fold#

Insert[                                            Insert
       #,                                          into the first argument
         #2[[1]],                                  the first element of the second argument
                 Mod[                              at the position given by the modulus of
                     Last@#2,                      the second element of the second argument
                             Tr[1^#]               with respect to the length of the first argument
                                    ]+2            plus 2 (plus 1 to account for 1-indexing, plus 1 because we are inserting after that position)
                                       /.          then replace
                                         0/0       Indeterminate
                                            ->     with
                                              -1   negative 1
                                                ]& End of function


1

Clojure, 87 বাইট

#(reduce(fn[r[v i]](let[[b e](split-at(+(mod i(max(count r)1))1)r)](concat b[v]e)))[]%)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.