स्रोत कोड में चरित्र मायने रखता है


12

एक प्रोग्राम लिखें जो अपने स्रोत कोड में प्रत्येक अद्वितीय चरित्र की घटनाओं की संख्या की सूची को आउटपुट करता है।

उदाहरण के लिए, इस काल्पनिक कार्यक्रम {Source_Print_1};को इस आउटपुट का उत्पादन करना चाहिए:

; 1
P 1
S 1
_ 2
c 1
e 1
i 1
n 1
o 1
p 1
r 2
t 1
u 1
{ 1
} 1

स्वरूपण इस उदाहरण से मेल खाना चाहिए। वैकल्पिक अंतिम न्यूलाइन को छोड़कर किसी भी बाहरी व्हाट्सएप की अनुमति नहीं है।

आपका प्रोग्राम स्रोत फ़ाइल से अपना स्वयं का स्रोत कोड नहीं पढ़ सकता है।

सूचीबद्ध वर्ण दो में से एक क्रम में होने चाहिए। या तो आपकी भाषा (शायद ASCII) द्वारा उपयोग किए जाने वाले वर्ण एन्कोडिंग में वर्ण मानों का क्रम, या वर्ण आपके स्रोत में दिखाई देते हैं।

यह सवाल जान ड्वोरक की इस टिप्पणी से प्रेरित है ।



1
एक शून्य-लंबाई कार्यक्रम काफी कुछ भाषाओं में काम करेगा। क्या यह एक मानक खामियों के रूप में गिना जाता है ?
डिजिटल ट्रामा

2
चलो साथ चलो ... हाँ।
Sparr


1
@ user23013 अच्छा सवाल। मैंने नई कहानियों पर विचार नहीं किया। मुझे लगता है कि यदि आप उन्हें शामिल करते हैं, तो मैं एक जवाब स्वीकार करता हूं जो उन्हें शाब्दिक रूप से प्रिंट करता है, इसलिए कहीं न कहीं फ़ाइल में एक डबल-न्यूलाइन होगा।
Sparr

जवाबों:


7

CJam, 14 बाइट्स

{S2N`/}`{S2N}/

इसे यहाँ आज़माएँ

आउटपुट उस क्रम में है जो वे पहले प्रकट करते हैं:

{ 2
S 2
2 2
N 2
` 2
/ 2
} 2

यह बस <SP>2<NL>में प्रत्येक चरित्र को जोड़ता है {S2N`/}


18

/// , 12 बाइट्स

  4
4 4

 4

एक बड़ा धन्यवाद @ user23013 को जाता है, जिन्होंने मेरे CJam कोड पर इस सुधार का सुझाव दिया, इस प्रक्रिया में अपना खुद का सर्वोच्च स्कोरिंग उत्तर दिया।

पात्रों को उपस्थिति द्वारा क्रमबद्ध किया जाता है। यह कोड किसी भी भाषा में काम करता है जो दिए गए परिस्थितियों (PHP, ASP, आदि) के तहत अपने स्वयं के स्रोत कोड को प्रिंट करता है।


सीजेएम, 20 बाइट्स

''S5N'5S5N'NS5N'SS5N

यह दृष्टिकोण किसी भी अंतर्निहित वर्ण गणना का उपयोग नहीं करता है।

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

यह काम किस प्रकार करता है

''S5N e# Push a single quote, a space, the integer 5 and a linefeed.
'5S5N e# Push the character 5, a space, the integer 5 and a linefeed.
'NS5N e# Push the character N, a space, the integer 5 and a linefeed.
'SS5N e# Push the character S, a space, the integer 5 and a linefeed.

5
मानक क्वीन तकनीकों का उपयोग नहीं करने के लिए +1।
मार्टिन एंडर

मैं वास्तव में उम्मीद करता हूं कि यह लीड के लिए बंधा रहेगा। मैं ख़ुशी से इसे अपने क्वीन समकक्ष के ऊपर चेकमार्क दे दूँगा।
स्पर्म

अब नई सूचियों की अनुमति है। मुझे लगता है कि इस उत्तर को बेहतर तरीके से अपने में मिला लेना चाहिए।
jimmy23013

@ user23013: यह आपके CJam उत्तर से भी छोटा है। धन्यवाद!
डेनिस

9

सीजेएम, 20 बाइट्स

{`"_~"+$e`{)S@N}%}_~

यह काम किस प्रकार करता है

हम पहले CJam में एक मानक क्वीन के साथ शुरुआत करते हैं

