কীভাবে পৃথিবীতে llhuii পাইপনের 42 বাইটে এভিল নাম্বার আউটপুট দেয়?


71

অরাজক গল্ফের এভিল নাম্বার প্রশ্ন সম্পর্কিত পাইথনে গল্ফ করার জন্য এটি একটি টিপস প্রশ্ন ।

এর বাইনারি সম্প্রসারণের 1 এর সংখ্যার সংখ্যা থাকলে একটি সংখ্যাটি খারাপ । চ্যালেঞ্জটি হ'ল প্রথম 400 টি অশুভ সংখ্যা 0,3,5,...,795,797,798, প্রতি লাইনে একটি মুদ্রণ করা ।

পাইথন 2 সাবমিশনগুলি 42-বাইট সমাধান সহ llhuii দ্বারা পরিচালিত হয়। পরবর্তী সেরাটি হ'ল মিচগুলি দ্বারা 46 বাইট, তারপরে পাঁচটি 47-বাইট জমা দেওয়া। দেখে মনে হচ্ছে যে llhuii সত্যিই একটি যাদুকর পেয়েছে যা 2 বছরেরও বেশি সময় ধরে বহু শক্তিশালী পাইথন গল্ফারকে বাদ দিয়েছে। 4 বা 5 বাইট সংরক্ষণ করা যেমন একটি সংক্ষিপ্ত গল্ফের জন্য বিশাল।

পাইথন টেবিল 2 স্কোর

আমি এখনও 47 বাইট এ আছি আমি আশা করছি আমরা একটি সম্প্রদায় হিসাবে এই ধাঁধাটি ক্র্যাক করতে পারি। যদি আমরা সম্মিলিতভাবে উত্তর পাই, আমি এটি অবদানকারী প্রত্যেকের নামে জমা দেব। এই প্রশ্নের উত্তর একটি টুকরো কোড বা নতুন ধারণা বা বিশ্লেষণের একটি অংশ হতে পারে। আপনি যদি llhuii হয়, দয়া করে এটি এখনও আমাদের জন্য লুণ্ঠন করবেন না।

যদিও জমাগুলি প্রকাশিত হয় নি কারণ এই সমস্যাটি অন্তহীন, তবে আমাদের কিছু লিড দেওয়া হয়েছে। বিজয়ী সাবমিশনটি চালানোর জন্য 0.1699 সেকেন্ড সময় নিয়েছে, অন্যের তুলনায় অনেক বেশি দীর্ঘ, একটি অদৃশ্য পদ্ধতির পরামর্শ দেয়। বাইট পরিসংখ্যান থেকে, 42 টি অক্ষরের মধ্যে 23 টি বর্ণানুক্রমিক [0-9A-Za-z]এবং 19 টি ASCII প্রতীক। এর অর্থ llhuii এর দ্রবণের কোনও সাদা জায়গা নেই।

ভাষা ড্রপডাউন থেকে পাইথন বেছে নিতে বা কোনও ফাইল আপলোড করে আপনি সমস্যার পৃষ্ঠাতে আপনার কোডটি পরীক্ষা করতে পারেন .py। মনে রাখবেন যে:

  • পাইথন 2.7 ব্যবহৃত হয়
  • আপনার কোড অবশ্যই একটি পূর্ণ প্রোগ্রাম হতে পারে যা মুদ্রণ করে
  • মতো এই সমস্যার কোনও ইনপুট নেই
  • আপনার প্রোগ্রামটি কেবল 400 মান হিসাবে দেওয়া মুদ্রণ করতে হবে, এমনকি যদি এটি বৃহত্তর মানগুলিতে বিভক্ত হয়
  • প্রোগ্রামগুলি চালাতে 2 সেকেন্ড সময় রয়েছে
  • প্রোগ্রামগুলি ত্রুটি সহ শেষ হতে পারে
  • আপনি ব্যবহার করতে পারেন exec; "এক্সিকিউট অস্বীকৃত" শেল এক্সিকিউটকে বোঝায়

2
এটি লক্ষণীয়ও উপযুক্ত হতে পারে যে এই অনুক্রমগুলি "থু-মর্স সিকোয়েন্স এ010060 এর শূন্যের সূচকগুলি।" (উত্স: oeis )
ও'ব্রায়েন

উত্তর:


51

এটি llhuii এর মত একই সমাধান নয়, তবে এটি 42 বাইট দীর্ঘ।

n=0;exec'print n;n^=(n^n+2)%3/2;n+=2;'*400

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

@ জোনাথনফ্রেচকে ধন্যবাদ, আমরা এখন ৪০ বাইটে আছি

n=0;exec'print n;n=n+2^(n^n+2)/2%3;'*400

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

মোট 39 টির জন্য আর একটি বাইট সংরক্ষণ করতে হবে।

n=0;exec'print n;n=n+2^-(n^n+2)%3;'*400

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


