এটা অামরা যেভাবে তালিকা করি


18

পিট বিভিন্ন কারণে একটি আকর্ষণীয় প্রোগ্রামিং ভাষা। আজ আমরা একটি কারণে মনোনিবেশ করব: রোল কমান্ড। রোল কমান্ডটি মূলত পোস্টস্ক্রিপ্ট থেকে এসেছিল এবং স্ট্যাকটি সামাল দেওয়ার একটি শক্তিশালী উপায়।

রোল কমান্ড স্ট্যাকের শীর্ষ দুটি উপাদান পপ করে এবং সেগুলি পরামিতি হিসাবে ব্যবহার করে। আমরা প্রথম মানটিকে পপড turnsএবং দ্বিতীয়টি বলব depth। গভীরতা n এ পরিবর্তন স্ট্যাকের শীর্ষতম উপাদানটি নেবে, এটিকে স্ট্যাকের নবম উপাদান তৈরি করবে এবং এর উপরে প্রতিটি উপাদানকে একটি করে উপরে নিয়ে যাবে। যদি turns নেতিবাচক হয় তবে এটি বিপরীত দিকে করা হয়। অর্থাত, নবম উপাদানটি শীর্ষে সরানো হয় এবং অন্যান্য উপাদানগুলি নীচে সরানো হয়। এটি বার abs(turns)বার হয়।

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা স্ট্যাকের মধ্যে লাগে এবং রোল কার্যকর করার পরে সেই স্ট্যাকটি ফেরত দেয়।

বিধি

  • ইনপুট এবং আউটপুট একটি তালিকা, অ্যারে, একটি ডিলিমিটারের সাথে স্ট্রিং, একবারে একটি উপাদানে বা অন্য কোনও যুক্তিসঙ্গত বিন্যাসে থাকতে পারে। আউটপুট অবশ্যই ইনপুট হিসাবে একই ফর্ম্যাটে থাকতে হবে।
  • depth কখনও নেতিবাচক হবে না এবং স্ট্যাকের দৈর্ঘ্যের চেয়ে বড় কখনও হবে না।
  • ইনপুট স্ট্যাকটিতে সর্বদা কমপক্ষে দুটি উপাদান থাকবে।
  • এটি তাই প্রতিটি ভাষার সংক্ষিপ্ত উত্তর জিততে পারে। এর মতো, আমি কোনও উত্তর গ্রহণ করব না।
  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।

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

in:  out:
2    
4    
1    3
2    4
3    1
4    2
5    5
6    6

in:  out:
-2   
3
1    2
2    3
3    1

in:  out:
-42
0
1    1
2    2
3    3
4    4
5    5

2
প্রতিটি ভাষায় সংক্ষিপ্ত উত্তর জিততে পারে , এটি [কোড-গল্ফ] কীভাবে কাজ করে না তা নয়। সংক্ষিপ্ত উত্তর জয়। সময়কাল।
mbomb007


7
আমি খুব হতাশ হয়ে পড়েছিলাম যে এটি কোনওভাবেই রিক রোলিংয়ের সাথে জড়িত ছিল না
ক্রিস্টোফার

2
@ mbomb007 আমি ট্যাগ বিবরণে বা মেটাতে একটি তাত্ক্ষণিক অনুসন্ধানে দেখতে পাচ্ছি না তাই আমি মনে করি না এটি কেস।
মাইক বুফার্দেসি

2
@ mbomb007 আপনি যদি আমাকে এটি পরিবর্তন করতে চান তবে দয়া করে "আপনি ভুল এবং আমি ঠিক আছি" না বলে ওপরে কিছু যুক্তি সরবরাহ করুন। এর নজির রয়েছে, যা আপনি বরখাস্ত করেছেন এবং কোথাও বলা হয়নি যে চ্যালেঞ্জগুলির জন্য ঠিক একজন বিজয়ী প্রয়োজন বা একটি উত্তর অবশ্যই গ্রহণ করতে হবে।
মাইক বুফার্দেসি

উত্তর:


8

হাস্কেল , 62৪ 62 বাইট