{`"_~"}_~

जो स्टैक पर पहले ब्लॉक को धक्का देता है, इसे कॉपी करता है, और कॉपी को चलाता है, जो इसे स्रोत कोड को आखिरकार प्रिंट करता है।

फिर हम स्रोत कोड से वर्ण गणना की गणना करने के लिए तर्क जोड़ते हैं:

{`"_~"+                         e# At this point, we have the full source code with us
       $e`                      e# Sort to get similar characters together and run RLE to
                                e# get count of each character as [count char] array
          {    }%               e# Run each array element through this loop
           )S@N                 e# Pop the character, put a space, rotate the count after
                                e# space and then finally put a newline after the trio
                 }_~            e# Second half of the standard quine explained above

इसे यहाँ ऑनलाइन आज़माएँ


4

पायथन 3.5.0b1 , 107 73 बाइट्स

s="t='s=%r;exec(s)'%s;[print(c,t.count(c))for c in sorted({*t})]";exec(s)

सामान्य स्ट्रिंग प्रतिस्थापन क्वीन के बजाय, जिसे दो बार सब कुछ लिखने की आवश्यकता होती है, यहां एक execक्वीन है।


3

गणितज्ञ, 101 बाइट्स

Apply[Print[#1, " ", #2] &, Tally[Characters[StringJoin[ToString[#0, InputForm], "[];"]]], {1}] & [];

दुर्भाग्य से, मैं किसी भी सामान्य गोल्फिंग ट्रिक्स का उपयोग नहीं कर सकता जैसे कि व्हाट्सएप को हटाने के <>लिए StringJoin, #इसके बजाय #1, @उपसर्ग फ़ंक्शन कॉल के लिए या @@@इसके बजाय Apply[...,{1}], क्योंकि ToString[...,InputForm]यह सोचता है कि इसमें सब कुछ प्रिंट करना है ...

यह वर्णों को उस क्रम में प्रिंट करता है जिस क्रम में वे पहली बार कोड में दिखाई देते हैं। अगर मैं मान सकता हूं कि यह आरईपीएल वातावरण में नहीं चल रहा है (जो कि गणितज्ञ के लिए असामान्य है) तो मैं दो बाइट्स को दो को छोड़ कर बचा सकता हूं ;


InputFormकष्टप्रद है ... OutputFormबेहतर है लेकिन यह तार नहीं उद्धृत करता है।
लीजनमोनमल 978

2

हास्केल, 178 बाइट्स

main=putStr(unlines[s:' ':show t|(s,t)<-zip" \"'(),-0123456789:<=S[\\]aehilmnoprstuwz|"[3,3,3,3,3,41,4,1,6,19,12,5,5,2,2,2,2,3,2,2,2,3,3,3,2,2,2,4,2,2,4,2,3,2,5,5,3,2,2,2]])--178

कुछ भी आकर्षक नहीं। कार्यक्रम के सभी पात्र शाब्दिक सूची (स्ट्रिंग) में हैं। तो आवृत्तियाँ हैं। दोनों सूचियों को प्रिंट करें और प्रिंट करें। आउटपुट:

  3
" 3
' 3
( 3
) 3
, 41
- 4
0 1
1 6
2 19
3 12
4 5
5 5
6 2
7 2
8 2
9 2
: 3
< 2
= 2
S 2
[ 3
\ 3
] 3
a 2
e 2
h 2
i 4
l 2
m 2
n 4
o 2
p 3
r 2
s 5
t 5
u 3
w 2
z 2
| 2 

1

डार्ट - 214 127

एक सीधा संस्करण:

main(){print("  22\n\" 3\n( 3\n) 3\n1 3\n2 15\n3 8\n4 1\n5 2\n8 2\n; 2\n\\ 23\na 2\ni 3\nm 2\nn 23\np 2\nr 2\nt 2\n{ 2\n} 2");}

"4" संख्याओं को जोड़ने के लिए सिर्फ एक झूठा कारक है। डार्टपैड पर देखें / चलाएँ ।

ओरिजिनल: स्टैंडर्ड क्वीन टैक्टिक, और डार्ट के फंक्शन के नाम अच्छे गोल्फ के लिए थोड़े लंबे हैं।

main({m,v,q:r'''main({m,v,q:r''}'')''{m={};for(v in q.split(''))m[v]=m[v]==null?2:m[v]+2;m.forEach((k,v)=>print("$k $v"));}'''}){m={};for(v in q.split(''))m[v]=m[v]==null?2:m[v]+2;m.forEach((k,v)=>print("$k $v"));}

इसे डार्टपैड पर देखें / चलाएं ।


0

हास्केल , 146 बाइट्स

main=mapM putStrLn[a:" "++show s|a<-[' '..],s<-[sum[2|b<-show"main=mapM putStrLn[a: ++show s|a<-[' '..],s<-[sum[2|b<-show,a==b]],s>0]",a==b]],s>0]

इसे ऑनलाइन आज़माएं!

आउटपुट:

  8
" 4
' 4
+ 4
, 6
- 6
. 4
0 2
2 2
: 2
< 6
= 6
> 2
L 2
M 2
S 2
[ 8
] 8
a 10
b 4
h 4
i 2
m 6
n 4
o 4
p 4
r 2
s 12
t 4
u 4
w 4
| 4

(प्लस एक अतिरिक्त newline)

स्पष्टीकरण:

कोड है

main=mapM putStrLn[a:" "++show s|a<-[' '..],s<-[sum[2|b<-show"<code>",a==b]],s>0]

जहां "<code>"बिना प्रोग्राम कोड के एक स्ट्रिंग है "

aएक अंतरिक्ष से शुरू होने वाले एससीआई पात्रों के माध्यम से जाता है। sum[2|b<-show"<code>",a==b]मायने रखता है कि स्ट्रिंग में चरित्र कितनी बार दिखाई देता है, प्रत्येक घटना के साथ दो बार गिना जाता है। a:" "++show sवर्तमान चरित्र, एक स्थान और चरित्र की एक स्ट्रिंग बनाता है। अंत mapM putStrLnमें सूची में प्रत्येक स्ट्रिंग को एक अनुगामी न्यूलाइन के साथ प्रिंट करता है।

सबसे कठिन हिस्सा "सही की गिनती हो रही थी । बस का उपयोग करना b<-"<code>"शून्य उद्धरण चिह्नों की गणना करेगा क्योंकि स्ट्रिंग में कोई भी नहीं हैं। का उपयोग करते हुए स्ट्रिंग के सामने और अंत में show"<code>"एक जोड़ता है ", जिसके परिणामस्वरूप चार की गिनती होती है। इसलिए मुझे कोड में दो अतिरिक्त उद्धरण चिह्न लगाने थे, इसलिए a:' ':show sमैंने (कम) का उपयोग किया a:" "++show s

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.