Digraphs ব্যবহার করে 23 অনন্য অক্ষর। (25 ছাড়া) কোনও ইউবি নেই।
int var{};
এড়ানো =
এবং এর সাথে একটি পূর্ণসংখ্যা শূন্যের তালিকা-আরম্ভ করতে সি ++ 11 ব্রেসড ইনিশিয়ালাইজার সিনট্যাক্স ব্যবহার করুন0
। (বা আপনার ক্ষেত্রে, বিশ্বব্যাপী এড়ানো iiii
) এটি আপনাকে গ্লোবাল ভেরিয়েবলগুলি ব্যতীত শূন্যগুলির উত্স দেয় (যা স্থানীয়দের তুলনায় স্থিরভাবে শূন্যে শুরু হয়)।
বর্তমান সংকলকগণ কোনও বিশেষ বিকল্প সক্ষম না করে ডিফল্টরূপে এই সিনট্যাক্সটি গ্রহণ করে।
(পূর্ণসংখ্যা Wraparound কৌতুক মজা, এবং অক্ষম অপ্টিমাইজেশান সঙ্গে golfing জন্য ঠিক, কিন্তু স্বাক্ষরিত ওভারফ্লো আইএসও C ++ অনির্ধারিত আচরণ। অপ্টিমাইজেশান সক্ষম করা হলে তা অসীম loops মধ্যে যারা Wraparound লুপ চালু হবে, যদি না আপনি কম্পাইল সঙ্গে জিসিসি / ঝনঝন -fwrapv
দিতে ভাল ওভারফ্লো পূর্ণসংখ্যা স্বাক্ষরিত সংজ্ঞায়িত আচরণ: 2 এর পরিপূরক wraparound।
মজাদার ঘটনা: আইএসও সি ++ std::atomic<int>
2 এর পরিপূরক মোড়কের চারপাশে ভালভাবে সংজ্ঞায়িত করেছে! int32_t
একেবারে সংজ্ঞায়িত হলে 2 এর পরিপূরক হওয়া প্রয়োজন তবে ওভারফ্লো আচরণটি অপরিজ্ঞাত তাই এটি এখনও কোনও টাইপডেফ int
বা long
কোনও মেশিনে থাকতে পারে যেখানে এই ধরণের একটি 32 বিট, কোনও প্যাডিং এবং 2 এর পরিপূরক নয়))
এই নির্দিষ্ট ক্ষেত্রে কার্যকর নয়:
সরাসরি আরম্ভের জন্য পেরেনগুলি সহ আপনি ব্রেস বা (একটি খালি খালি প্রারম্ভক সহ) বর্তমানের অনুলিপি হিসাবে একটি নতুন পরিবর্তনশীল আরম্ভ করতে পারেন ।
int a(b)
বা int a{b}
এর সমতুল্যint a = b;
তবে int b();
শূন্যের পরিবর্তিত ভেরিয়েবলের পরিবর্তে একটি ক্রিয়া ঘোষণা করে।
এছাড়াও, আপনার সাথে একটি শূন্য পেতে পারেন int()
বা char()
, অর্থাত্ শূন্য আরম্ভের একটি বেনামী বস্তুর।
আমরা আপনার <=
তুলনাগুলি <
একটি সাধারণ লজিক রূপান্তর দ্বারা তুলনার সাথে প্রতিস্থাপন করতে পারি: লুপটির নীচে পরিবর্তে তুলনার পরে লুপ-কাউন্টার বৃদ্ধি করুন do আইএমও এই বিকল্পগুলির চেয়ে সহজ, বিকল্পগুলির চেয়ে সহজ, যেমন ++
প্রথম অংশটি ব্যবহার করে এটিকে for()
1-এ 1 তৈরি করে।
// comments aren't intended as part of the final golfed version
int n;
std::cin >> n; // end condition
for(int r{}; r < n;) { // r = rows from 0 .. n-1
++r;
for(int i{}; i < r;) {
++i;
std::cout << i << ' ';
}
std::cout << std::endl;
}
আমরা এটিকে গল্ফ করতে পারলাম for(int r{}; r++ < n;)
কিন্তু আইএমও যা মানুষের পক্ষে পড়া সহজ নয়। আমরা মোট বাইট গণনার জন্য অপ্টিমাইজ করছি না।
যদি আমরা ইতিমধ্যে ব্যবহার করতাম তবে আমরা বা কোনও জায়গার জন্য h
সঞ্চয় করতে পারি ।'
"
একটি ASCII বা UTF-8 পরিবেশ ধরে, স্থান char
32 মান সঙ্গে একটি। আমরা সহজেই যথেষ্ট পরিমাণে একটি চলকটিতে এটি তৈরি করতে পারি, তারপরেcout << c;
char c{};
c++; c++; // c=2
char cc(c+c+c+c); // cc=8
char s(cc+cc+cc+cc); // s=32 = ' ' = space in ASCII/UTF-8
এবং অন্যান্য মানগুলি স্পষ্টতই ++
তাদের বাইনারি উপস্থাপনার বিটের উপর ভিত্তি করে এবং দ্বিগুণ করার ক্রম থেকে তৈরি করা যেতে পারে । নতুন ভেরিয়েবলের দ্বিগুণ হওয়ার আগে কার্যকরভাবে একটি 0 (কিছুই নয়) বা 1 (++) এলএসবিতে স্থানান্তরিত করা।
এই সংস্করণটি এর h
পরিবর্তে '
বা ব্যবহার করে "
।
এটা তোলে অনেক দ্রুত বিদ্যমান সংস্করণে (একটি দীর্ঘ লুপ উপর নির্ভর নয়) যেকোন তুলনায়, এবং হয় অনির্ধারিত আচরণ থেকে মুক্ত । এটি কোনও সতর্কতা সহ g++ -O3 -Wall -Wextra -Wpedantic
এবং সাথে সংকলন করেclang++
। -std=c++11
alচ্ছিক। এটি আইনী এবং বহনযোগ্য আইএসও সি ++ 11 :)
এটি বৈশ্বিক পরিবর্তনশীলগুলির উপরও নির্ভর করে না। এবং আমি এটিকে পরিবর্তনশীল নামের সাথে আরও অর্থ-পঠনযোগ্য করেছিলাম যার অর্থ রয়েছে।
অনন্য-বাইট গণনা: 25 , আমি যে মন্তব্যগুলি প্রত্যাহার করেছি তা বাদ দিয়েg++ -E
। এবং আপনার কাউন্টারের মতো স্থান এবং নিউলাইন বাদ দিচ্ছে। আমি প্রতিটি sed 's/\(.\)/\1\n/g' ladder-nocomments.cpp | sort | uniq -ic
আসরের চরিত্রের উপস্থিতি গণনা করতে এই অ্যাসুবুন্টু থেকে ব্যবহার করেছি এবং wc
কতটা অনন্য চরিত্র ছিল তা গণনা করতে আমি এটি পাইপ করেছি।
#include<iostream>
int main() {
char c{};
c++; c++; // c=2
char cc(c+c+c+c); // cc=8
char s(cc+cc+cc+cc); // s=32 = ' ' = space in ASCII/UTF-8
int n;
std::cin >> n; // end condition
for(int r{}; r < n;) { // r = rows counting from 0
++r;
for(int i{}; i < r;) {
++i;
std::cout << i << s;
}
std::cout << std::endl;
}
}
কেবলমাত্র 2 টি f
চরিত্রের for
। এর while
পরিবর্তে আমরা লুপগুলি ব্যবহার করতে পারি w
।
আমরা লুপগুলির i < r || goto some_label;
নীচে বা শঙ্কিত শর্তসাপেক্ষে একটি শর্তযুক্ত জাম্প লেখার জন্য লুপগুলি একটি সংসদীয়-ভাষা শৈলীতে পুনরায় লিখতে পারি w (তবে এর or
পরিবর্তে ব্যবহার করা হচ্ছে ||
)। নাহ, এটি কাজ করে না। পার্লের মতো এটি goto
একটি বিবৃতিif
এবং এর মত প্রকাশের উপ-উপাদান হতে পারে না। অন্যথায় আমরা এটি অক্ষর (
এবং )
অক্ষরগুলি সরাতে ব্যবহার করতে পারতাম ।
আমরা ট্রেড পারে f
জন্য g
সঙ্গে if(stuff) goto label;
পরিবর্তে for
, এবং উভয় লুপ সবসময় অন্তত 1 পুনরাবৃত্তির চালানোর তাই আমরা শুধুমাত্র একটি স্বাভাবিক এ এস এম মতো নীচে এক লুপ-শাখা প্রয়োজন চাই do{}while
লুপ গঠন। ব্যবহারকারী ধরে নেওয়া একটি পূর্ণসংখ্যার ইনপুট> 0 ...
চিত্র এবং ত্রিগ্রাফগুলি
সৌভাগ্যক্রমে, আইএসও সি ++ 17 হিসাবে ট্রিগ্রাফগুলি সরানো হয়েছে সুতরাং আমরা সর্বাধিক সাম্প্রতিক সি ++ রিভিশনের জন্য অনন্য-গল্ফ করছি কিনা তার ??>
পরিবর্তে আমাদের ব্যবহার করতে হবে না }
।
কিন্তু বিশেষভাবে trigraphs: আইএসও সি ++ 17 এখনও মত digraphs হয়েছে :>
জন্য ]
এবং %>
জন্য}
। তাই ব্যবহার করে খরচে %
, আমরা উভয় এড়াতে পারেন {
এবং }
, এবং ব্যবহার %:
জন্য #
2 কম অনন্য অক্ষরের একটি নেট সংরক্ষণ জন্য।
আর সি ++ মত অপারেটর কীওয়ার্ড আছে not
জন্য !
অপারেটর, অথবা bitor
জন্য |
অপারেটর। এর xor_eq
জন্য ^=
, আপনি এর সাথে একটি ভেরিয়েবল শূন্য করতে পারেন i xor_eq i
তবে এতে একাধিক অক্ষর রয়েছে যা আপনি ব্যবহার করছেন না।
বর্তমান g++
ইতিমধ্যে এমনকি ছাড়া ডিফল্টরূপে trigraphs উপেক্ষা করে -std=gnu++17
; -trigraphs
এগুলি সক্ষম করার জন্য আপনাকে -std=c++11
বা কোনও আইএসও স্ট্যান্ডার্ডের সাথে কড়া ধারণা অর্জনের জন্য এমন কিছু ব্যবহার করতে হবে যা এতে অন্তর্ভুক্ত রয়েছে does
23 অনন্য বাইট:
%:include<iostream>
int main() <%
int n;
std::cin >> n;
for(int r<% %>; r < n;) <%
++r;
for(int i<%%>; i < r;) <%
++i;
std::cout << i << ' ';
%>
std::cout << std::endl;
%>
%>
এটি অনলাইন চেষ্টা করুন!
চূড়ান্ত সংস্করণটি স্থান বিভাজকের '
পরিবর্তে h
বা তার "
জন্য একক-উদ্ধৃতি ব্যবহার করে। আমি স্টাফটি ডিগ্রাফ করতে চাইনি char c{}
তাই আমি এটি মুছে ফেললাম। একটি চর মুদ্রণ করা স্ট্রিং প্রিন্ট করার চেয়ে বেশি দক্ষ, তাই আমি এটি ব্যবহার করেছি।
হিস্টোগ্রাম:
$ sed 's/\(.\)/\1\n/g' ladder-nocomments.cpp | sort | uniq -ic | tee /dev/tty | wc -l
15 // newline
95 // space
11 %
2 '
3 (
3 )
4 +
9 :
10 ;
14 <
8 >
2 a
4 c
6 d
3 e
2 f
12 i
2 l
2 m
11 n
5 o
7 r
5 s
11 t
3 u
25 // total lines, including space and newline
স্থান বিভাজক (এখনও অমীমাংসিত)
এখন মুছে দেওয়া উত্তরে, জোহান ডু টোইট বিশেষত একটি বিকল্প বিভাজক ব্যবহার করার প্রস্তাব করেছিলেন std::ends
। এটি একটি নল চরিত্র, char(0)
এবং বেশিরভাগ টার্মিনালগুলিতে শূন্য প্রস্থ হিসাবে মুদ্রণ করে। সুতরাং আউটপুট মত দেখতে হবে 1234
, না 1 2 3 4
। বা আরও খারাপ, ময়লা-আবর্জনার দ্বারা পৃথক করে এমন কিছু যা নিঃশব্দে ধসে পড়ে না '\0'
।
আপনি যদি একটি স্বেচ্ছামূলক বিভাজক ব্যবহার করতে পারেন, যখন অঙ্কটি 0
তৈরি করা সহজ cout << some_zeroed_var
। তবে কেউ চায় না 10203040
, এটি কোনও বিচ্ছেদের চেয়েও খারাপ।
আমি স্ট্রিং আক্ষরিক ব্যবহার বা স্ট্রিং ব্যবহার না করে একটি std::string
হোল্ডিং তৈরির" "
উপায় সম্পর্কে ভাবতে চেষ্টা করছিলাম char
। এতে কিছু যুক্ত হতে পারে? কনস্ট্রাক্টরের মাধ্যমে দৈর্ঘ্য 1 দিয়ে একটি তৈরি করার পরে []
কোনও মানকে প্রথম বাইট সেট করার জন্য একটি ডিগ্রাফ দিয়ে 32
?
জোহান std::ios
ফিল () সদস্য ফাংশনটিও প্রস্তাব করেছিলেন যা বর্তমান ভরাট চরিত্রটি প্রদান করে। একটি স্ট্রিমের জন্য ডিফল্ট সেট করা হয় std::basic_ios::init()
এবং হয় ' '
।
std::cout << i << std::cout.fill();
প্রতিস্থাপিত << ' ';
কিন্তু ব্যবহারের .
পরিবর্তে'
।
সঙ্গে -
, আমরা একটি পয়েন্টার নিতে পারেন cout
এবং ব্যবহার ->fill()
সদস্য ফাংশন কল করতে:
std::cout << (bitand std::cout)->fill()
। বা না, আমরা হয় না ব্যবহার করছি b
তাই আমরা &
এর লেজিকাল সমতুলের পরিবর্তে ব্যবহার করতে পারি bitand
,।
.
বা ছাড়াই কোনও সদস্য ফাংশন কল করা->
এটি একটি শ্রেণীর ভিতরে রাখুন, এবং সংজ্ঞা দিন operator char() { fill(); }
// not digraphed
struct ss : std::ostream { // default = private inheritance
// ss() { init(); } // ostream's constructor calls this for us
operator char() { return fill(); }
}
তারপরে ss s{}
লুপের আগে এবং লুপের std::cout << i << s;
ভিতরে। দুর্দান্ত, এটি সংকলন করে এবং সঠিকভাবে কাজ করে, তবে আমাদেরp
h
operator char()
1. এর ক্ষয়ক্ষতির জন্য এবং ব্যবহার করতে হয়েছিল , কমপক্ষে আমরা পরিবর্তে ব্যবহার করে b
সদস্য ফাংশনগুলি তৈরি করা এড়িয়ে চললাম । (এবং আমরা যে উত্তরাধিকারসূত্রে কখনও সহায়তা করে তাতে উত্তরাধিকারকে ওভাররাইড করতে পারি)।public
struct
class
protected