1
কৌতূহলের বাইরে, আপনি কীভাবে জানবেন যে 42-বাইট সংস্করণটি llhuii এর মত নয়? (আমি কখনই অরাজক গল্ফে অংশ নিইনি)
লুইস মেন্ডো

6
@ লুইসমেন্দো স্ট্যাটিস্টিকস ট্যাবে 23 বর্ণমালিক বাইট এবং 19 এএসসিআইআই চিহ্নগুলি তালিকাভুক্ত করা হয়েছে, যাতে কোনও সাদা জায়গা নেই। Llhuii না লিখে print+nতাদের সমাধান অবশ্যই আমার থেকে আলাদা হতে হবে।
ডেনিস

আহ, যাতে আপনি কোডটি না জানলেও কিছু তথ্য পেতে পারেন। ওটা সুন্দর. ধন্যবাদ!
লুইস মেন্ডো

আপনি কি মনে করেন 38 এর সুযোগ আছে? তত্ত্ব এ সম্ভাব্য স্বাধীনতা কিছু ডিগ্রী অপসারণ আছে -সঙ্গে নাড়াচাড়া দ্বারা চিহ্ন print~nবা print-nএবং ব্যবহার &বা ~, যদিও আমি কাজ করতে কিছু পাইনি। এছাড়াও, n=0;exec"print n;d=n^n+2;n^=d^-d%3;"*400সুন্দর তবে 40 বাইট।
xnor

print-nসম্ভবনা সেখানে সেট বিট মধ্যে কোন সহজ সম্পর্ক নেই nএবং -nprint~nতত্ত্বের ক্ষেত্রে আরও প্রতিশ্রুতিবদ্ধ শোনায় তবে এই পদ্ধতির সাথে আমি 40 বাইটের নিচে পেতে পারি না।
ডেনিস

28

39 বাইট পাচ্ছেন

আমি কীভাবে 39-বাইট সমাধান পেয়েছিলাম তার ব্যাখ্যা, যা ডেনিস এবং জনাথন ফ্রেচ পৃথকভাবে খুঁজে পেয়েছিল। অথবা, বরং এটি ব্যাখ্যা করে যে কীভাবে কেউ উত্তরকে দৃষ্টিনন্দন করে পৌঁছে দিতে পারে, এমনভাবে এটি আমার সত্যিকারের পথের চেয়ে অনেক সুন্দর, এটি জঞ্জাল যুক্তি এবং মৃত প্রান্তে পূর্ণ ছিল।

n=0
exec"print n;n=n+2^-(n+2^n)%3;"*400

এটিকে কিছুটা কম গল্ফযুক্ত এবং আরও বেশি প্যারেন দিয়ে লিখতে দেখে মনে হচ্ছে:

n=0
for _ in range(400):
  print n
  n=(n+2)^(-((n+2)^n))%3

বিট সমতা

আমরা আমার 47-বাইট সমাধানটি ফর্মের সমস্ত সংখ্যার আউটপুট থেকে একটি ধারণা দিয়ে শুরু করি n=2*k+bযেখানে kশীর্ষে রয়েছে 0,1,...,399এবং bএটি একটি সমতা বিট যা সামগ্রিক সংখ্যাকে 1 এর সমান করে তোলে।

চল লিখি par(x)জন্য বিট সমতা এর x, XOR (যে ^) এ বিট সব x। এটি যদি 1-বিটগুলির একটি সংখ্যক সংখ্যা হয় (সংখ্যাটি মন্দ হয়), এবং 1-বিটগুলির মধ্যে একটি বিজোড় সংখ্যা রয়েছে তবে 1 এটি। কারণ n=2*k+b, আমাদের রয়েছে par(n) = par(k)^bতাই মন্দ অর্জনের জন্য par(n)==0আমাদের প্রয়োজন পূর্ববর্তী বিটগুলির সামান্য সমতা হওয়া b=par(k)lastn

Golfing এ আমার প্রথম প্রচেষ্টা প্রকাশ ছিল par(k), প্রথম সরাসরি সঙ্গে bin(k).count('1')%2সঙ্গে, এবং তারপর বিট ম্যানিপুলেশন

সমতা আপডেট

তবুও, একটি সংক্ষিপ্ত প্রকাশ বলে মনে হচ্ছে না। পরিবর্তে, এটি বুঝতে সাহায্য করে যে কাজ করার জন্য আরও তথ্য রয়েছে। কেবলমাত্র বর্তমান সংখ্যার বিট সমতা গণনা করার চেয়ে,

k  ---->  par(k)

হিসাবে আমরা বাড়ায় আমরা বিট সমতা আপডেট করতে পারেন kথেকে k+1

k   ---->  par(k)
      |
      v
k+1 ---->  par(k+1)

