বি ইউ আমি ঠ ড্যান ই গুলি টি


30

চ্যালেঞ্জটি সহজ: একটি প্রোগ্রাম লিখুন বা একটি ফাংশন যা একটি সীমাবদ্ধ অ-নেতিবাচক পূর্ণসংখ্যা দেওয়া হলে, একটি নেস্টেড অ্যারের আউটপুট দেয়।

নিয়ম

  • আপনার কোড অবশ্যই প্রতিটি পূর্ণসংখ্যার 0 ≤≤ n << 31 31 এর জন্য একটি অনন্য বৈধ নেস্টেড অ্যারে উত্পাদন করতে হবে ।
  • 16 টি পর্যন্ত খোলা বন্ধনী সহ প্রতিটি সম্ভাব্য নেস্টেড অ্যারে এই ব্যাপ্তির মধ্যে আউটপুট করা আবশ্যক। (এর অর্থ এই নয় যে আপনার কোডটি 16 টিরও বেশি ওপেন বন্ধনীর সাথে নেস্টেড অ্যারে আউটপুট করতে পারে না))
  • আপনার কোডটি আসল অ্যারের পরিবর্তে নেস্টেড অ্যারের স্ট্রিং প্রতিনিধিত্ব করতে পারে (কমা দিয়ে বা ছাড়া)।

একটি সম্ভাব্য ম্যাপিং:

0 -> []
1 -> [[]]
2 -> [[[]]]
3 -> [[], []]
4 -> [[[[]]]]
5 -> [[[], []]]
6 -> [[[]], []]
7 -> [[], [[]]]
8 -> [[], [], []]
9 -> [[[[[]]]]]
etc.

স্কোরিং

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


কোন সময় / স্মৃতি বিধিনিষেধ আছে?
ডেনিস

@ ডেনিস 1 ঘন্টা কি সময়ের সীমাবদ্ধতার জন্য যুক্তিসঙ্গত বলে মনে হয়? স্মৃতির পক্ষে যুক্তিযুক্ত কিছুর আমার কোনও ধারণা নেই।
ETH প্রোডাকশনগুলি

সময়সীমা থাকলে স্মৃতি কোনও বড় বিষয় নয়। এক ঘন্টা খুব উদার মনে হয়। আমার কোডটি যথেষ্ট দ্রুত কিনা তা যাচাই করতে আমি পুরো ঘন্টা অপেক্ষা করতে চাই না।
ডেনিস

4
আমি কোন সময় সীমাবদ্ধতা পছন্দ করব। এটি মৌলিকত্বের জন্য আরও সুযোগ দেয়
টন হসপেল

2
@ টনহোপেল আপনি কমা ছাড়া আউটপুট পেতে পারেন। আমি অনুমান করি যে কোনও সময়ের সীমাবদ্ধতা ঠিক থাকবে না, যতক্ষণ না আপনি প্রমাণ করতে পারবেন যে আপনার প্রবেশ বৈধ।
ETH প্রোডাকশনস

উত্তর:


12

পাইথন 2.7, 172 149 124 118 বাইট

x=input();y="";z=0
for b in bin(x)[2+(x<1):]:y+="[]"[b<"1"];z+=b>"0"or-1;z+=99*(z<0)
print"["+(y,"[]"*(x+16))[z>0]+"]"

ব্যাখ্যা:

দ্বারা একটি bijection নির্ধারণ [1এবং ]0। বন্ধনীর কোন ব্যবস্থা তারপর একটি বাইনারি সংখ্যাকে এবং তদ্বিপরীত, উদাহরণস্বরূপ হিসেবে লেখা যেতে পারে [][]1010(10) এবং [[][]]110100(52)। 15 টি অবধি বন্ধনীর সমস্ত বৈধ বিন্যাস (মোট 30 টি বন্ধনী) 30 বিট (শীর্ষস্থানীয় জিরো উপেক্ষা করে) সহ সংখ্যার দ্বারা আচ্ছাদিত, যা সংখ্যায় 2 31 এর চেয়ে কম সংখ্যক ।

প্রথমটি লুপটি এই সক্ষমতাটির বিপরীত দেয়, একটি সংখ্যাটিকে বন্ধনীর বিন্যাসে রূপান্তর করে, যখন ব্যবস্থাটি বৈধ কিনা তা পরীক্ষা করে।