সম্পাদনা: -২ বাইট: @ এক্সনর এমন কিছু দেখেছিলেন যা সম্পর্কে আমি ভুল ভেবেছিলাম।

rInts এর একটি তালিকা গ্রহণ করে এবং ফেরত দেয় ।

r(t:d:l)|d<1=l|(x,y)<-d%l,(z,w)<-mod t d%x=w++z++y
(%)=splitAt

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

splitAt n llসূচকে একটি তালিকা বিভক্ত করে , বিভাগের বাকী অংশ গণনা করে n, তালিকাকে সম্মতি জানায়।mod++


1
আমি মনে করি আপনি (%)=splitAtইনফিক্স সংজ্ঞায়িত করে 2 বাইট কাটতে পারেন ।
xnor

@ এক্সনর ওহ, আমি কোনওভাবে নিজেকে নিশ্চিত করেছিলাম যে কাজ করবে না
জোহানসেন

8

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

(t,d,...a)=>a.splice(t=(t%d+d)%d,d-t).concat(a)

সম্পাদনা করুন: স্ট্যাক উপাদানগুলিকে পৃথক প্যারামিটার হিসাবে গ্রহণ করে @ শ্যাগ্গিকে ধন্যবাদ 2 বাইট সংরক্ষণিত। ব্যাখ্যা:

  • যখন পালা গভীরতার একাধিক হয় তখন কিছুই হয় না। প্রথম পদক্ষেপটি মোড়কে গভীরতার গণনা করা। যেহেতু জাভাস্ক্রিপ্টটি কেবলমাত্র অবশিষ্ট গণনা করতে জানে, আমাকে এটি দুটি ধাপে করতে হবে।
  • 1উপরের উপাদানটিকে উপাদানের দিকে নিয়ে যায় একটি পালা depth2শীর্ষস্থানীয় দুটি উপাদান ইত্যাদির পালা ইত্যাদি However তবে, আপনি মোড় এবং গভীরতার মধ্যে উপাদানগুলি সামনের দিকে সরিয়েও এটি অর্জন করতে পারেন। spliceএই উপাদানগুলি সরিয়ে দেয় এবং concatএগুলিকে বাকী উপাদানগুলিতে সংশোধন করে। (এটি একই দৈর্ঘ্যের হিসাবে পরিবর্তে আমি একটি অ্যারে বোঝাপড়া ব্যবহার করতে পারতাম))
  • বিপরীতে slice, দ্বিতীয় প্যারামিটারটি spliceঅপসারণের উপাদানগুলির সংখ্যা।

নয় (t%d+d)%dহিসাবে একই t%d?
লুক

@ লুক না, %বাকি আছে, তাই এটি নেতিবাচক হলে একটি নেতিবাচক উত্তর দেয় t
নীল

(t,d,...a)=>নিয়ম হিসাবে একবারে কোনও উপাদানকে ইনপুটটি পাস করার অনুমতি হিসাবে আপনি 2 বাইট সংরক্ষণ করতে পারেন ।
শেগি

@ শেগি ধন্যবাদ, আমি এটি লক্ষ্য করিনি।
নীল

7

সিজেম, 31 বাইট

)\):N@\,0a|={NW*1$1$>)\+@@<\+}*

ইনপুট এবং আউটপুট স্ট্যাকের অ্যারেগুলি রয়েছে, শেষ উপাদানটি স্ট্যাকের শীর্ষের প্রতিনিধিত্ব করে।

স্ট্যাক ট্রেস:

                   e# Stack:                [6 5 4 3 2 1 4 2]
)                  e# Take out first value: [6 5 4 3 2 1 4] 2
\                  e# Swap:                 2 [6 5 4 3 2 1 4]
)                  e# Take out first value: 2 [6 5 4 3 2 1] 4
:N                 e# Store in N:           2 [6 5 4 3 2 1] 4; N=4
@                  e# Rotate:               [6 5 4 3 2 1] 4 2
\                  e# Swap:                 [6 5 4 3 2 1] 2 4
,                  e# Range:                [6 5 4 3 2 1] 2 [0 1 2 3]
0                  e# Push 0:               [6 5 4 3 2 1] 2 [0 1 2 3] 0
a                  e# Wrap in array:        [6 5 4 3 2 1] 2 [0 1 2 3] [0]
|                  e# Logical or:           [6 5 4 3 2 1] 2 [0 1 2 3]
                   e# (This will replace an empty array with [0] to handle a special case of n=0)