এটি হ'ল যেহেতু আমরা গণনা করছি k=0,1,2,..., প্রতিবার স্ক্র্যাচ থেকে এটি গণনা করার পরিবর্তে আমাদের কেবল বর্তমান বিট সমতা বজায় রাখা দরকার need বিট সমতা আপডেট par(k+1)^par(k)থেকে যাচ্ছে ফ্লিপ বিট সংখ্যা সমতা হয় kথেকে k+1, যে হয় par((k+1)^k)

par(k+1) ^ par(k) = par((k+1)^k)
par(k+1) = par(k) ^ par((k+1)^k)

এর ফর্ম (k+1)^k

এখন আমাদের গণনা করা দরকার par((k+1)^k)। দেখে মনে হতে পারে আমরা আর কোথাও না পেয়েছি কারণ কম্পিউটিং বিট প্যারিটি হ'ল আমরা সমাধান করার চেষ্টা করছি exactly তবে, সংখ্যাগুলি (k+1)^kফর্ম হিসাবে প্রকাশিত 1,3,7,15,.., এটি 2 এর শক্তির নীচে, একটি বিট হ্যাকগুলিতে প্রায়শই ব্যবহৃত হয় । আসুন দেখা যাক কেন।

যখন আমরা বৃদ্ধি করি k, বাইনারি বহনের প্রভাবটি সর্বশেষ 0এবং সমস্তকে 1তার ডানদিকে উল্টানো হয় , 0যদি কিছুই না থাকে তবে একটি নতুন নেতৃত্ব তৈরি করে । উদাহরণস্বরূপ, নিনk=43=0b101011

      **
  101011  (43)
 +     1
  ------
= 101100  (44)

  101011  (43)
 ^101100  (44)
  ------
= 000111  (77)   

বহনকারী কলামগুলির সাথে চিহ্নিত করা হয়েছে *। এই একটি আছে 1একটি পরিবর্তন 0এবং একটি বহন বিট পাস 1, যা পর্যন্ত এটি একটি হিট বাম প্রচারের রাখে 0মধ্যে k, যা পরিবর্তিত 1। বাম দিকে আরও বিটগুলি প্রভাবিত হয় না। সুতরাং যখন k^(k+1)চেক যা বিট পদের অদল বদল kকরার k+1, এটা ডানদিকে অবস্থিত অবস্থানের খুঁজে বের করে 0এবং 1তার ডান দিকে 'র। অর্থাৎ পরিবর্তিত বিটগুলি প্রত্যয় গঠন করে, সুতরাং ফলাফলটি এক বা একাধিক 1 এর পরে হয়। শীর্ষস্থানীয় শূন্যগুলি ব্যতীত, বাইনারি সংখ্যা রয়েছে 1, 11, 111, 1111, ...যা 2 এর শক্তির নীচে এক।

কম্পিউটিং par((k+1)^k)

এখন যে আমরা বুঝতে পারি যে (k+1)^kএটি সীমাবদ্ধ 1,3,7,15,..., আসুন এই জাতীয় সংখ্যার বিট প্যারিটি গণনা করার একটি উপায় খুঁজে বের করুন find এখানে, একটি দরকারী তথ্য যেহেতু এবং এর মধ্যে 1,2,4,8,16,...বিকল্প মডুলু । সুতরাং, গ্রহণ মডিউল দেয় , ঠিক তাদের বিট দলগুলো যা। পারফেক্ট!3122==-1 mod 31,3,7,15,31,63...31,0,1,0,1,0...

সুতরাং, আমরা par(k+1) = par(k) ^ par((k+1)^k)হিসাবে আপডেট করতে পারেন

par(k+1) = par(k) ^ ((k+1)^k)%3

bভেরিয়েবল হিসাবে ব্যবহার করে আমরা প্যারিটি স্টোর করছি, দেখতে এটির মতো লাগে

b^=((k+1)^k)%3

কোড লেখা

এটিকে কোডে একসাথে রেখে আমরা শুরু করি kএবং bউভয় ক্ষেত্রে সমতা বিট করি 0, তারপরে বারবার মুদ্রণ n=2*k+bএবং আপডেট b=b^((k+1)^k)%3এবং k=k+1

46 বাইট

k=b=0
exec"print 2*k+b;b^=(k+1^k)%3;k+=1;"*400

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

আমরা প্রায় ডান বন্ধনী মুছে k+1মধ্যে ((k+1)^k)%3কারণ পাইথন প্রাধান্য প্রথম যাহাই হউক না কেন, অদ্ভুত যেমন দেখায় উপরন্তু আছে।

কোড উন্নতি

আমরা একক ভেরিয়েবলের সাথে সরাসরি কাজ করে n=2*k+bএবং তার উপর সরাসরি আপডেটগুলি সম্পাদন করে আমরা আরও ভাল করতে পারি । এর k+=1সাথে সঙ্গতিপূর্ণ n+=2। এবং, আপডেট করার b^=(k+1^k)%3সাথে সম্পর্কিত n^=(k+1^k)%3। এখানে, k=n/2আপডেট করার আগে n