সংঘর্ষ এড়াতে অবৈধ বিন্যাসগুলি বন্ধনীগুলির দীর্ঘ ক্রম দ্বারা মুদ্রণ বিবৃতিতে প্রতিস্থাপন করা হয়। উদাহরণস্বরূপ 11(3) [[valid বৈধ নয় তাই আমরা পরিবর্তে 3 + 16 বন্ধনী সংযুক্ত করি। এটি নিশ্চিত করে যে সমস্ত ব্যবস্থা অনন্য।

নেস্টেড অ্যারে তৈরি করার জন্য ফলস্বরূপ ব্যবস্থা একটি বন্ধনী জুড়ে রাখা হয়, যাতে 1010(10) হয়ে যায় [[][]]এবং 110100(52) হয় [[[][]]]। অতিরিক্ত ওপেন বন্ধনীর অর্থ আমরা এখন 16 টি ওপেন বন্ধনীর সাহায্যে সমস্ত অ্যারে আবরণ করেছি।


নিম্নলিখিত প্রোগ্রামটি 16 টি বন্ধনী সহ একটি প্রদত্ত অ্যারের জন্য সংখ্যাটি বের করতে ব্যবহৃত হতে পারে।

s=raw_input();o="";
for c in s[1:-1]:
 if c=="[":o+="1"
 if c=="]":o+="0"
print int(o,2)

তিনি যখন "অনন্য" নির্দিষ্ট করেছেন তখন অপের অভিপ্রায়টির একটি দুর্দান্ত অপব্যবহার
টন হসপেল

এটা শুধু প্রতিভা। সাবাশ. (এবং একটি কমা-কম ফর্ম্যাট অনুমোদিত))
ইটিএইচ প্রোডাকশনস

12

পাইথন, 153 128 বাইট

s=l=0;r="";n=input()
for d in bin(n)[2:]*(n>0):c=d<"1";l=[l,s>1][c];r+="]"*c+(1-l*c)*"[";s+=1-c-l*c
print"["+r+"["*l+"]"*(s+l+1)

বাম থেকে ডানদিকে বাইনারি সংখ্যাগুলি দেখে আমরা নেস্টেড তালিকায় একটি নম্বর এনকে ম্যাপ করি । এই অ্যালগরিদম কেবল 2 32 এর চেয়ে কম নয় যে কোনও সংখ্যার জন্য কাজ করে ।

  1. বর্তমান বাইনারি সংখ্যাটি যদি 1, আউটপুট হয় [
  2. অন্যথায়, বন্ধনীগুলির ক্রম যদি আমরা এখনও অবধি আউটপুট করেছি একটি একক বন্ধনী বন্ধনী, আউটপুট দ্বারা ভারসাম্যহীন হয়ে উঠতে পারে ][
  3. অন্যথায়, বাইনারি সংখ্যা, আউটপুট এ এটি যদি শেষ 0 হয় ][
  4. অন্যথায় আউটপুট ]

অবশেষে, আমরা কোনও খোলা বন্ধনী বন্ধ করি।


5

চামচ , 63 বাইট (501 বিট)

000001001001001011001101001010011011111001010001000000101010
101101100110100101101001000101100010001000000100011000010000
000000000000001110111110010000001110110110010100100100100100
000110011010001000000110110000010000001010110011011011011001
000000011010010010010001000000111011011011101001001001000110
110110010100100101011001000100000011010001000000111011011001
010010010010010001101101101001000110110010110001101101101101
100100010001010010001010011011001000000011001101001001010010
000001100101001000111

এটি নিম্নলিখিত ব্রেনফাক প্রোগ্রামটি চামচিতে রূপান্তরিত হয়েছে:

-[+[+<]>>+]<+++.[->+>+<<]>>++>>,[>-[<->-----]+<+++[-<+<<.>>>>-<]>[-<<-[->+<]<<<[-]>>>>[-<+<<<+>>>>]<<.>>+<[>-]>[-<+<<.>>>>]<<>>]<,]<<<<[>.>.<<[-]]>>>+[-<.>]+

স্টিডিনে বাইনারিতে একটি পূর্ণসংখ্যা পড়েন এবং স্ট্ডিনে নেস্টেড তালিকা আউটপুট করে। শূন্য স্ট্রিং (কোনও সংখ্যা নেই) হিসাবে ইনপুট হওয়ার জন্য 0 প্রয়োজন এবং এর জন্য 8-বিট কোষ সহ একটি ব্রেইনফাক ইন্টারপ্রেটার প্রয়োজন। আমার পাইথনের উত্তর হিসাবে একই অ্যালগরিদম।

পঠনযোগ্য সংস্করণ:

-[+[+<]>>+]<+++.           push open bracket and print it
[->+>+<<]                  dup
>>++                       increment to close bracket

>>,[                       read input loop
    >-[<->-----]+<+++          subtract 48 and set up if/else
    [-                         if c == 1
        <+                         increment s
        <<.>>>                     output open bracket
    >-<]>[-<                   else
        <-[->+<]                   decrement and move s
        <<<[-]                     zero l
        >>>>[-<+<<<+>>>>]          l = s and restore s
        <<.>                       output close bracket
        >+<[>-]>[-                 if s == 0
            <+                         undo s decrement
            <<.                        output open bracket
        >>>>]<<
    >>]<
,]

<<<<[                      if l
    >.>.                   output pair
<<[-]]
>>>+[-<.>]                 output close bracket s+1 times

3
আমরা সম্প্রতি অন্য উত্তরে এই আলোচনাটি করেছি, এবং এমন কোনও আসল ইন্টিপ্লেটার নেই যা 63-বাইট ফাইল হ্যান্ডেল করতে সক্ষম। রেফারেন্স প্রয়োগকরণ 0x30 এবং 0x31 বাইট ব্যবহার করেছে, সুতরাং এই উত্তরের জন্য 501 বাইট ফাইলের প্রয়োজন হবে।
ডেনিস

5

জেলি , 28 বাইট

ḃ2-*µSN;+\>-Ạ
1Ç#Ṫḃ2ṭ2;1ị⁾][

এটি অক্ষরের সমস্ত স্ট্রিংগুলিতে পুনরাবৃত্তি করে [এবং ]এটি a দিয়ে শুরু হয় [এবং একটি দিয়ে শেষ হয় ], বন্ধনীগুলি মেলে কিনা তা যাচাই করে এবং n ম্যাচটি মুদ্রণ করে ।

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


5

পার্ল, 80 79 বাইট

আবার orlp ব্যবহার করে এর অ্যালগরিদম আমি প্রথম পরীক্ষা করেছিলাম এটি কার্যকর হয় কিনা ...

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

এসটিডিনে ইনপুট নম্বর দিন

nest.pl <<< 8

nest.pl:

#!/usr/bin/perl -p
($_=sprintf"%b",$_).=2x(s^.^$&or++$n-pos&&/.0/g?++$n%1:$`&&21^eg-$n);y;102;();

লিনাসের সমাধানটি পার্লে 64 বাইট:

#!/usr/bin/perl -p
$_=sprintf"%b",/.+/g;$_=10x($&&&$&+16)if!/^(1(?1)*0)+$/;y;10;()

ডেনিসের সমাধানটি 59 বাইট পার্ল (বড় সংখ্যার জন্য ক্রমশ ধীর):

#!/usr/bin/perl -p
1while$_-=(sprintf"%b",$n++)=~/^(1(?1)*0)+$/;$_=$&;y;10;()

আমার মনে হচ্ছে আপনার এটিকে মাত্র 65 বাইট হিসাবে স্কোর করা উচিত (এটি আসলে 64 নয়)?
লিনাস

1
@ লিনাস আপনার নিয়মকানুন উজ্জ্বল এবং এর সমস্ত অগ্রযাত্রার দাবিদার হওয়ার পরেও আমি এটিকে কিছুটা প্রতারণা বলে বিবেচনা করি। স্কোর করার -pজন্য 1 টি অতিরিক্ত বাইট হিসাবে গণনা করা হচ্ছে
টন হসপেল

5

পাইথন 3, 120 114 বাইট

def f(n,k=0):
 while~n:
  k+=1
  try:r=eval(bin(k).translate({48:'],',49:'['})[3:-1])+[];n-=1
  except:0
 print(r)

আইডিয়নে এটি পরীক্ষা করুন ।

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

সংজ্ঞায়িত ফাংশন f ইনপুট এন নেয় এবং কে- কে 0 এ আরম্ভ করে । আমরা বৈধ আউটপুটে কে এর ফলাফলের n + 1 মান অবধি না হওয়া পর্যন্ত কে বাড়িয়ে দেব । প্রতিটি সময় আমরা এমন একটি মান এটি , এন decremented হয় একবার এটি ছুঁয়েছে -1 , ~nউৎপাদ 0 , এবং তালিকা যে শেষ মান যা অনুরূপ ছাপা হয়।

ইতিবাচক পূর্ণসংখ্যা থেকে নেস্টেড তালিকাগুলিতে আংশিক ম্যাপিং (যেমন, কে ↦ আর ) দ্বিপাক্ষিক হতে হবে, তবে অন্য কোনও বাধা নেই। এই উত্তরে ব্যবহৃত একটি নিম্নরূপে পরিচালনা করে।

  1. রূপান্তর সঙ্গে চোখে পড়ার মত, একটি বাইনারি স্ট্রিং প্রতিনিধিত্বের 0b

    উদাহরণস্বরূপ, 44 ↦ "0b101100"

  2. স্ট্রিং উপস্থাপনায় স্ট্রিং উপস্থাপনায় সমস্ত 0 এর (কোড পয়েন্ট 48 ) প্রতিস্থাপন করুন "]," এবং সমস্ত 1 এর (কোড পয়েন্ট) 49 ) দিয়ে [

    উদাহরণ স্বরূপ, "0b101100" ↦ "], বি [], [[],],"

  3. প্রথম তিনটি অক্ষর (তারা "0 বি" এর সাথে সঙ্গতিপূর্ণ ) এবং পেছনের চরিত্রটি (আশা একটি কমা) মুছে ফেলুন ।

    উদাহরণ স্বরূপ, "], খ [], [[],]," ↦ "[], [[],]"

  4. উত্পন্ন কোড মূল্যায়নের চেষ্টা করুন। এর ফলে যদি কোনও ত্রুটি হয়, কে কোনও তালিকায় ম্যাপ করা হয় না।

    উদাহরণস্বরূপ, "[], [[]]]" ↦ ([]], [[]]

  5. ফলাফলটি (যদি থাকে তবে) খালি তালিকার সাথে সংঘবদ্ধ করুন। যদি এটির কোনও ত্রুটি হয় কে কোনও তালিকায় ম্যাপ করা হয় না।

    উদাহরণস্বরূপ, ([[], [[]]) + [] ত্রুটিগুলি যেহেতু + তালিকাগুলি এবং টিপলসকে একত্রিত করতে পারে না।


4

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

p 1=["[]"]
p n=['[':h++t|k<-[1..n-1],h<-p k,_:t<-p$n-k]
((p=<<[1..])!!)

আকার দ্বারা বাছাই করা সমস্ত নেস্টেড অ্যারেগুলির একটি তালিকাতে শেষ লাইন সূচকের মূল ফাংশন open সুতরাং, আকারের সমস্ত অ্যারে 16 টি প্রথমে তালিকাভুক্ত।

প্রথমে কোডটি ভাল এবং খাটো হিসাবে দেখা যাক, তবে হাস্কেলের টাইপচেকার এটি মানতে অস্বীকার করলেন।

p 1=[[]]
p n=[h:t|k<-[1..n-1],h<-p k,t<-p$n-k]
((p=<<[1..])!!)

ফাংশন pইনপুটের nআকার সব নেস্টেড অ্যারে একটি তালিকা দেয় n(খোলা বন্ধনী)। এটি পুনরাবৃত্তভাবে করা হয়। এই জাতীয় প্রতিটি অ্যারে hআকারের কিছু মাথা (প্রথম সদস্য) এবং আকারের kকিছু লেজ t(অন্যান্য সদস্য) n-k, উভয় আকারের নঞ্জেরো থাকে। বা, এটি আকারের খালি অ্যারেn==1

অভিব্যক্তিটি আকার অনুসারে বাছাই করা সমস্ত অ্যারেগুলির একক অসীম তালিকায় p=<<[1..]ফ্ল্যাট p(1), p(2), ...করে

[ [], [[]], [[],[]], [[[]]], [[],[],[]], [[],[[]]], [[[]],[]], [[[],[]]], ...

এবং এটিতে মূল ফাংশন সূচকগুলি।

... বা, যদি হাস্কেল "অসীম প্রকার: টি ing [টি]" লেখার বিষয়ে কৌতুক না করে থাকে would হাস্কেল উপরের অসীম তালিকার প্রতিনিধিত্ব করতে পারে না যার উপাদানগুলি নির্বিচারে নেস্টেড অ্যারে রয়েছে। এর সমস্ত উপাদানের অবশ্যই একই ধরণের থাকতে হবে, তবে একটি টাইপ টি টির তালিকার মতো হতে পারে না। আসলে, ফাংশনp নিজেই নির্ভরশীল টাইপিং ছাড়াই একটি সামঞ্জস্যপূর্ণ টাইপ বরাদ্দ করা যায় না, যা হাস্কেলের অভাব।

সুতরাং পরিবর্তে আমরা বন্ধনীগুলির স্ট্রিংগুলিতে কাজ করি এবং অভিনয়গুলি [এবং ]চরিত্রগুলি দিয়ে কনস অপারেশন সিমুলেট করি । এটি অতিরিক্ত 9 বাইট লাগে কোনও প্রকার-সুরক্ষিত ভাষায় গল্ফের বিপদ।


3

হাস্কেল, 87 82 বাইট

0#0=[""]
n#m=['[':x|n>0,x<-(n-1)#m]++[']':x|n<m,x<-n#(m-1)]
(([0..]>>= \y->y#y)!!)

অ্যারে উপাদানগুলি আউটপুট করে। ব্যবহারের উদাহরণ: (([0..]>>= \y->y#y)!!) 3-> "[][]"

ফাংশন #সমস্ত নেস্টেড অ্যারেগুলি nওপেন এবং mক্লোজেন্ট বন্ধনীর জন্য স্ট্রিং হিসাবে তৈরি করে , প্রতিটি কতটি অবশিষ্ট রয়েছে তা ট্র্যাক করে। সর্বদা শুরু হয় n == m। প্রধান ফাংশন y # yপ্রত্যেকের জন্য কল করে y <- [0,1,...]এবং ইনপুট দ্বারা প্রদত্ত সূচকে উপাদানটি চয়ন করে।


2

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

O`@BEqXJYs0&)0>w~hA+tG>~]x92J-c