=                  e# Get array value:      [6 5 4 3 2 1] 2
{NW*1$1$>)\+@@<\+} e# Push block:           [6 5 4 3 2 1] 2 {NW*1$1$>)\+@@<\+}
*                  e# Preform n times:      [6 5 4 3 2 1]
  N                e# Push N:               [6 5 4 3 2 1] 4
  W*               e# Negate:               [6 5 4 3 2 1] -4
  1$               e# Copy element 1 back:  [6 5 4 3 2 1] -4 [6 5 4 3 2 1]
  1$               e# Copy element 1 back:  [6 5 4 3 2 1] -4 [6 5 4 3 2 1] -4
  >                e# Slice a[-4:]          [6 5 4 3 2 1] -4 [4 3 2 1]
  )                e# Take first value:     [6 5 4 3 2 1] -4 [4 3 2] 1
  \                e# Swap:                 [6 5 4 3 2 1] -4 1 [4 3 2]
  +                e# Append:               [6 5 4 3 2 1] -4 [1 4 3 2]
  @@               e# Rotate twice:         [1 4 3 2] [6 5 4 3 2 1] -4
  <                e# Slice a[:-4]:         [1 4 3 2] [6 5]
  \                e# Swap:                 [6 5] [1 4 3 2]
  +                e# Append:               [6 5 1 4 3 2]
e# Preform the block again:                 [6 5 2 1 4 3]

6

গণিত, 58 50 বাইট

সম্পাদনা করুন: 8 বাইট সংরক্ষণের জন্য মার্টিন ইন্ডারকে ধন্যবাদ

Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&

ব্যাখ্যা:

খাঁটি ফাংশন যা তালিকার শুরুতে স্ট্যাকের শীর্ষকে উপস্থাপন করে এমন একটি তালিকা প্রত্যাশা করে। আমরা তালিকার উপাদানগুলিকে খাঁটি ফাংশনে পাস করি Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&xতৃতীয় আর্গুমেন্ট দিয়ে শুরু হওয়া উপাদানগুলির অনুক্রমকে সেট করা হয়। তারপরে আমরা প্রথম #2(দ্বিতীয় যুক্তি) উপাদানগুলির xবাম দিকে #(প্রথম যুক্তি) বার ঘোরান , তারপরে Joinঅবশিষ্ট উপাদানগুলি x

এটি কেবলমাত্র 3প্রাথমিকভাবে তালিকায় না থাকার চেয়ে সরাসরি ফাংশনটিতে যুক্তি হিসাবে স্ট্যাক উপাদানগুলি পাস করলে এটি বাইটগুলি বাঁচাতে পারে তবে ইনপুট এবং আউটপুট ফর্ম্যাটগুলি মেলে না।

আসল সমাধান:

#/.{t_,d_,x___}:>{x}~Take~d~RotateLeft~t~Join~Drop[{x},d]&

ইনফিক্স ফাংশনগুলির এই শৃঙ্খলা সম্পর্কে সত্যই সন্তোষজনক কিছু রয়েছে। প্রথম উপাদানটিকে tদ্বিতীয় উপাদান dএবং দ্বিতীয় উপাদানগুলির xসাথে বাম বারের প্রথম dউপাদানগুলি ঘোরানো এবং এর অবশিষ্ট উপাদানগুলিতে যোগদানের ফলাফলের সাথে একটি তালিকা প্রতিস্থাপন করে ।{x}t{x}


1
নিস! ±প্রতিস্থাপনের নিয়মের এক বাইট উপসর্গ ফাংশন ইনসেটেড এবং আরও 1 বাইট TakeDropনিম্নরূপে কাজে লাগিয়ে আপনি 3 বাইট সংরক্ষণ করতে পারেন : ±{t_,d_,x___}:=#~RotateLeft~t~Join~#2&@@{x}~TakeDrop~d
গ্রেগ মার্টিন