44 বাইট

n=0
exec"print n;n^=(n/2+1^n/2)%3;n+=2;"*400

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

আমরা নতুন করে লিখে সংক্ষিপ্ত করতে পারি n/2+1^n/2(এটি মনে রাখবেন (n/2+1)^n/2)

n/2+1 ^ n/2
(n+2)/2 ^ n/2
(n+2 ^ n)/2    

যেহেতু /2শেষ বিটটি সরিয়ে ফেলা হয়েছে, তাই আমরা জোর-ইন করার আগে বা পরে এটি করি কিনা তা বিবেচ্য নয়। সুতরাং, আমরা আছে n^=(n+2^n)/2%3। আমরা লক্ষ করেন, মডিউল দ্বারা অন্য বাইট সংরক্ষণ করতে পারবেন 3, /2সমতূল্য *2সমতূল্য -, তিনি উল্লেখ করেছেন n+2^nতাই বিভাজন মেঝে ছাড়া প্রকৃত halving হয়। এই দেয়n^=-(n+2^n)%3

41 বাইট

n=0
exec"print n;n^=-(n+2^n)%3;n+=2;"*400

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

পরিশেষে, আমরা অপারেশন একত্রিত করতে পারেন n^=c;n+=2মধ্যে n=(n+2)^c, যেখানে cএকটি বিট। এটি কাজ করে কারণ ^cকেবল সর্বশেষ বিটটিতে কাজ করে এবং শেষ বিটের +2কোনও যত্ন করে না তাই অপারেশনগুলি যাত্রা শুরু করে। আবার, প্রাধান্য আমাদের প্যারেনস বাদ দিতে এবং লিখতে দেয় n=n+2^c

39 বাইট

n=0
exec"print n;n=n+2^-(n+2^n)%3;"*400

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


13

এটি আমার (xnor's) 47-বাইট সমাধান এবং চিন্তাভাবনা দেয় যা আমাকে এটির দিকে নিয়ে যায়। আপনি নিজেই এটি বের করতে চাইলে এটি পড়বেন না।

একটি প্রাকৃতিক প্রথম ধারণাটি 0 থেকে 799 নম্বরের মাধ্যমে পুনরাবৃত্তি হয়, কেবল বাইনারিতে 1 এর একটিও সংখ্যার সাথে কেবল তাদের মুদ্রণ করা।

52 বাইট

for n in range(800):
 if~bin(n).count('1')%2:print n

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

এখানে, ~বিটটি পরিপূরক হিসাবে গ্রহণ করে যাতে even<->oddগণিতে স্যুইচ করতে এবং কেবল এমনকি গণনাগুলিতে সত্যবাদী মান দেয়।

ফিল্টারিংয়ের পরিবর্তে সমস্ত মান তৈরি করে আমরা এই পদ্ধতিটি উন্নত করতে পারি। লক্ষ্য করুন যে আউটপুট মানগুলি 0 থেকে 399 নম্বরগুলি, প্রতিটি বিট সংখ্যার সমান করতে কিছুটা সংযোজন করে।

0 = 2*0 + 0
3 = 2*1 + 1
5 = 2*2 + 1
6 = 2*3 + 0
...

সুতরাং, nতম সংখ্যা হয় হয় 2*n+bহয় b=0বা সঙ্গে হয় b=1। বিট bবেড়ে চলেছে পাওয়া যাবে 1এর বিট 's nএবং অন্য COUNT মডিউল 2 গ্রহণ।

49 বাইট

for n in range(400):print 2*n+bin(n).count('1')%2

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

আমরা 2 বাইট কেটে যাবে 2*উপর iterating দ্বারা 0,2,4,..., যা না সুযোগ গণনা করে 1এর। আমরা exec400 বার সঞ্চালিত লুপ ব্যবহার করে এবং nপ্রতিটি লুপ 2 টি বাড়িয়ে এটি করতে পারি ।

47 বাইট

n=0;exec"print n+bin(n).count('1')%2;n+=2;"*400

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

এবং, এটি আমার 47-বাইট সমাধান। আমি সন্দেহ করি তবে অন্যান্য 47-বাইট সমাধানগুলি একই নয়।


1
আপনার 47 বাইট দীর্ঘ- execঅনুমোদন অনুমোদিত?
জোনাথন ফ্রেচ

1
@ জোনাথানফ্রেচ হ্যাঁ, পৃষ্ঠাটি "এক্সিকিউটেডকে অস্বীকার করা হয়েছে" বললে এটি পাইথনের নয় execবরং কমান্ড লাইনের উল্লেখ করে exec
xnor

9

llhuii এর পাইথন 3 জমা দেওয়া

লেখার সময় এভিল নাম্বারের জন্য পাইথন 3 জমা দেওয়া এখানে:

এখানে চিত্র বর্ণনা লিখুন

llhuii সম্ভবত তাদের কৌশলটি পাইথন 3 এ পোর্ট করেছে এবং এটি একটি সমাধান নিয়ে এসেছিল

  • পাইথন 2 সমাধানের চেয়ে 3 বাইট দীর্ঘ এবং longer
  • 45 - (25 + 18) = সাদা বাক্সের 2 বাইট রয়েছে।

আক্ষরিক অর্থে পাইনের 3 xnor এর 47B পোর্টিং, আমরা এই 50 বি পাই:

n=0;exec("print(n+bin(n).count('1')%2);n+=2;"*400)

আমি হিসাবে এটি জমা ppcg(xnor)। (এটিতে প্রথম বন্ধনী যুক্ত হয়েছে execএবং printএটি এখন কার্যকরী)) এটির পাইথন 3 টি উত্তরগুলির পৃথক কোডের পরিসংখ্যান রয়েছে, যার সকলেরই কিছু পরিমাণ সাদা অংশ রয়েছে। মজাদার!