এটি অনলাইন চেষ্টা করুন! অথবা প্রথম কয়েকটি পরীক্ষার কেস যাচাই করুন (কয়েক সেকেন্ড সময় নেয়)।

উত্পাদিত ম্যাপিংটি হ'ল:

0 -> []
1 -> [[]]
2 -> [[][]]
3 -> [[[]]]
4 -> [[][][]]
5 -> [[][[]]]
6 -> [[[]][]]
7 -> [[[][]]]
...

ব্যাখ্যা

কোড বর্ধমান বাইনারি সংখ্যা পরীক্ষা করে রাখে, সংখ্যার সাথে 0প্রতিস্থাপন করে -1; যে, ব্যবহার 1এবং-1 সংখ্যার হিসাবে। অঙ্ক 1উপস্থাপন করবে '['এবং -1উপস্থাপন করবে ']'

প্রোগ্রাম গণনা করা পর্যন্ত এন +1 বৈধ নম্বর প্রাপ্ত । নিম্নলিখিত দুটি শর্ত যদি ধরে রাখে তবে একটি সংখ্যা বৈধ:

  1. অঙ্কের যোগফল শূন্য (যে, এখানে একটি সমান সংখ্যা 1এবং -1)
  2. সংখ্যার সমষ্টিগত যোগফল সর্বদা ধনাত্মক হয় (যা সংখ্যার সঞ্চিত হয়) 1 সংখ্যার সংখ্যা সর্বদা এর চেয়ে বেশি থাকে -1) শেষ ব্যতীত (যেখানে এটি শর্ত 1 দিয়ে শূন্য হয়)।

