পার্ল, 1428 1099
এটিতে 1193 ASCII অক্ষর রয়েছে (960 অনুমোদিত বাইনারি অঙ্ক সহ) 1193 - 94 = 1099
$s='010011100001100010101100111111101001101011101000100000101011011010100110111111011111101011101000100110111111011100101000011101011110100000101000100101011111111110101100101101011010011100100100011110110001011100100001011010100111100000011110111110011100101000100110111111101001011110101011100110101110101101011110101100111111100010101101101100011110100101011111111111101101101000111111011110100111011100101000011101011110111111011010111111101100101101101011100010100111100000111110';$_=q{$i=join'',A..Z,a..z,0..9,'. ';print map({substr$i,oct'0b'.$_,1}$s=~/.{6}/g),$/;chop($s=<>);$s=join'',map{sprintf"%06b",index$i,$_}$s=~/./g;$t=join'',map{$_ x(480-(()=$s=~/$_/g))}0,1;print"\$s='$s';\$_=q{$_};eval#$t"};eval#000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
আমার প্রথম নকশা
বাইনারিতে স্যুইচ করার জন্য ডেনিসের কাছ থেকে পরামর্শ নেওয়ার আগে, আমার প্রোগ্রামটি অষ্টাল অঙ্কগুলিকে অনুমতি দিয়েছে।
আমার প্রথম ডিজাইনটি প্রতিটি স্ট্রিংকে প্রতিটি অক্ষরে 2 টি সংখ্যার সাথে 160 অষ্টাল অঙ্কগুলিতে এনকোড করে। এই এনকোডিংটিতে 100 8 = 64 টি আলাদা অক্ষর রয়েছে। অষ্টাল সিস্টেমে 8 টি আলাদা অঙ্ক রয়েছে। প্রোগ্রামটিতে অবশ্যই প্রতিটি অঙ্কের 160 কপি থাকতে হবে, সুতরাং এটি 8 × 160 = 1280 অঙ্কের অনুমতি দেয়।
আমি 160 টি সংখ্যা $s
এবং অন্যান্য 1120 সংখ্যা রাখি $t
। আমি এমন একটি প্রোগ্রাম দিয়ে শুরু করি যা কুইন নয়, তবে কেবল পরবর্তী রান $s
এবং তার $t
জন্য অ্যাসাইনমেন্টগুলি মুদ্রণ করে । এই হল:
$s = '2341425477515350405332467737535046773450353640504537765455323444366134413247403676345046775136534656553654774255543645377755507736473450353677327754555342474076';
$t = '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777';
# $i = character map of 64 characters, such that:
# substr($i, $_, 1) is the character at index $_
# index($i, $_) is the index of character $_
$i = join '', 'A'..'Z', 'a'..'z', '0'..'9', '. ';
# Decode $s from octal, print.
# 1. ($s =~ /../g) splits $s into a list of pairs of octal digits.
# 2. map() takes each $_ from this list.
# 3. oct() converts $_ from an octal string to a number.
# 4. substr() on $i converts number to character.
# 5. print() outputs the characters from map() and a final "\n".
print map({ substr $i, oct, 1 } $s =~ /../g), "\n";
# Read new $s, encode to octal.
# 1. ($s = <>) reads a line.
# 2. chop($s) removes the last character of $s, the "\n".
# 3. ($s =~ /./g) splits $s into characters.
# 4. map() encodes each character $_ as a pair of octal digits.
# 5. join() concatenates the pairs from map().
chop($s = <>);
$s = join '', map { sprintf "%02o", index $i, $_ } $s =~ /./g;
# Make new $t.
# 1. map() takes each $_ from 0 to 7.
# 2. $_ x (160 - (() = $s =~ /$_/g)) makes a string where $_ repeats
# 160 times, minus the number of times that $_ appears in $s.
# 3. join() concatentates the strings from map().
$t = join '', map { $_ x (160 - (() = $s =~ /$_/g)) } 0..7;
# Print the new assignments for $s and $t. This is not yet a quine,
# because it does not print the rest of the program.
print "\$s = '$s';\n\$t = '$t';\n";
(() = $s =~ /$_/g))
ভেরিয়েবলের খালি তালিকার একটি অ্যাসাইনমেন্ট। আমি এই কৌশলটি পার্লমঙ্কস-এর প্রসঙ্গ টিউটোরিয়াল থেকে নিই । এটি ম্যাচ অপারেটরের তালিকার প্রসঙ্গটি জোর করে =~
। স্কেলারের প্রসঙ্গে ম্যাচটি সত্য বা মিথ্যা হবে $i++ while ($s =~ /$_/g)
এবং ম্যাচগুলি গণনা করতে আমার একটি লুপ দরকার । তালিকার প্রসঙ্গে $s =~ /$_/g
ম্যাচের একটি তালিকা। আমি এই তালিকাটি একটি বিয়োগের স্কেলার প্রসঙ্গে রেখেছি, তাই পার্ল তালিকার উপাদানগুলি গণনা করে।
একটি কুইন তৈরি করতে, আমি পার্স কুইন্স$_=q{print"\$_=q{$_};eval"};eval
থেকে রোসটা কোডে ফর্মটি নিই । এটি একটিতে একটি স্ট্রিং বরাদ্দ করে এবং তারপরে কল করে , তাই আমি আমার কোডটি স্ট্রিংয়ে রাখতে এবং এটি চালাতে পারি। আমার প্রোগ্রামটি quine যখন আমি গত লাইনে আমার তৃতীয় মোড়ানো হয়ে এবং , এবং আমার গত পরিবর্তন করতে ।q{...}
$_
eval
$_=q{
};eval
print
print "\$s = '$s';\n\$t = '$t';\n\$_=q{$_};eval"
পরিশেষে, আমি প্রথম কার্যভারটি $t
একটি মন্তব্যে পরিবর্তন করে এবং অতিরিক্ত অক্ষর মুছে ফেলে আমার প্রোগ্রামটি গল্ফ করি ।
এতে 1522 এএসসিআইআই অক্ষর রয়েছে (1280 অনুমোদিত অষ্টাল অঙ্ক সহ)
1522 - 94 = 1428
$s='2341425477515350405332467737535046773450353640504537765455323444366134413247403676345046775136534656553654774255543645377755507736473450353677327754555342474076';#0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
$_=q{$i=join'','A'..'Z','a'..'z','0'..'9','. ';print map({substr$i,oct,1}$s=~/../g),"\n";chop($s=<>);$s=join'',map{sprintf"%02o",index$i,$_}$s=~/./g;$t=join'',map{$_ x(160-(()=$s=~/$_/g))}0..7;print"\$s='$s';#$t\n\$_=q{$_};eval"};eval
বাইনারি স্যুইচ করুন
মন্তব্যে ডেনিস লক্ষ্য করেছেন যে 960 অনুমোদিত বাইনারি অঙ্কগুলি 1280 অষ্টাল অঙ্কের চেয়ে কম হবে। সুতরাং আমি প্রতিটি বেসের জন্য 2 থেকে 16 এর মধ্যে অনুমোদিত অঙ্কের সংখ্যা আঁকিয়েছি।
Maxima 5.29.1 http://maxima.sourceforge.net
using Lisp ECL 13.5.1
...
(%i36) n : floor(x);
(%o36) floor(x)
...
(%i41) plot2d(n * ceiling(log(64) / log(n)) * 80, [x, 2, 16],
[xlabel, "base"], [ylabel, "number of permuted digits"]);
(%o41)
যদিও বেস 8 স্থানীয় নূন্যতম, বেসগুলি 2 এবং 3 এবং 4 টি সেরা বেসের জন্য 960 অনুমোদিত অঙ্কে। কোড গল্ফের জন্য, বেস 2 সেরা কারণ পার্লের বেস 2 এর জন্য রূপান্তর রয়েছে।
980 বাইনারি অঙ্কের সাথে 1280 অষ্টাল অঙ্কগুলি প্রতিস্থাপন করা 320 টি অক্ষর সংরক্ষণ করে।
অষ্টাল থেকে বাইনারি কোড পরিবর্তন করে 8 টি অক্ষর:
- পরিবর্তন
oct
করার জন্য oct'0b'.$_
খরচ 7।
- পরিবর্তন
/../g
করার জন্য /.{6}/g
খরচ 2।
"%02o"
"% 06 বি" তে পরিবর্তন করুন `খরচ 0।
- পরিবর্তন
160
করার জন্য 480
খরচ 0।
- পরিবর্তন
0..7
করার জন্য 0,1
1 পরিমাণ সঞ্চয় হয়।
আমি কিছু পার্ল গল্ফ টিপস শিখেছি । তারা 14 টি অক্ষর সংরক্ষণ করে:
- খালি শব্দ এবং খালি সংখ্যা ব্যবহার করে এতে পরিবর্তন
'A'..'Z','a'..'z','0'..'9'
করুন A..Z,a..z,0..9
, 12 টি অক্ষর সংরক্ষণ করুন।
- পরিবর্তন
"\n"
করার জন্য $/
2 অক্ষর পরিমাণ সঞ্চয় হয়।
আমি #$t
মন্তব্যটি ফাইলের শেষে সরিয়ে 3 অক্ষর সংরক্ষণ করি । এটি মন্তব্যটিকে শেষ করা নিউলাইন এবং \n
কুইনে আক্ষরিক remove
এই পরিবর্তনগুলি মোট 329 টি অক্ষর সংরক্ষণ করে এবং আমার স্কোর 1428 থেকে 1099 এ হ্রাস করে।