যদিও এটি পুনরায় লেখার জন্য একটি ছোট্ট উপায় রয়েছে ( execপাইথন 3 এ তার প্রতিযোগিতামূলক প্রান্ত হারাতে পারে):

n=0
while n<800:print(n+bin(n).count('1')%2);n+=2

এটি 49 বাইট। আমি হিসাবে এটি জমা ppcg(xnor,alternative)। এই দুটি লাইটের উত্তর মত সাদা বাক্সে আছে! এটি আমাকে বিশ্বাস করতে পরিচালিত করে যে llhuii এর পাইথন 3 উত্তরটি দেখতে বেশ ভালো লাগে (নিউলাইন, তারপরে একটি whileলুপ So) সুতরাং llhuii সম্ভবত আমাদের মতো execপাইথন 2 এবং whileপাইথন 3 এ ব্যবহৃত হয়েছিল ; এটি হোয়াইটস্পেসের স্বতন্ত্রতা ব্যাখ্যা করে।


আমাদের 47 বি পাইথন 3 এ 49 বিতে পরিণত হয়েছিল, এখন কী মজার বিষয়, এখন যে llhuii এর 42B 44B হয় নি, এটি 45 বি হয়েছে! Llhuii এর সমাধান সম্পর্কে কিছু পাইথন 3-তে এক বাইট অতিরিক্ত লাগে This এর অর্থ বিভিন্ন জিনিস হতে পারে।

  • প্রথম যে বিষয়টি মনে আসে তা হ'ল বিভাজন : সম্ভবত llhuii /পাইথন 2 এ ব্যবহার করে যা //পাইথন 3 এ পরিণত হয়েছিল ((তারা যদি আমাদের মতো দু'জনের মধ্যে গণনা করে থাকে তবে এক মুহূর্তে ডানদিকে ফিরে n/2যেতে ব্যবহৃত হতে পারে n?)

  • অন্য যে জিনিসটি মনে আসে তা হ'ল প্রিন্টের পরে অ্যানারি অপারেটরগুলি । আমাদের print blahহয়ে উঠেছে print(blah)(1 বাইট অতিরিক্ত), তবে llhuii print~-blahপাইথন 2 এর মতো কিছু লিখলে এটি print(~-blah)পাইথন 3-এ পরিণত হত ।

  • হতে পারে অন্য ধারণা আছে। আমাকে বুঝতে দাও.

এখন আমার সহ সকল পাই 3 সমাধানের কোডের পরিসংখ্যান:

এখানে চিত্র বর্ণনা লিখুন


1
আমি আকর্ষণীয় মনে করি যে তাদের পাইথন 3 সমাধানটি পাইথন 2 সমাধানের তুলনায় উল্লেখযোগ্যভাবে দ্রুত। হয় তারা পাইথন কিছু বৈশিষ্ট্য ব্যবহার করছে যা পাইথন 3 এ আরও দক্ষ হয়ে উঠেছে বা এটি সর্বোপরি কোনও সাধারণ বন্দর নয় (সম্ভবত তারা পাইথন 3 সমাধান খুঁজে পেয়েছিল যা প্রত্যক্ষ পোর্টের চেয়ে কম হবে)।
জোনাথন ফ্রেচ

2
আনগোলের রানটাইমগুলির বিশাল বৈচিত্র রয়েছে, আমি ওপিতে মন্তব্য করেছি যে এখানে llhuii এর রানটাইম আমাকে ভাবায় যে তাদের পাই 2 রানটাইমটি কেবল একটি লাল রঙের হারিং / আউটলেটর
লিন

এছাড়াও, আমি ধরে নিয়েছি যে xnor একটি খুব অনুরূপ কৌশল পেয়েছে এবং এটিতে উন্নত হয়েছে ( দুষ্ট সংখ্যা প্রিন্ট করার পক্ষে এমন অনেক উপায় থাকতে পারে না , তাই?) এবং তাদের সমাধানটি যথেষ্ট দ্রুত!
লিন