একবার এন +1 টি বৈধ সংখ্যাগুলি প্রাপ্ত হয়ে গেলে , শেষটি পরিবর্তন করে প্রতিলিপি করা হয়1 হয় [এবং এর -1মধ্যে হয় ]এবং তারপরে এটি প্রদর্শিত হয়।

কোড:

O          % Push 0: initial count of valid numbers
`          % Do...while
  @        %   Push iteretation index k, starting at 1
  B        %   Convert to binary. For example, k=6 gives [1 1 0 0]
  Eq       %   Multiply by 2, subtract 1: transforms [1 1 0 0] into [1 1 -1 -1]
  XJ       %   Copy that to clipboard J, without popping it
  Ys       %   Cumulative sum: gives [1 2 1 0]
  0&)      %   Split array into its final element and the rest. Gives 0, [1 2 1]
  0>       %   Yields 1 for positive entries (condition 2). So in this case it
           %   gives [1 1 1]
  w        %   Swap: moves second-top element in the stack (0 in this case) to top
  ~        %   Negate: yields 1 if input is 0 (condition 1). Gives 1 in this case
  h        %   Concatenate horizontally. Gives [1 1 1 1]
  A        %   All: gives 1 if all elements are 1. Gives 1 in this case, meaning
           %   that this k is valid
  +        %   Add the result (0 or 1) to the count of valid numbers
  t        %   Duplicate
  G        %   Push input n
  >~       %   Loop condition: false (exit loop) if count exceeds input n
]          % End loop. At this point the result is in clipboard J, in 1/-1 format
x          % Delete count
92         % Push 92. Will be used to convert 1, -1 to '[', ']' (ASCII 91, 93)
J          % Push result in 1/-1 format
-          % Subtract: converts 1 to 91, -1 to 93
c          % Convert to char. Implicitly display
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.