আমি শুধু গ্রেগ হিসাবে একই জিনিস মন্তব্য করতে যাচ্ছিলাম, কিন্তু আপনি আসলে এমনকি আরও খাটো যেতে পারেন। হয় একটি নামবিহীন ভেরিয়াদিক ফাংশন করুন (যদিও এটি খানিকটা দুস্কর কারণ এটি ইনপুট নেয় ...&[1, 1, 3, 4]এবং ফিরে আসে {3, 4}বা Applyশুরুতে ম্যানুয়ালি এটি করে: Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&(কেবল স্পষ্ট করে বলতে গেলে আমার প্রথম পরামর্শটি বাদ দেয় @@#&))
মার্টিন এেন্ডার

5

রুবি, 40 বাইট

x=->s{n,d,*s=s;s[0,d]=s[0,d].rotate n;s}

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

ইনপুটটিকে তালিকা হিসাবে নেয়, একটি তালিকা দেয় returns একটি অন্তর্নির্মিত rotateবিদ্যমান যা উভয় ধনাত্মক এবং নেতিবাচক ঘূর্ণন পরিচালনা করতে পারে তা তুচ্ছ করে তোলে।


5

পাইথন, 141 98 87 74 বাইট

11 কোট সংরক্ষিত @ কোল ধন্যবাদ

def f(s):*s,d,t=s;n=len(s)-d;return s*0**d or s[:n]+s[-t%d-d:]+s[n:-t%d-d]

তালিকা হিসাবে ইনপুট গ্রহণ করে, যেখানে সর্বশেষ উপাদানটি স্ট্যাকের শীর্ষ।

শূন্য-গভীরতা এবং পাইথনের সাইন-অ্যাডজাস্টিং মডুলো অপারেটরটিকে কাটা-কাটা হতে হবে তালিকার অংশটি নির্ধারণ করতে 0ⁿ টি কৌশল ব্যবহার করে।


শুধু নেবে না কেন f(s,t,d)?
কোল

@ কোল আনপ্যাক করার জন্য ধন্যবাদ! তবে, আপনি কী বোঝাতে চেয়েছিলেন তা আমি দেখতে পাচ্ছি না f(s,t,d)(ইনপুটটি সম্পূর্ণ স্ট্যাক)।
ইউরিয়েল

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

আপনি এর সাথে 1 বাইট সংরক্ষণ করতে পারেন r=-t%d-d। এছাড়াও, প্রতিস্থাপন s*0**dসঙ্গে s*(d<1)বাইট গণনা বজায় রাখে কিন্তু হয়তো পাঠযোগ্যতা (না যে লক্ষ্য) উন্নত। 0**0==1পাইথনে যদিও আমি জানতাম না , এটি মজাদার।
বেন ফ্রাঙ্কেল

@BenFrankel আমি করতে পারেন সংরক্ষণ -t%d-dএকটি মান হিসাবে (যেমন আমি আগে করেনি), কারণ যখন dহয় 0এই একটি বিভাগ-বাই-শূন্য ব্যতিক্রম আরম্ভ হবে।
ইউরিয়েল

3

জাভাস্ক্রিপ্ট ES6, 109 92 বাইট

x=>{for(i=x.shift(),i=i>0?i:-i,j=x.shift();i-->0&&j>0;)x=x.splice(j,1).concat(x);return x}

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

পূর্ণসংখ্যার অ্যারের আকারে ইনপুট গ্রহণ করে।
তীর গণনাও রয়েছে: পি

ব্যাখ্যা:

তালিকার প্রথম দুটি উপাদান নিষ্কাশন করতে কোডটি শিফট ফাংশনটি ব্যবহার করে।

এরপরে এটি প্রথম উপাদানের পরম মান পায় যা টার্নের সংখ্যা।

জাভাস্ক্রিপ্ট যেহেতু শূন্য সূচকযুক্ত তাই গভীরতা সূচকটি 1 দ্বারা হ্রাস করা দরকার।

যদি গভীরতা সূচক 0 বা 1 হয় তবে কিছুই পরিবর্তন করা উচিত নয়, তবে হ্রাসের কারণে 0 সূচক পরিবর্তনের কারণ হতে পারে। সুতরাং গভীরতা সূচক <= 0 না হলে লুপটি প্রস্থান করুন।

স্প্লাইস (ক, খ) ফাংশন অ্যারে থেকে সূচক এ সূচকের সাথে দৈর্ঘ্যের খের উপ-অ্যারেটি দেয় এবং সেই উপাদানগুলি ছাড়াই মূল অ্যারে ছেড়ে দেয়।

যখন মূল অ্যারের বাকী অংশের সাথে সংমিশ্রিত হয়, এটি গভীরতার সূচীতে অ্যারের একক আবর্তন।

এই ক্রিয়াকলাপকে এন বার সম্পাদন করে, যেখানে এন টার্নের সংখ্যা, ফলস্বরূপ অ্যারেটি রোল অপারেটরের ফলাফল।



2

টিআই-বেসিক, 141 150 বাইট (নন-কেপটিং)

Prompt L1
L1(1→T
L1(2→D
seq(L1(C),C,3,dim(L1→L1
If TD>0
Then
For(A,1,T
L1(1→B
For(C,2,D
L1(C→L1(C–1
End
B→L1(D
End
End
If TD<0
Then
For(A,1,-T
L1(D→B
For(C,D,2,-1
L1(C–1→L1(C
End
B→L1(1
End
End
L1

সম্পাদনা করুন: স্থির কেস যেখানে গভীরতা শূন্য (+9 বাইট)

টিআই-বেসিক 0-দৈর্ঘ্যের তালিকাগুলি সমর্থন করে না, সুতরাং এই পদ্ধতিটি দুটি দৈর্ঘ্যের ইনপুটটির জন্য কাজ করবে না।

ব্যাখ্যা:

Prompt L1                # 4 bytes, input list
L1(1→T                   # 7 bytes, turns
L1(2→D                   # 7 bytes, depth
seq(L1(C),C,3,dim(L1→L1   # 18 bytes, remove turns and depth from list
If TD>0                  # 6 bytes, if turns is positive and depth is nonzero (can't be negative)
Then                     # 2 bytes
For(A,1,T                # 7 bytes, do this 'turns' times
L1(1→B                    # 7 bytes, backup the first item
For(C,2,D                # 7 bytes, shuffle the rest along
L1(C→L1(C–1               # 12 bytes
End                      # 2 bytes
B→L1(D                   # 7 bytes, restore the backup to where it should be
End                      # 2 bytes
End                      # 2 bytes
If TD<0                  # 6 bytes, if T is negative and D is nonzero
Then                     # 2 bytes
For(A,1,-T               # 8 bytes, do this -'turns' times
L1(D→B                   # 7 bytes, backup the Dth item
For(C,D,2,-1             # 10 bytes, shuffle the items the other way
L1(C–1→L1(C              # 12 bytes
End                      # 2 bytes
B→L1(1                   # 7 bytes, restore backup to where it belongs
End                      # 2 bytes
End                      # 2 bytes
L1                       # 2 bytes, implicitly return

আমি মনে করি আপনারও 2-উপাদান তালিকা তালিকার জন্য কোড দরকার; বর্তমানে এটি ত্রুটি করবে seq(
lirtosiast

1

ব্যাচ, 163 বাইট

@set s=
@set r=
@set/ad=%2,t=(%1%%d+d)%%d
:l
@shift
@set/af=t-=1,f^^=d-=1
@if %f% lss 0 (set r=%r% %2)else set s=%s% %2
@if not "%3"=="" goto l
@echo%r%%s%

কমান্ড-লাইন প্যারামিটার হিসাবে ইনপুট নেয় এবং একটি স্থান-বিচ্ছিন্ন তালিকা আউটপুট দেয়। মধ্যে পরামিতি tএবং dমধ্যে নিষ্কাশিত হয় r, যাতে তারা আগে লেখা যাবে পরিবর্তনশীল sপরিবর্তনশীল, যাতে অন্যান্য পরামিতি সব পায়।

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