7

অন্যান্য পন্থা

1) A001969 এর জন্য একটি সূত্র ব্যবহার করা

বাইনারি রূপান্তর করার পরিবর্তে, নিম্নলিখিত সূত্র ( ওইআইএস থেকে ) এর সুবিধা নেওয়া সম্ভব হতে পারে :

a(1) = 0
for n > 1: a(n) = 3*n-3-a(n/2) if n is even
           a(n) = a((n+1)/2)+n-1 if n is odd

আমি পাইথনের গল্ফ করার সময় খুব খারাপ, তাই আমি চেষ্টাও করতে যাচ্ছি না। তবে এখানে জেএসের একটি দ্রুত প্রচেষ্টা।

এনবি: আমি মনে করি না যে এটি বৈধ জেএস জমা হবে কারণ এটি প্রদর্শন না করে কেবল একটি অ্যারে পূরণ করছে। এবং তবুও এটি বর্তমান সেরা জেএস সলিউশন (যা 45 বাইট) এর চেয়ে 5 বাইট দীর্ঘ। তবে এখানে যেভাবে কথা হয় তা নয়।

for(a=[n=0,3];n<199;)a.push(2*++n+a[n],6*n+3-a[n])

আশা করি এটি কিছুটা অনুপ্রেরণা জাগাতে পারে।

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

2) প্রতিস্থাপনের সাথে থু-মুরস ক্রম তৈরি করা

তত্ত্বীয়ভাবে, এই কোডটি কাজ করা উচিত:

n=0;a="1";b="0";exec"t=a;a+=b;b+=t;print(int(b[n]))+n;n+=2;"*400

এটি অনলাইন চেষ্টা করুন! (চলমান সংস্করণ 20 টি শর্তে সীমাবদ্ধ)

এটি থিউ-মুর্স ক্রমকে একটানা বিকল্পের সাথে গণনা করে এবং একই লুপে 1 এর (এভিল নাম্বার) অবস্থানের সন্ধান করে।

কিন্তু:

  • এটি বর্তমান রূপে অনেক দীর্ঘ
  • এটি দ্রুত একটি স্মৃতি ওভারফ্লো বাড়ে

3) বিটওয়াইজ অপারেশন দিয়ে থু-মুরস ক্রম তৈরি করা

থি-মোর্স ক্রম সম্পর্কিত উইকিপিডিয়াটির সরাসরি সংজ্ঞা থেকে শুরু করে , আমি এই অ্যালগরিদমে এসেছি (জেএসে ফিরে যাচ্ছি ... দুঃখিত):

for(e=n=0;n<799;)(e^=!(((x=n++^n)^x/2)&170))||console.log(n)

যেখানে আমরা সিকোয়েন্সের বর্তমান দুষ্টতা ট্র্যাক করি এবং বাইটে বিজোড় বিটের বিটমাস্ক হিসাবে 170 ব্যবহার করি ।


আমি একটি পুনরাবৃত্ত ফাংশনের ধারণাটি পছন্দ করি তবে পাইথন বয়লারপ্লেটের জন্য এটি খুব খারাপ f=lambda n:_ for n in range(400):print f(n)already ইতোমধ্যে 43 বাইট নেয়। নিজেই রেফারেন্স তৈরি করে বা ভবিষ্যতের উপাদানগুলিকে শেষের দিকে যুক্ত করে এমন একটি অ্যারে তৈরি করে পুনরাবৃত্তি অনুকরণ করার উপায় রয়েছে।
xnor

2
এছাড়াও, llhuii এর সমাধান, তাতে কোন শূন্যস্থান রয়েছে তাই তিনি ব্যবহার করেননি def, for, while, lambda(ক প্যারামিটার কমপক্ষে), ইত্যাদি
স্টিফেন

@ স্টেফেনের মতো কিছু করার while~0:print~1জন্য কোনও জায়গার প্রয়োজন হয় না।
জোনাথন ফ্রেচ

পদ্ধতি 3 নম্বরে, ((x=n++^n)^x/2)কিছুটা ভারবস মনে হচ্ছে কেবল সর্বনিম্ন সেট বিটটি খুঁজে পেতে। পুরো গণ্ডগোল প্রতিস্থাপন করা যেতে পারে ++n&-nএটি অনলাইন চেষ্টা করুন!
প্রিমো

@ প্রিমো আমি এখানে কী ভাবছিলাম এবং কীভাবে আমি এই জটিল সূত্রে এসেছি সে সম্পর্কে আমার কোনও ধারণা নেই। ¯ \ _ (ツ) _ / ¯
আর্নৌল্ড

5

নেস্টেড কাউন্টারগুলির পদ্ধতির

