Digraphs का उपयोग करते हुए 23 अद्वितीय वर्ण। (25 बिना)। कोई यूबी नहीं।
int var{};
बचने के लिए शून्य के साथ एक पूर्णांक को सूचीबद्ध करने के लिए C ++ 11 लटके हुए आरंभिक सिंटैक्स का उपयोग करें=
और 0
। (या आपके मामले में, वैश्विक से बचनाiiii
)। यह आपको वैश्विक चरों के अलावा शून्य का स्रोत देता है (जो स्थानीय लोगों के विपरीत शून्य से आरंभिक होता है)।
वर्तमान संकलक डिफ़ॉल्ट रूप से इस वाक्यविन्यास को स्वीकार करते हैं, बिना किसी विशेष विकल्प को सक्षम किए।
(पूर्णांक रैपराउंड चाल मजेदार है, और अनुकूलन अक्षमता के साथ गोल्फ के लिए ठीक है, लेकिन हस्ताक्षरित अतिप्रवाह आईएसओ सी ++ में अपरिभाषित व्यवहार है। अनुकूलन को सक्षम करने से उन रैपराउंड छोरों को अनंत छोरों में बदल दिया जाएगा, जब तक कि आप जीसीसी / क्लैंग के लिए संकलन नहीं करते। -fwrapv
हस्ताक्षरित पूर्णांक को अच्छी तरह से देने के लिए को निर्धारित व्यवहार: 2 का पूरक आवरण।
मजेदार तथ्य: ISO C ++ std::atomic<int>
में अच्छी तरह से परिभाषित 2 का पूरक रैप-अराउंड है! int32_t
2 के पूरक होने की आवश्यकता है अगर सभी पर परिभाषित किया गया है, लेकिन अतिप्रवाह व्यवहार अपरिभाषित है, इसलिए यह अभी भी किसी भी मशीन के लिए int
या long
जहां किसी भी प्रकार का 32 बिट्स है, कोई पैडिंग नहीं है, और 2 का पूरक है, एक टाइपराइफ हो सकता है ।)
इस विशिष्ट मामले के लिए उपयोगी नहीं:
आप एक मौजूदा चर की एक प्रति के रूप में या तो ब्रेसिज़ (या एक गैर-खाली इनिशलाइज़र के साथ) के रूप में एक नया वेरिएबल इनिशियलाइज़ कर सकते हैं, डायरेक्ट इनिशियलाइज़ेशन के लिए ।
int a(b)
या के int a{b}
बराबर हैंint a = b;
लेकिन int b();
शून्य के लिए एक चर के बजाय एक फ़ंक्शन की घोषणा करता है।
इसके अलावा, आप एक शून्य के साथ int()
या char()
, एक अनाम वस्तु के शून्य-आरंभीकरण प्राप्त कर सकते हैं ।
हम आपकी <=
तुलना को <
एक साधारण तर्क परिवर्तन द्वारा तुलना के साथ बदल सकते हैं : लूप के नीचे के बजाय लूप-काउंटर वेतन वृद्धि की तुलना करें। IMO यह उन लोगों की तुलना में सरल है, जिन्हें लोगों ने प्रस्तावित किया है, जैसे ++
कि for()
0 का 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;)
लेकिन IMO मनुष्य के लिए पढ़ना आसान है। हम कुल बाइट गिनती के लिए अनुकूलन नहीं कर रहे हैं।
हम पहले से ही उपयोग कर रहे थे 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
वैकल्पिक है। यह कानूनी और पोर्टेबल आईएसओ सी ++ 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;
के तल पर सशर्त छलांग लिखने के लिए एक असेंबली-भाषा शैली में लूप को फिर से लिख सकते हैं, या जो भी हो। (लेकिन or
इसके बजाय का उपयोग कर ||
)। नहीं, यह काम नहीं करता है। goto
यह एक कथन की तरह है if
और यह पर्ल में एक अभिव्यक्ति का उप-घटक नहीं हो सकता है। अन्यथा हम इसका इस्तेमाल चरित्र (
और )
चरित्र को हटाने के लिए कर सकते थे ।
हम व्यापार कर सकता है f
के लिए g
के साथ if(stuff) goto label;
के बजाय for
, और दोनों छोरों हमेशा कम से कम 1 यात्रा को चलाने इसलिए हम केवल एक सामान्य एएसएम की तरह, तल पर एक पाश शाखा आवश्यकता होगी do{}while
पाश संरचना। उपयोगकर्ता इनपुट को पूर्णांक मानते हुए> 0 ...
डिग्राफ और ट्रिग्राफ
सौभाग्य से, ट्रिग्राफ को ISO C ++ 17 के रूप में हटा दिया गया है , इसलिए हमें इसका उपयोग ??>
करने की आवश्यकता नहीं है }
यदि हम सबसे हालिया C ++ संशोधन के लिए अद्वितीय-गोल्फिंग कर रहे हैं।
लेकिन केवल विशेष रूप से trigraphs: आईएसओ सी ++ 17 अभी भी तरह द्वि आलेख है :>
के लिए ]
और %>
के लिए}
। का उपयोग कर की कीमत पर तो %
, हम दोनों से बच सकते हैं {
और }
, और उपयोग %:
के लिए#
2 कम अनन्य पात्रों का शुद्ध बचत के लिए।
और सी ++ की तरह ऑपरेटर कीवर्ड शामिल हैं not
के लिए !
ऑपरेटर, या bitor
के लिए |
ऑपरेटर। साथ xor_eq
के लिए ^=
, आप के साथ एक चर शून्य सकता हैi xor_eq i
, लेकिन यह कई पात्रों आप प्रयोग नहीं कर रहे थे है।
वर्तमान g++
पहले से ही बिना डिफ़ॉल्ट रूप से ट्रिगर को अनदेखा करता है -std=gnu++17
; आपको -trigraphs
उन्हें सक्षम करने के लिए उपयोग करना है, या -std=c++11
आईएसओ मानक के अनुरूप होने के लिए कुछ है जो उन्हें शामिल करता है।
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
। शायद यह कुछ करने के लिए? शायद एक []
बाइट के साथ पहले बाइट को मान के लिए सेट करने के लिए32
, एक निर्माण के दौरान लंबाई 1 के साथ एक बनाने के बाद?
जोहान ने 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