จำนวนตัวอักษรในซอร์สโค้ด


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) หรือลำดับอักขระที่ปรากฏในแหล่งที่มาของคุณ

คำถามนี้แรงบันดาลใจจากความคิดเห็นนี้โดยม.ค. Dvorak



1
โปรแกรมที่มีความยาวเป็นศูนย์จะทำงานได้ในบางภาษา สิ่งนี้นับเป็นช่องโหว่มาตรฐานหรือไม่?
Digital Trauma

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 และอื่น ๆ )


CJam, 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 สำหรับการไม่ใช้เทคนิคควินมาตรฐาน
Martin Ender

ฉันหวังเป็นอย่างยิ่งว่าสิ่งนี้จะยังคงเชื่อมโยงกับผู้นำ ฉันจะให้เครื่องหมายถูกกับคู่ควิน
Sparr

อนุญาตให้ขึ้นบรรทัดใหม่ได้แล้ว ฉันคิดว่าคำตอบนี้ควรรวมเข้ากับคุณดีกว่า
jimmy23013

@ user23013: นั่นสั้นกว่าคำตอบ CJam ของคุณ ขอบคุณ!
Dennis

9

CJam, 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

Python 3.5.0b1 , 107 73 ไบต์

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

แทนที่ quine การแทนที่สตริงตามปกติซึ่งต้องเขียนทุกอย่างสองครั้งนี่คือexecquine


3

Mathematica, 101 ไบต์

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

แต่น่าเสียดายที่ฉันไม่สามารถใช้ใด ๆ ของเทคนิคการเล่นกอล์ฟปกติเช่นการลบช่องว่าง<>สำหรับStringJoin, #แทน#1, @สำหรับการโทรฟังก์ชั่นคำนำหน้าหรือ@@@แทนApply[...,{1}]เพราะToString[...,InputForm]คิดว่ามันมีทุกอย่างที่พิมพ์สวย ...

พิมพ์อักขระตามลำดับที่ปรากฏในรหัส ถ้าฉันสามารถสมมติว่านี้ไม่ได้ทำงานในสภาพแวดล้อม REPL (ซึ่งค่อนข้างผิดปกติสำหรับ Mathematica) ;ฉันสามารถบันทึกไบต์ที่สองโดยเลี่ยงสอง


InputFormมันน่ารำคาญ ... OutputFormดีกว่า แต่มันไม่ได้อ้างสตริง
LegionMammal978

2

Haskell, 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

ไม่มีอะไรแฟนซี อักขระทั้งหมดของโปรแกรมอยู่ในรายการตัวอักษร (String) ดังนั้นความถี่ ซิปทั้งรายการและพิมพ์ เอาท์พุท:

  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

Dart - 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" เป็นเพียงปัจจัยที่ยุ่งยากในการเพิ่มตัวเลข ดู / ทำงานบนDartPad

Original: ชั้นเชิงควินมาตรฐานและชื่อฟังก์ชั่นของ Dart นั้นยาวเกินไปสำหรับการเล่นกอล์ฟที่ดี

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"));}

ดู / รันบนDartPad


0

Haskell , 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

(เพิ่มขึ้นบรรทัดใหม่)

คำอธิบาย:

รหัสคือ

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

ที่เป็นสตริงของรหัสโปรแกรมโดยไม่ต้อง"<code>""

aต้องผ่านอักขระ ascii ที่ขึ้นต้นด้วยช่องว่าง sum[2|b<-show"<code>",a==b]นับความถี่ที่ตัวละครปรากฏในสตริงโดยแต่ละเหตุการณ์จะถูกนับสองครั้ง a:" "++show sสร้างสตริงของอักขระปัจจุบันเว้นวรรคและจำนวนอักขระ สุดท้ายmapM putStrLnพิมพ์แต่ละสตริงในรายการด้วยการขึ้นบรรทัดใหม่

ส่วนที่ยากที่สุดคือการนับที่"ถูกต้อง การใช้ก็b<-"<code>"จะนับศูนย์เครื่องหมายคำพูดเพราะไม่มีในสตริง การใช้show"<code>"เพิ่ม a "ไปที่ด้านหน้าและจบลงที่สตริงทำให้เกิดการนับสี่ ดังนั้นผมจึงต้องใส่สองเครื่องหมายคำพูดเพิ่มเติมในรหัสเพื่อแทน (สั้น) ผมใช้a:' ':show sa:" "++show s

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.