আমার কাছে একটি ভিন্ন পদ্ধতির ধারণা রয়েছে, তবে পাইথন গল্ফিংয়ের ক্ষেত্রে আমার যথেষ্ট অভিজ্ঞতা নেই, তাই গল্ফিংয়ের জন্য আর একটি সম্ভাব্য সূচনা স্থান হিসাবে বিবেচিত হওয়ার জন্য আপনার ছেলেরা এখানে রেখে দেব।

অবারিত ধারণা:

n=0
i=1
for _ in"01":
 i^=1
 for _ in"01":
  i^=1
  for _ in"01":
   i^=1
   for _ in"01":
    i^=1
    for _ in"01":
     i^=1
     for _ in"01":
      i^=1
      for _ in"01":
       i^=1
       for _ in"01":
        i^=1
        for _ in"01":
          i^=1
          if n<800:print i+n
          n+=2

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

গভীরতা নীচে নয় স্তরের, সমস্ত লুপ একই, তাই আমার মনে এগুলি দ্বারা নির্মিত করা উচিত exec"something"*9+"deepest stuff"। অনুশীলনে আমি জানি না চক্রের সাথে এই জাতীয় কিছু করা সম্ভব কিনা।

গল্ফ করার জন্য বিবেচনা করার বিষয়গুলি:

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

  • এখানে আরও ভাল বিকল্প হতে পারে if n<800:, যা এখানে প্রয়োজন কারণ অন্যথায় আমরা দু'টি 10 ​​ডলার পর্যন্ত দুষ্ট সংখ্যা মুদ্রণ করতে থাকি



লুপগুলির জন্য নেস্টেডের পরিবর্তে নেস্টেড তালিকা বোঝার চেষ্টা করবেন?
স্পার

@ স্প্পার তখন সমস্যাটি আসলে সংখ্যাগুলি প্রিন্ট করা। পাইথন 2- printতে একটি বিবৃতি, কোনও ফাংশন নয় এবং এটি কোনও উপলব্ধির ভিতরে উপস্থিত হতে পারে না।
জোনাথন ফ্রেচ

হতে পারেprint '\n'.join([[[[[[[[[foo]foo]foo]foo]foo]foo]foo]foo]foo])
স্পার

@ স্পার তারপরে সমস্যাটি তালিকা সমতল করার মধ্যে রয়েছে; str.joinকেবল স্ট্রিংযুক্ত তালিকাগুলিতে কাজ করে এবং অতিরিক্ত তালিকার অক্ষরগুলি মুদ্রণ করা উচিত নয়। একা ফর্ম্যাট করা একটি গুরুত্বপূর্ণ পরিমাণ বাইট নিতে হবে take
জোনাথন ফ্রেচ

5

আইডিয়া: সংক্ষিপ্ত বিট সমতা

bin(n).count('1')%2বিট-কাউন্টের সমতাটি গুণতে অনেকগুলি অক্ষর লাগে takes সম্ভবত একটি গাণিতিক উপায় সংক্ষিপ্ত, বিশেষত সীমিত দৈর্ঘ্যের দেওয়া given

একটি সুন্দর একই দৈর্ঘ্যের উপায় হ'ল int(bin(n)[2:],3)%2বাইনারি মানকে বেস 3(বা কোনও বিজোড় বেস) হিসাবে ব্যাখ্যা করে । দুর্ভাগ্যক্রমে, 4 টি বাইট 0bউপসর্গটি সরিয়ে ব্যয় করছে । এটি কাজ করে int(bin(n)[2:])%9%2

এক্সওর ব্যবহার করে বিটের সংমিশ্রণে আরেকটি ধারণা আসে। যদি nবাইনারি প্রতিনিধিত্ব থাকে abcdefghi, তবে

n/16 = abcde
n%16 =  fghi

r = n/16 ^ n%16 has binary representation (a)(b^f)(c^g)(d^h)(e^i)

সুতরাং, r=n/16^n%16মন্দ যদি মন্দ হয় এবং কেবল যদি nমন্দ হয়। আমরা তখন পুনরায় রিপিট করতে পারেন যে s=r/4^r%4, একটি মান sমধ্যে 0,1,2,3, যার মধ্যে 1এবং 2মন্দ, সঙ্গে checkable নয় 0<s<3

52 বাইট

n=0;exec"r=n/16^n%16;print(0<r/4^r%4<3)+n;n+=2;"*400

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

এটি আর একটি ভাল চুক্তি পরিণত। সংখ্যাটি কীভাবে বিভক্ত করবেন, চূড়ান্ত নম্বরটি কীভাবে চেক করবেন (সম্ভবত কিছুটা-ভিত্তিক লুক টেবিল) তা দেখতে অনেকগুলি নকব রয়েছে। আমি সন্দেহ করি এগুলি কেবল এতদূর যেতে পারে।


এটি to_bytesপূর্ণসংখ্যার ফাংশনটি ব্যবহার করার সম্ভাবনা কি হবে ? আমি সন্দেহ করি তবে বিবেচনা করার মতো কিছু :)
হাইপারনিউটারিনো

@ হাইপারনিউট্রিনো আমার কাছে মনে হয় কেবল পাইথন 3?
xnor

হ্যাঁ আমার খারাপ: / রিপ
হাইপারনিউটারিনো

9
কেবলমাত্র ব্যবহার 0b: int(bin(n),13)%2! : ডি
নুডল 9

3
অগ্রগতি! নুডল 9 এর কৌশলটি একটি 44-বাইট সমাধান সরবরাহ করে:n=0;exec"print~int(bin(n),13)%2+n;n+=2;"*400
লিন

4

নির্মাণ দ্বারা, n+n^nসবসময়ই খারাপ, কিন্তু আমার দরিদ্র পাইথন দক্ষতা কেবলমাত্র 61-বাইট সমাধানের সাথে আসতে পারে:

for n in sorted(map(lambda n:n+n^n,range(512)))[:400]:print n

5 বাইট বাঁচানোর জন্য @ পিলনরায়েজ এবং 1 বাইট সংরক্ষণের জন্য মিঃ এক্সএক্সকোডারকে ধন্যবাদ:

for n in sorted(n^n*2for n in range(512))[:400]:print n

55 বাইট : for n in sorted(n^n*2for n in range(512))[:400]:print nn+n^nহিসাবে একইn^n*2
মিস্টার এক্সকোডার

3

আইডিয়া: A006068 ("ক (এন) হল গ্রে কোডড এন তে")

সমস্ত 2n XOR nকৌতূহল বাছাই করার বিষয়ে নীলের ধারণাটি আমাকে উত্সাহিত করেছিল, তাই আমি এই সাজানোর পিছনে সূচকগুলি সন্ধান করার চেষ্টা করেছি। আমি এই কোডটি লিখেছি এবং এটি প্রকাশ করে যে আমরা এরকম কিছু লিখতে পারি:

for n in range(400):x=a(n);print 2*x^x

a(n)A006068 (এন) কোথায় । এটি অনলাইন চেষ্টা করুন!

যাইহোক, এটি ধরে নিয়েছে আমাদের কাছে A006068 গণনা করার কিছু সংক্ষিপ্ত পথ রয়েছে। এটি ইতিমধ্যে 38 বাইট, ধরে নিলাম আমরা এটি 4 বাইটে ( a(n)অংশ) গণনা করতে পারি । আসল বাস্তবায়ন (টিআইও হেডারে) এর চেয়ে অনেক বেশি দীর্ঘ। আমি মনে করি এটির জন্য খুব বেশি আশা করি না।


3

আইডিয়া: এক্সওর উপর হ্রাস করুন

যদি আপনি nএকসাথে সমস্ত বিটগুলি XOR করেন তবে এটি 0মন্দ এবং অশুভের 1জন্য। আপনি এটি একটি পুনরাবৃত্ত ফাংশন (যা আরও বেশি সময় নিয়েছে?) দিয়ে এটি করতে পারেন, যেমন:

f=lambda n:f(n/2^n&1)if n>1else-~-n

এটি মন্দ হিসাবে 1 প্রদান করে।

এটি 35 বাইট এবং কোনও সংখ্যাটি খারাপ কিনা তা যাচাই করে। দুর্ভাগ্যক্রমে, filterইতিমধ্যে 6 বাইট হয় তাই এটি সর্বোত্তম সমাধান ভারব্যাটিক নয় তবে এই ধারণাটি সম্ভবত গল্ফ করা যেতে পারে।


আমি মনে করি আপনি f=lambda n:n>1and f(n/2^n&1)or-~-n-1 বাইটের জন্য করতে পারেন ।
এরিক আউটগল্ফার

@EriktheOutgolfer আমি চেষ্টা করেছিলেন কিন্তু যা ত্রুটির যখন ঘটায় f(n/2^n&1)আয় 0 ...
HyperNeutrino

2

প্রতিস্থাপনের পদ্ধতি: {1 -> {1, -1}, -1 -> {-1, 1}}

আপনি এই প্রতিস্থাপনটি 10 ​​বার make 1 -> {1, -1}, -1 -> {-1, 1} make করে 10 বার করে নিতে পারেন, তারপরে সমতল এবং 1 এর অবস্থানগুলি পরীক্ষা করতে পারেন

এখানে গণিতের কোড

(F = Flatten)@
Position[F@Nest[#/.{1->{1,-1},-1->{-1,1}}&,1,10],1][[;; 400]] - 1

আপনি কীভাবে অজগরটিতে এটি করবেন?
আনিশ দুর্গ

2
@ আনেশদুরগ আপনি কি এই সমাধানটিতে আকর্ষণীয় কিছু দেখতে পান? বাক্সটি ভাবুন এবং আপনি জীবনের অর্থ খুঁজে পেতে পারেন এ
কেএ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.