ETAOIN SHRDLU กอล์ฟ


43

คำอธิบายสั้น ๆ และหวานของความท้าทาย:
จากETAOIN SHRDLUความท้าทายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่สั้นที่สุดในภาษาใด ๆ ที่ส่งออก 26 ตัวอักษรของตัวอักษรภาษาอังกฤษตามความถี่ในอินพุต

รายละเอียดยาวมากแห้งและทั่วถึง:

  • โปรแกรม / ฟังก์ชั่นของคุณจะได้รับเมื่อป้อนสตริงของข้อความซึ่งจะประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่และ / หรือตัวพิมพ์เล็กหนึ่งตัวหรือมากกว่าและอาจมีเครื่องหมายวรรคตอนตัวเลขสัญลักษณ์และอักขระอื่น ๆ ที่ไม่ใช่ตัวอักษร
  • โปรแกรม / ฟังก์ชั่นจะต้องส่งออกเฉพาะตัวอักษร 26 UPPERCASE ของตัวอักษรภาษาอังกฤษรวมถึงตัวอักษรที่ไม่ปรากฏในอินพุทเรียงลำดับจากมากที่สุดไปน้อยอย่างน้อยที่สุดตามจำนวนครั้งที่ปรากฏในอินพุต
  • แก้ไข:ความถี่จะคำนวณตามตัวพิมพ์ใหญ่ - เล็ก แต่เอาต์พุตต้องเป็นตัวพิมพ์ใหญ่
  • หากตัวอักษรสองตัวขึ้นไปมีความถี่เท่ากันอาจอยู่ในลำดับใดก็ได้
  • ไม่อนุญาตให้ใช้เอาต์พุตอื่นเช่นช่องว่าง
  • แก้ไข 7/1/2557:ตามความคิดเห็นฉันกำลังแก้ไขกฎนี้ เอาต์พุตอื่นเท่านั้นที่ได้รับอนุญาตเป็นทางเลือกชั้นนำและ / หรือช่องว่างต่อท้ายเช่นขึ้นบรรทัดใหม่ ไม่อนุญาตให้ใช้เอาต์พุตอื่น
  • พฤติกรรมที่ไม่ได้กำหนดได้รับอนุญาตสำหรับการป้อนข้อมูลที่ไม่มีตัวอักษรใด ๆ

ผู้ชนะจะถูกเลือก 7 วันนับจากนี้ดังนั้นลองพิมพ์นิ้วมือเหล่านั้น!


อินพุตตัวอย่าง:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vitae erat velit. Mauris gravida euismod libero ut tincidunt. Phasellus elit dui, consectetur et egestas in, aliquam vitae diam. Donec eget varius ante. Vestibulum cursus diam aliquet, egestas orci quis, placerat dolor. Proin vel nisi lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Etiam libero tortor, ornare id dui eget, posuere dignissim libero. Pellentesque commodo consequat volutpat. Integer hendrerit sapien libero, vel viverra augue facilisis sit amet. Quisque consectetur eget nisl quis dignissim. Ut lacinia pretium quam a placerat.
Morbi sed interdum risus, nec pretium lectus. Morbi imperdiet est id accumsan molestie. Duis sed fermentum nisl. Nunc vitae augue mattis, dictum lectus vel, accumsan nisl. Sed ultricies adipiscing rhoncus. Vivamus eu lacus a enim venenatis eleifend. Praesent consectetur tortor non eleifend ultricies. Mauris et odio posuere, auctor erat at, fringilla est. Proin in vestibulum erat. Maecenas congue commodo ante vel varius. Sed tempus mi ut metus gravida, nec dictum libero dapibus. Morbi quis viverra elit. Ut pharetra neque eget lacus tincidunt dictum. Fusce scelerisque viverra tellus et pretium.
Fusce varius adipiscing odio. Nulla imperdiet faucibus sem, at rhoncus ipsum adipiscing vitae. Phasellus imperdiet congue lacus et mollis. Nullam egestas mauris magna, et mollis lectus varius ut. Sed sollicitudin adipiscing dolor, vel elementum elit laoreet molestie. Aliquam nec nulla vel sem ultrices ullamcorper. Nullam nec felis magna. Duis sodales orci non justo aliquam tempus. Integer mi diam, tempor sed vulputate et, varius et nunc. Vestibulum sodales ipsum id mi pharetra, ut convallis mi accumsan. Sed dictum volutpat vestibulum.
Quisque ac dolor sagittis, aliquam libero at, euismod enim. Nulla ullamcorper posuere nulla vitae varius. Nam at dolor non libero elementum pellentesque in in lorem. Fusce porttitor turpis in quam placerat varius. Donec lorem orci, condimentum eu sapien sit amet, aliquet commodo magna. Quisque sed lectus sit amet arcu euismod accumsan et non nunc. Phasellus placerat congue metus, feugiat posuere leo dictum quis. Sed ultricies feugiat eros dignissim bibendum.
Mauris scelerisque consectetur libero eget varius. Aenean neque nunc, ullamcorper vitae orci in, auctor ornare sapien. Nam lacinia molestie imperdiet. Nam vitae mattis nibh. Vestibulum consequat tellus ac nisi sagittis pulvinar. Nullam mollis ornare quam, et venenatis leo porttitor sit amet. Nulla urna neque, dignissim non orci ut, volutpat ultrices erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque vestibulum tellus nec eros faucibus porta.

ตัวอย่างผลลัพธ์:

EITUSALNROMCDPVGQBFHJKWXYZ

หมายเหตุ: มีการผูก 5 ทางระหว่างKWXYZอินพุตนั้น

แก้ไข:

การแข่งขันจบแล้ว! ขอบคุณทุกคนที่เข้าร่วม และตอนนี้สำหรับผู้ชนะ (s!): คำตอบของทั้งสองของเดนนิส CJamและไอซา็กของพี ธนั้นมีจำนวน 19 ตัวอักษร (ขออภัย แต่ฉันจะไม่ยอมรับคำตอบอย่างใดอย่างหนึ่งเพราะฉันคิดว่ามันจะไม่ยุติธรรมกับคนอื่น ๆ ) แก้ไข:รับคำแนะนำของเดนนิสฉันจะทำเครื่องหมายคำตอบของเขาว่ายอมรับเพราะเขาเป็นคนแรก ถึง 19 ตัวอักษร ผู้มีเกียรติกล่าวถึงคำตอบของ Golfscript อันดับสามของ Ilmari Karonenที่ 22 chars รวมถึงคำตอบ Python 75-char ของ undergroundmonorailที่ได้รับการโหวตมากที่สุด ขอขอบคุณทุกคนที่เข้าร่วม!


ความถี่ถูกวัดสำหรับตัวอักษรตัวพิมพ์ใหญ่ของอินพุตเท่านั้นหรือไม่
Howard

2
@IlmariKaronen ใช่การขึ้นบรรทัดใหม่ถือว่าเป็นช่องว่างดังนั้นจะไม่ได้รับอนุญาต
อับราฮัม

8
@Abraham: IMO; หากบรรทัดใหม่ต่อท้าย (เฉพาะ) ได้รับอนุญาตสำหรับบางภาษามันควรได้รับอนุญาตโดยทั่วไปสำหรับทุกภาษา ไม่น้อยเพราะกระแสข้อความควรจะถูกยกเลิกโดยการขึ้นบรรทัดใหม่ตามด้วย EOF
Williham Totland

3
@WillihamTotland ตามจำนวนความคิดเห็นของคุณที่มี upvotes ฉันจะแก้ไขกฎเพื่อให้บรรทัดใหม่ต่อท้าย
อับราฮัม

1
จะทำอย่างไรถ้ามีคำตอบสองข้อที่มีรหัสที่สั้นที่สุด? แนะนำให้ทำเครื่องหมายสีเขียวให้กับโซลูชันก่อนหน้า isaacg โพสต์คำตอบของเขาก่อนฉัน golfed ฉันถึง 19 ไบต์ก่อน ไม่ว่าคุณจะเลือกเบรคตัวไหนก็ตามจะดี แต่ฉันไม่มีคำตอบที่ยอมรับได้ก็คือความคิดของฉันต่อต้านภูมิอากาศ
Dennis

คำตอบ:


26

CJam, 21 19 ไบต์

qeu:A;'[,65>{A\-,}$

ลองออนไลน์

ตัวอย่าง

$ cjam etaoin.cjam <<< "~XyxY YyxZ"
YXZABCDEFGHIJKLMNOPQRSTUVW

(ไม่มีการขึ้นบรรทัดใหม่)

มันทำงานอย่างไร

qeu:A; " Read from STDIN, convert to uppercase, save in the variable “A” and discard, ";
'[,    " Push an array of all ASCII characters before “[” (NUL to “Z”).               ";
65>    " Remove the first 64 characters (NUL to “@”).                                 ";
{      " Sort the array of characters by the following mapping:                       ";
  A\   " Swap the character with the string saved in variable “A”.                    ";
  -    " Remove all occurrences of the character from the string.                     ";
  ,    " Push the length of the string.                                               ";
}$     "                                                                              ";

เหตุการณ์ที่เกิดขึ้นหมายถึงการลบตัวอักษรมากขึ้นดังนั้นตัวละครที่พบบ่อยที่สุดจะปรากฏขึ้นที่จุดเริ่มต้นของอาร์เรย์


ฉลาดมากจริงๆ
อับราฮัม

ขอแสดงความยินดี @Dennis ที่ชนะการประกวด!
อับราฮัม

43

Python 2 หรือ 3 - 77 75 ไบต์

f=lambda s:''.join(sorted(map(chr,range(65,91)),key=s.upper().count))[::-1]

ฉันได้รับคำตอบก่อนหน้านี้ที่ได้รับอินพุตจาก STDIN แต่ฉันรู้ว่ามันไม่ถูกต้องทางเทคนิค ฉันใช้input()อันไหนที่ได้แค่บรรทัดเดียว แต่อินพุตตัวอย่างของคำถามหมายความว่าควรจัดการหลายบรรทัดพร้อมกัน เพื่อตอบสนองข้อมูลจำเพาะฉันเปลี่ยนคำตอบของฉันให้เป็นฟังก์ชันที่รับอาร์กิวเมนต์สตริง ความประหลาดใจของฉันมันเล็กลงสองไบต์! มันไม่ได้เกิดขึ้นกับผมว่าprint(...)และinput()อยู่ได้นานกว่าและf=lambda s:s

สิ่งนี้ยังทำให้คำตอบนั้นเข้ากันได้กับทั้ง Python 2 และ Python 3 แต่เดิมมันเป็นเพียง Python 3 เพราะมันใช้input()(ซึ่งถูกเรียกraw_input()ใน 2) ตอนนี้มันเป็นฟังก์ชั่นใช้งานได้ทั้งสองอย่าง

อธิบาย

                                  range(65,91)                              # The numbers 65 to 90
                          map(chr,range(65,91))                             # Convert to ASCII

                                                    s                       # The input string
                                                    s.upper()               # Convert to uppercase
                                                    s.upper().count         # Function literal for 'how many times the argument appears in the string'

                   sorted(map(chr,range(65,91)),key=s.upper().count)        # Sort by that function
           ''.join(sorted(map(chr,range(65,91)),key=s.upper().count))       # Concatenate to string
           ''.join(sorted(map(chr,range(65,91)),key=s.upper().count))[::-1] # Step through by -1 (i.e. reverse string)

  lambda s:''.join(sorted(map(chr,range(65,91)),key=s.upper().count))[::-1] # Make it a function (`return` is implicit for lambdas)
f=lambda s:''.join(sorted(map(chr,range(65,91)),key=s.upper().count))[::-1] # Give it a name

2
ในขณะที่ความคิดเห็นในคำอธิบายทำให้ฉันหน้า ยินดีต้อนรับสู่ CS 101!
Izkata

6
@Izkata สิ่งสำคัญคือมันจะแสดงให้คุณเห็นว่าในการที่จะอ่านรหัส เพราะสถานที่ที่ดีที่สุดในการเริ่มอ่านโค้ดกอล์ฟไม่ค่อยชัดเจนโดยเฉพาะเมื่อมันซับซ้อนหรือสั้นกว่านี้เล็กน้อย
Martin Ender

1
การนำเสนอที่สวยงาม!
xnor

3
@Izk เป้าหมายของฉันคือทำให้คนที่ไม่รู้จักงูใหญ่เข้าใจได้ ฉันจะไม่แสดงความคิดเห็นเช่นนี้ในโครงการจริง
undergroundmonorail

2
@ ฉันcountไม่ได้เป็นตัวแปรหรืออะไรมันเป็นฟังก์ชั่นที่แท้จริง เท่อย่างที่มันจะเป็นไปได้ที่จะสามารถคูณค่าตอบแทนของฟังก์ชั่น-1โดยการติด-อยู่ข้างหน้านั่นไม่ใช่คุณลักษณะของหลาม
undergroundmonorail

15

Bash ขนาด 65 ไบต์

(tr a-z A-Z;echo {A..Z})|fold -1|sort|uniq -c|sort -nr|tr -dc A-Z

ตัวอย่าง

$ bash etaoin.sh <<< "~AbaB BbaC"
BACZYXWVUTSRQPONMLKJIHGFED

มันทำงานอย่างไร

(              #
  tr a-z A-Z   # Turn lowercase into uppercase letters.
  echo {A..Z}  # Print all uppercase letters.
) |            #
fold -1 |      # Split into lines of length 1.
sort |         # Sort those lines (required for piping to uniq).
uniq -c |      # Print the frequencies of all lines.
sort -nr |     # Sort by frequency (reversed).
tr -dc A-Z     # Remove everything that's not an uppercase letter.

1
นี่ไม่ใช่โลแคลแบบพกพาคุณต้องบังคับ LC_COLLATE = C (หรือสั้นกว่า LC_ALL)
Chris Down

6
@ChrisDown พกพาไม่ได้เป็นความกังวลในการตอบคำถามกอล์ฟ
Kevin

1
หากไม่มีการพกพาสิ่งที่คำตอบนี้ไม่ได้นิยามไว้อย่างชัดเจน
Chris Down

@ChrisDown: ฉันได้ทดสอบสตริงและสถานที่ไม่กี่แห่ง แต่ฉันไม่พบตัวอย่างที่ uniq ทำงานผิดปกติสำหรับตัวอักษร คุณช่วยโชว์ให้ฉันดูได้ไหม
Dennis

@ChrisDown สคริปต์นี้เป็นแบบพกพามากพอที่จะทำงานบน OpenBSD โดยใช้ fold, sort, tr, uniq รุ่น BSD, ถ้าเชลล์เป็น bash หรือ ksh93 เชลล์อื่น ๆ เช่น zsh ไม่สามารถขยาย{A..Z}ได้ ตำแหน่งที่ตั้ง LC_COLLATE ทั้งหมดทำงานได้เนื่องจาก OpenBSD มี LC_COLLATE = C เท่านั้น
kernigh

12

Pyth 1.0.2 , 19 20

=ZUwsVm;dSm[cZkk)UG

ลองที่นี่: http://ideone.com/fork/YlWpEJ

เรียนรู้เพิ่มเติมเกี่ยวกับ Pyth ได้ที่นี่: http://esolangs.org/wiki/Pyth

ตัวอย่าง:

จาก ETAOIN SHRDLU ความท้าทายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่สั้นที่สุดในภาษาใด ๆ ที่ส่งออก 26 ตัวอักษรของตัวอักษรภาษาอังกฤษตามความถี่ของพวกเขาในการป้อนข้อมูล

ให้:

TENOHARSIULGFPYDCBWQMZXVKJ

คำอธิบาย:

=ZUw: แปลงอินพุตเป็นตัวพิมพ์ใหญ่และเก็บใน Z

sV: พิมพ์ผลรวมของการย้อนกลับของ

m;d: รายการสุดท้ายของ

S: เรียงตามรายการแรกในลำดับที่เพิ่มขึ้น

m[cZkk): รายการ [นับ k ใน Z, k]

UG: สำหรับ k ในตัวอักษรตัวพิมพ์ใหญ่

หลามหยาบเทียบเท่า:

G='abcdefghijklmnopqrstuvwxyz'
Z=copy(upper(input()))
print(_sum(rev(_map(lambda d:d.pop(),sorted(_map(lambda k:_list(count(Z,k),k),upper(G)))))))

นี่ไม่ใช่รายการฉันแค่คิดว่าคนอาจต้องการที่จะเห็นมัน ใน Pyth 1.0.4 โปรแกรมต่อไปนี้เป็นคำตอบ 10 ตัวอักษร:

JUwo_cJNUG

คำอธิบาย:

JUw: แปลงอินพุตเป็นตัวพิมพ์ใหญ่และเก็บใน J

o: (พิมพ์) จัดเรียงตาม

_cJN: -1 * (นับ N ใน J)

UG: เกิน N ในตัวอักษรตัวพิมพ์ใหญ่

มันไม่ได้เป็นวิธีแก้ปัญหาทางกฎหมายเพราะการเปลี่ยนแปลงหลายอย่างจาก Pyth 1.0.2 เป็น 1.0.4 รวมถึงการเพิ่มoฟังก์ชั่นเรียงลำดับตามตอบสนองต่อปัญหานี้


ฉันขอแนะนำให้คุณอัปเดตลิงก์ Pyth ไปยังหน้าอย่างเป็นทางการของ Pyth หากมีอยู่
อัล

@AL นั่นคือหน้าอย่างเป็นทางการของ Pyth จนกระทั่งฉันเข้าร่วมรายการ esolang
isaacg

ทำไมคุณต้องเก็บอินพุตในตัวแปรZเพื่ออ้างถึงมันอีกครั้งในภายหลัง? เพียงแค่วางนิพจน์Zในที่นั้นจะทำให้อินพุตถูกอ่านหลาย ๆ ครั้ง?
xnor

@xnor ตำแหน่ง Z ถูกใช้อยู่ในฟังก์ชัน lambda เนื่องจากอยู่ในอาร์กิวเมนต์แรกของแผนที่ดังนั้นจึงจำเป็นต้องบันทึกเป็นตัวแปร การใช้ Uw จะส่งผลให้อ่านได้ 26 ครั้ง
isaacg

1
@AL เอาล่ะ Pyth ขึ้นอยู่กับทั้ง esolang และ gitub ลิงค์ GitHub อยู่ที่ด้านล่างของหน้า esolang ซึ่งมีการเชื่อมโยงในคำตอบ Github ทำการเปลี่ยนสีรหัส
isaacg

11

Javascript ( ES6 ) 119 117

แก้ไข: (-2) ลบความจำเป็นในการtoUpperCaseใช้ RegEx แบบตัวพิมพ์เล็กและใหญ่ในการsplitโทร

a=prompt(f=x=>a.split(RegExp(x,'i')).length)
alert([...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'].sort((b,c)=>f(c)-f(b)).join(''))

ทางเลือก (ความยาวเท่ากัน):ย่อการเรียงลำดับและอักขระลงในฟังก์ชั่นเดียว

a=prompt()
alert([...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'].sort(f=(b,c)=>c?f(c)-f(b):a.split(RegExp(b,'i')).length).join(''))

ในฐานะที่เป็นฟังก์ชั่น: 105 104

แก้ไข: (-1) ย่อการเรียงลำดับและอักขระให้เป็นฟังก์ชันเดียว

F=a=>[...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'].sort(f=(b,c)=>c?f(c)-f(b):a.split(RegExp(b,'i')).length).join('')

1
เทคนิคที่น่าสนใจ
Matt

1
สาดสตริง ... น่ายินดี!
Bergi

10

GolfScript, 22 ตัวอักษร

:?91,+-26>{.32+]?\-,}$

ลองออนไลน์

คำอธิบาย:

  • :??กำหนดสายป้อนให้กับสัญลักษณ์ (ฉันใช้สัญลักษณ์วรรคตอนเพื่อ91ไม่ให้แยกตัวเลขต่อไปนี้เป็นส่วนหนึ่งของชื่อสัญลักษณ์)
  • 91,สร้างรายการของตัวเลขตั้งแต่ 0 ถึง 90 (รหัส ASCII ของZ)
  • + ผนวกรายการนี้กับสตริงอินพุตดังนั้นจึงแปลงจากอาร์เรย์ของรหัส ASCII เป็นสตริง (และสะดวกในการลบสตริงอินพุตออกจากสแต็ก)
  • -26>ใช้เวลาช่วง 26 ตัวอักษรของสตริงนี้ผลิตสตริงที่มีตัวอักษรตัวพิมพ์ใหญ่ ASCII จากไปAZ
  • การ{ }$ใช้รหัสบล็อกกับตัวละครทั้งหมดในสายป้อนและเรียงลำดับตัวละครเหล่านั้นตามผล
  • ภายในบล็อคโค้ดให้.ทำสำเนาอักขระซ้ำและ32+แปลงสำเนาจากตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก การ]รวบรวมอักขระสองตัวเหล่านี้ลงในอาร์เรย์?\-นำสตริงอินพุตที่เก็บไว้ใน?และลบอักขระทั้งหมดที่อยู่ในอาร์เรย์ออกจากนั้นและ,นับความยาวของสตริงที่เหลือซึ่งจะเป็นคีย์การเรียงลำดับ ตัวละครจะถูกจัดเรียงตามลำดับจากน้อยไปมากโดยคีย์นี้และตามลำดับจากมากไปน้อยตามจำนวนครั้งที่เกิดขึ้น

1
ดูเหมือนว่าเรามีความคิดเดียวกันมาก ข้อผิดพลาดเล็กน้อย: ตัวอักษร Z หายไป 91,+-26>มันควรจะเป็น
Dennis

@Dennis: อ๊ะโอ๊ะโอ คงที่แม้ว่าใครต้องการจดหมายฉบับนั้นล่ะ? :)
Ilmari Karonen

2
@IlmariKaronen ตามความคิดเห็นของชุมชนฉันได้แก้ไขกฎเพื่อให้บรรทัดใหม่ต่อท้าย (ดูคำถามสำหรับคำอธิบายที่สมบูรณ์) คะแนนของคุณอยู่ในขณะนี้22มากกว่า25:)
อับราฮัม

8

Haskell, 110 ไบต์

import Data.List
import Data.Char
a%f=compare(f a).f
f t=sortBy(% \c->length$filter((/=c).toUpper)t)['A'..'Z']

ตัวอย่างการใช้งาน:

λ> f "Based off ETAOIN SHRDLU, your challenge is to write the shortest program or function in any language that outputs the 26 letters of the English alphabet based on their frequency in the input."
"ETNAHORISULFGPBCDYMQWJKVXZ"

1
แล้ว(/=c)การกำจัด0-ล่ะ?
ลินน์

@Mauris จับดี! ฉันแก้ไขมันและถอดตัวละครอื่นออก
Flonk

6

Ruby 2.0, 53 ตัวอักษร

แก้ไข : แก้ไขการทำงานอย่างถูกต้องกับสตริงหลายบรรทัดขอบคุณ @ durron597!

f=->s{$><<(?A..?Z).sort_by{|c|-s.upcase.count(c)}*''}

สร้างฟังก์ชั่นที่เรียกว่าfซึ่งสามารถใช้ดังนี้

f['jackdaws love my big sphinx of quartzzz']

พิมพ์ไปที่ STDOUT:

AZOSICGHEJKLMBFPQRDTUVWXYN

2
คำตอบนี้ไม่ถูกต้อง มันให้คำตอบนี้: EITASUROLNCMPDVQGBHFKJWXYZสำหรับตัวอย่างในคำถาม
durron597

1
@ durron597 ขอบคุณคุณถูกต้อง! มันไม่ได้จัดการสตริงหลายgetsบรรทัดอย่างถูกต้อง - ส่งคืนบรรทัดในแต่ละครั้ง สามารถแก้ไขได้โดยเปลี่ยนgetsเป็นgets$nแต่เปลี่ยนเป็นฟังก์ชั่นสั้นลง 1 ถ่าน
Paul Prestidge

6

Perl, 54 46 ไบต์

อัปเดต:หลังจากการเพิ่มประสิทธิภาพเพิ่มเติมแล้วมันอาจถูกบีบให้เหลือ46ไบต์: ( เดนนิสสำหรับ-n/ {}แฮ็ก; ภาษาจีนภาษาเพอร์ชาวกรีกสำหรับ<=>-> -แฮ็ค)

s/./$h{uc$&}++/eg}{say sort{$h{$b}-$h{$a}}A..Z

มันจะถูกเรียกใช้ด้วยการรันด้วย perl -nE

โซลูชันดั้งเดิม (ไม่ต้องการตัวเลือก Perl พิเศษ):

s/./$h{uc$&}++/egfor<>;print sort{$h{$b}<=>$h{$a}}A..Z

ตรวจสอบแล้วใน Perl 5.8.3, 5.14.2

หากคุณได้รับคำเตือนให้แยกegและforเว้นวรรค (+1 ถ่าน) หากคุณคิด

ตัวอย่างการใช้งาน:

$ python -c 'import this' | perl -le 's/./$h{uc$&}++/egfor<>;print sort{$h{$b}<=>$h{$a}}A..Z' 2>/dev/null
ETAISONLRHPBUCDYMFGXVWKZJQ

คำอธิบาย: ในตัวละครแต่ละตัว ( .) ของแต่ละบรรทัดอินพุท ( for<>) ใช้ทดแทน "รูปแบบ" ซึ่งในความเป็นจริงมีการประเมินว่าการแสดงออก ( eธงs///) ที่เพิ่มขึ้นทีละ upcased ( uc) ตัวอักษร ( ./ $&สั้นกว่าชัดเจนมากขึ้น(.)/ $1) นับในแฮช (ไม่กำหนดค่าเริ่มต้น) ( %h) จากนั้นแฮชความถี่จดหมายจะใช้ในฟังก์ชั่นการเปรียบเทียบการเรียงลำดับเพื่อพิมพ์ตัวอักษรตัวพิมพ์ใหญ่ในลำดับที่ถูกต้อง


1
สั้นลงและไม่มีข้อความแสดงข้อผิดพลาด:perl -ne 's/./$h{uc$&}++/eg}{print sort{$h{$b}<=>$h{$a}}A..Z'
Dennis

เดนนิส: น่าสนใจมากมันดูเหมือนว่าพิมพ์ผิด .. ฉันเคยบางสายพันธุ์ที่ใช้-nและEND{}แต่พวกเขาก็มักจะได้อีกต่อไป .. อย่าลังเลที่จะปรับปรุงคำตอบถ้าคุณต้องการ
mykhal

1
ใช่-nล้อมwhile(<>){...}รอบโค้ด ฉันหลีกเลี่ยงการแก้ไขรหัสของผู้ใช้คนอื่น ง่ายเกินไปที่จะทำผิดพลาดบางสิ่งบางอย่างใช้ได้เฉพาะกับคอมพิวเตอร์บางเครื่องเท่านั้น
Dennis

1
Joe: ฉันกำลังพูดถึง}{"การฉีด" ไม่ใช่แค่ทาง-nเลือกที่รู้จักกันดี หนึ่งอาจไม่คาดหวังว่าจริง ๆ แล้วสตริงของโค้ดถูกห่อหุ้มด้วยสตริงโค้ดลูปก่อนที่จะทำการประมวลผลไม่เพียงแค่ว่ามันจะทำงานคล้ายกับว่ามันถูกห่อ ..
mykhal

1
ประหยัดสองตัวอักษรเพิ่มเติม: แทนที่$h{$b}<=>$h{$a}ด้วย$h{$b}-$h{$a}
chinese perl goth

5

R, 123 ไบต์

รหัสนี้ได้รับการปรับปรุงให้ดีขึ้นเนื่องจากคำแนะนำโดย @RichieCotton

text <- "Based off ETAOIN SHRDLU, your challenge is to write the shortest program or function in any language that outputs the 26 letters of the English alphabet based on their frequency in the input."

f=function(x){b=plyr::count(toupper(strsplit(x,"")[[1]]));c=merge(LETTERS,b,all.x=T);paste(c[order(-c$freq),1],collapse="")}

f(text)

เอาท์พุท:

> f(text)
[1] "ETNAHORISULFGPBCDYMQWJKVXZ"

1
@RichieCotton: ฉันได้ปฏิเสธการแก้ไขที่แนะนำของคุณสองครั้งแล้ว ฉันไม่รู้ว่าคุณได้รับแจ้งด้วยเหตุผลของการปฏิเสธการโหวตดังนั้นถ้าคุณอ่านสิ่งนี้: โปรดให้การปรับปรุงการตีกอล์ฟในความคิดเห็นเพื่อให้ OP สามารถตรวจสอบได้ นี่คือเหตุผล: meta.codegolf.stackexchange.com/a/1619/8478
Martin Ender

4

C ++, 185 183 179 177 ไบต์

ไม่คาดว่าจะชนะแน่นอน (สามารถใช้ภาษา C ++ ได้หรือไม่) แต่การออกกำลังกายที่สนุกสนานยังคงอยู่

#include <algorithm>
#include <stdio.h>
int f[256],p;main(){for(p=65;p<91;p++)f[p]=p;while(~(p=getchar()))f[p&95]+=256;p=256;std::sort(f,f+p);while(p--)f[p]&95&&putchar(f[p]);}

คำอธิบาย:

#include <algorithm>         // for std::sort
#include <stdio.h>           // for getchar, putchar
int f[256],p;                // declare an array of count-prefixed chars, and a counter
main(){
    for(p=65;p<91;p++)       // 65 == 'A', 91 == the character after 'Z'
        f[p]=p;              // set the character for the slot
    while(~(p=getchar()))    // read characters until EOF
        f[p&95]+=256;        // increment the packed count for the character stripped of the 'lowercase bit'
    p=256;                   // start a countdown
    std::sort(f,f+p);        // sort the array
    while(p--)               // do the countdown
        f[p]&95 &&           // if the masked-off character is set...
          putchar(f[p]);     // print it
}

4

VBScript 181 109

อัปเดตเพื่อใช้อัลกอริทึมที่แตกต่างอย่างสิ้นเชิง เต้น JavaScript!

น่ารัก:

dim b(99):i=ucase(inputbox(k))
for y=65to 90
    c=chr(y)
    a=len(replace(i,c,k))
    b(a)=c+b(a)
next
msgbox join(b,k)

แข็งแรงเล่นกอล์ฟ:

dim b(99):i=ucase(inputbox(k)):for y=65to 90:c=chr(y):a=len(replace(i,c,k)):b(a)=c+b(a):next:msgbox join(b,k)

4

J 41 35 ไบต์

(u:65+i.26)([\:[#/.~@,e.~#])toupper

การสาธิต:

i=: 'This is a test to see whether this is still working'
(u:65+i.26)([\:[#/.~@,e.~#])toupper i
STIEHLORWAGKNBCDFJMPQUVXYZ

คำอธิบาย:

(u:65+i.26) & ( [ \: [ #/.~@,e.~#]) toupper) )
ABCDE...          |    |    |   |      uppercase the right argument
                  |    |    |   \copy from right only member from left
                  |    |     \append the left argument
                  |    \ Afterwards Count apperances of each letter
                  \ Sort the left according to the appearances

กุญแจสำคัญคือการผนวกอาร์เรย์ด้านซ้ายเช่นที่ตัวอักษรทั้งหมดที่มีอยู่และอยู่ในลำดับ ผลตลกของการใช้คำนามเป็นซี่ที่สามถึงทางแยกคือมันทำงานเป็นคำกริยาและวลี


4

Groovy - 130 123 115 112 98 92

ตามคำแนะนำของ @ cfrick (สองครั้ง!):

f={('A'..'Z').collectEntries{c->[c,it.grep(~/(?i)$c/).size()]}.sort{-it.value}*.key.join()}

การทดสอบขนาดเล็ก (ถูกขโมยมาจาก @jpjacobs อย่างไร้ยางอาย):

assert f('This is a test to see whether this is still working') == 
    'STIEHLORWAGKNBCDFJMPQUVXYZ'

และการทดสอบที่เสนอก็ผ่านไปเช่นกัน


1
ฟังก์ชันต้องการเอาท์พุททั้งหมด 26 ตัวอักษรไม่ใช่แค่ที่อยู่ในสายป้อน
algorithmshark

@ อัลกอริทึมแน่นอนความผิดพลาดของฉันได้รับการแก้ไข
จะ Lp

f={('A'..'Z').collectEntries{c->[c,it.toUpperCase().findAll(c).size()]}.sort{-it.value}.keySet().join()}สำหรับ 104
cfrick

1
อีก 6 ไบต์: it.grep(~/(?i)$c/)แทนit.toUpperCase().grep(c)
cfrick

@cfrick Wow! ขอบคุณอีกครั้ง! นั่นtoUpperCaseรบกวนจิตใจของฉัน
จะ Lp

4

SAS - 217 (ฉันคิดว่า)

ควรวางอินพุตบนบรรทัดหลังคำสั่ง cards4 หรือบนการ์ดเจาะที่เหมาะสมสำหรับระบบของคุณ ฉันคิดว่าวิธีการนี้ช่วยประหยัดอักขระไม่กี่ตัวเทียบกับการพยายามอ้างอิงอินพุต

data a;
input;
S = upcase(compress(_INFILE_,,'ak'));
do i=1 to length(S);
l=substr(S,i,1);
output;
end;
cards4;
;;;;
run;
proc sql;
select l into :o separated by '' from
(select l, 1/count(l) as f from a group by l) order by f;
quit;

ฉันทราบว่านี่ไม่ตรงกับข้อมูลจำเพาะทั้งหมดเนื่องจากจะส่งคืนเฉพาะอักขระที่ปรากฏในสตริงอินพุตเท่านั้น ฉันอาจต้องคิดใหม่สักหน่อย


ไม่ตรงตามข้อกำหนด แต่ก็ยังเจ๋งดังนั้น +1: D
cat

4

AppleScript, 278

ฉันสังเกตเห็นว่า"a" = "A"เป็นจริงใน AppleScript ฉันสามารถใช้สิ่งนี้ในการเขียนโค้ดกอล์ฟได้ แต่สคริปต์ที่เหลือก็พูดเกินไป ฉันใช้ AppleScript 1.8.3

fนี้กำหนดฟังก์ชั่น หากคุณเพิ่มf("a string")ที่ด้านล่างของสคริปต์และเรียกใช้ในตัวแก้ไขสคริปต์มันจะแสดงผล

on c(n)
ASCII character(64+n)
end
on f(s)
set{a,r}to{{},""}
repeat with i from 1 to 26
set j to 0
repeat with b in s
if b&""=c(i)then set j to j+1
end
set a to a&j
end
repeat with j from 0 to(count s)
repeat with i from 1 to 26
if a's item i=j then set r to c(i)&r
end
end
r
end

จัดรูปแบบและแสดงความคิดเห็น:

-- Returns nth letter of alphabet.
on c(n)
    ASCII character (64 + n)
end c

-- Returns letters in s sorted by frequency.
on f(s)
    -- a: list of letter counts
    -- r: resulting string
    set {a, r} to {{}, ""}

    -- For each letter from A to Z,
    -- count letters in string s.
    repeat with i from 1 to 26
        set j to 0
        repeat with b in s
            -- Can't use b = c(i), because
            -- b is a reference to a string
            -- and = never dereferences its
            -- operands. Get contents of b,
            -- here by coercing b to string.
            if b & "" = c(i) then set j to j + 1
        end repeat
        -- Set item i of a to count j.
        set a to a & j
    end repeat

    -- Sort letters by frequency.  Do a counting sort
    -- because AppleScript lacks a sort command.
    repeat with j from 0 to (count s)
        repeat with i from 1 to 26
            if a's item i = j then set r to c(i) & r
        end repeat
    end repeat
    r
end f

-- Example call:
f("Now is the time for all good men to come to the aid of their country.")
-- Result: "OTEIRNMHLFDCAYWUSGZXVQPKJB"

3

VBScript 157 156 ไบต์

แก้ไข: เปลี่ยน msgbox (p) เป็น msgbox p

อ่านเพิ่มเติมได้:

s=ucase(InputBox(z))    'z is empty.
L=len(s)
Dim a(255)
for i=1to L
    x=asc(mid(s,i))
    a(x)=a(x)+1
next
for t=0to L
    For i=65To 90
        If a(i)=t then p=chr(i)&p
    next
next
msgbox p

Golfed: (155 ตัวอักษร + 1 การคืนรถ)

s=ucase(InputBox(z)):L=len(s):Dim a(255):for i=1to L:x=asc(mid(s,i)):a(x)=a(x)+1:next:for t=0to L:For i=65To 90:If a(i)=t then p=chr(i)&p
next:next:msgbox p

ก่อนหน้านี้ฉันเคยใช้รหัสที่ 171 ซึ่งฉันพบว่าน่าสนใจกว่า แต่วิธีการเรียงลำดับแบบสบาย ๆ ของเดลีนั้นสั้นกว่าและต้องใช้ len ซึ่งทำให้ "สั้นกว่า" ขณะ "สำหรับลูปแรก (หาว)

's=UCase(InputBox(Z))&8 'just need any extra character.  0-7 don't work because &7 is octal

s=UCase(InputBox(Z)) 'nevermind
Dim a(999)
While Len(s)
    x=Asc(s) 'returns ascii of first char
    a(x)=a(x)-1 'going negative saves a character later...
    s=Mid(s,2) 'doesn't care if you run out of string
Wend
for j=1 to 26 'this used to be   While Len(p)<26
    For i=65To 90
        If a(i)<a(y) Then y=i 'it is barely not worth it to do a(i)+a(i+32)>a(y) here to skip the ucase() above
    Next
    p=p&Chr(y)
    a(y)=1 'if I didn't go negative this would have to be -1.  arrays default to 0.
Next
MsgBox(p)

ฉันได้เรียนรู้เทคนิคเจ๋ง ๆ จากโพสต์นี้! ขอบคุณสำหรับการกล่าวถึงเช่นกัน สิ่งหนึ่งที่: ฉันคิดว่าfor t=0ควรจะเป็นfor t=1อย่างอื่นคุณมักจะพิมพ์ตัวอักษรทั้งหมด
comfortablydrei

1
@comfortablydrei จำเป็นต้องพิมพ์ตัวอักษรทั้งหมด "โปรแกรม / ฟังก์ชั่นจะต้องส่งออกเฉพาะตัวอักษร 26 ตัวต่อยอดของตัวอักษรภาษาอังกฤษรวมถึงตัวที่ไม่ปรากฏในอินพุต"
JesterBLUE

โว้ว. พลาดที่หนึ่ง แล้วมันเป็นความผิดพลาดของฉัน ขอบคุณ!
comfortablydrei

3

J - 38 35 ตัวอักษร

ฟังก์ชันรับอินพุตทางด้านขวาเป็นสตริง ไม่ใช่ผู้ชนะ แต่มันก็สนุกดีที่ได้เขียน

(u:65+i.26)([\:[#/.~@,e.~#])toupper

อธิบาย:

  • toupperเป็นคำกริยาในไลบรารีมาตรฐานที่เพิ่มสตริง จากนั้นกลายเป็นอาร์กิวเมนต์ที่ถูกต้องของคำกริยาในขณะที่อาร์กิวเมนต์ซ้ายคือตัวอักษร: ASCII codepoints 65 ถึง 90

  • [และ,e.~#])เลือก ( #) ตัวอักษรเหล่านั้นใน ARG ขวา ( ]) ที่เป็นองค์ประกอบของ ( e.~) ทางซ้ายและจากนั้น prepends ( ,) ARG ทางซ้าย ( [) เพื่อปัญญาเราเก็บเฉพาะตัวอักษรตัวพิมพ์ใหญ่และเพิ่มตัวอักษรหนึ่งตัวที่ส่วนท้ายเพื่อให้แน่ใจว่าเราจับพวกมันทั้งหมด

  • #/.~@จากนั้นให้ความถี่ของตัวละครแต่ละตัว มันเกิดขึ้นที่สิ่งนี้ได้รับตามลำดับตัวอักษรดังนั้นหลังจากนั้นเราสามารถลดขนาด ( \:) ตัวอักษร (อาร์กิวเมนต์ซ้าย[)

ตัวอย่างขี้เกียจอย่างรวดเร็วด้านล่าง รู้สึกอิสระที่จะลองด้วยตัวคุณเองที่tryj.tk

   (u:65+i.26)([\:[#/.~@,e.~#])toupper 'Based off ETAOIN SHRDLU, your challenge is to write the shortest program or function in any language that outputs the 26 letters of the English alphabet based on their frequency in the input.'
ETNAHORISULFGPBCDYMQWJKVXZ

3

T-SQL 178

โดยทั่วไปนี่เป็นโซลูชัน VBScript ของฉัน แต่ใช้งานใน SQL

นี่คือการใช้งาน XML ในทางที่ผิดเพื่อเชื่อมคอลัมน์ ในการใช้งานจริงมันสามารถเชื่อมต่อกับโต๊ะด้านนอกเพื่อเลียนแบบGROUP_CONCATฟังก์ชั่นใน MySQL และอื่น ๆ

การประกาศ@ตัวแปร:

DECLARE @ CHAR(1024)= 'enter your text here';

รหัส:

with y AS(
    SELECT UPPER(@)i,0l,91y
    UNION ALL
    SELECT i,len(replace(i,char(y-1),'')),y-1
    FROM y
    WHERE y>65
)
SELECT LTRIM(
(
    SELECT char(y)
    FROM y
    WHERE y<91
    ORDER BY l
    FOR XML PATH(''))
)

3

Perl, 78 ไบต์

undef$/;$i=<>;$r{$i=~s/$_//gi}.=$_ for A..Z;print$r{$_}for sort{$b<=>$a}keys%r
  • เฉพาะตัวอักษร ASCII 26 ตัวพิมพ์ใหญ่ที่ไม่มีช่องว่างใด ๆ เท่านั้นที่จะถูกส่งออกตามลำดับความถี่
  • อักขระที่ผูกจะถูกกำหนดตามลำดับตัวอักษร

ผลลัพธ์สำหรับตัวอย่างในคำถาม:

EITUSALNROMCDPVGQBFHJKWXYZ

Ungolfed:

# read input
# ----------
undef $/; # disable input separator
$i = <>;  # $i holds the complete input as one string

# analyze
# -------
# For each uppercase letter (A upto Z) its occurences are counted
# via the number of substitutions made by s/$_//gi. The lowercase
# letter is included via modifier "i".
# 
# The occurrence count is then used as key for hash %r.
# The uppercase letter is appended to the value of that hash entry.
$r{$i =~ s/$_//gi} .= $_ for A..Z;

# output
# ------
# The hash keys are sorted numerically in reverse order by
# the specified sort function.
print $r{$_} for sort {$b<=>$a} keys %r

สิ่งนี้อาจใช้ได้กับตัวอย่างเช่นบอทไม่เช่นสำหรับecho -e 'x\ny\n\nz\n'เอาต์พุตซึ่งควรส่งคืนXYZABCDEFGHIJKLMNOPQRSTUVWแต่ให้ผลตอบแทนXYABCDEFGHIJKLMNOPQRSTUVWZแทน คาดเดาว่าทำไม .. :)
mykhal

@mykhal: แก้ไขแล้ว
Heiko Oberdiek

3

PHP - 105 ไบต์

<?preg_filter(~‹§æ“Ö¢‹ö,'$f[$0&fl]++',join('',range(a,z)).$argv[1]);arsort($f);foreach($f as$l=>$F)echo$l;

นี่คือ hexdump สาเหตุของอักขระพิเศษ:

0000000 3c 3f 70 72 65 67 5f 66 69 6c 74 65 72 28 7e dc
0000010 a4 be d2 85 a2 dc 9a 2c 27 24 66 5b 24 30 26 df
0000020 5d 2b 2b 27 2c 6a 6f 69 6e 28 27 27 2c 72 61 6e
0000030 67 65 28 61 2c 7a 29 29 2e 24 61 72 67 76 5b 31
0000040 5d 29 3b 61 72 73 6f 72 74 28 24 66 29 3b 66 6f
0000050 72 65 61 63 68 28 24 66 20 61 73 24 6c 3d 3e 24
0000060 46 29 65 63 68 6f 24 6c 3b                     
0000069

และเวอร์ชัน golfed น้อยกว่าเล็กน้อย:

<?
preg_filter(           // regular expression
  "#[A-z]#e",          // matches every letter + 'eval' flag
  '$f[$0&fl]++',        // so this code runs for every letter
                       // $f is an array whose indices are uppercase letters
                       //   and whose values represent the number of occurences
                       // lowercase is converted to uc with the bitwise and
                       //   fl is 11011111 in binary, every bit except for 32's is set
  join('', range(a,z)) // adding abcdefghijklmnopqrstuvwxyz to the input
    .$argv[1]);        //   because not all letters have to appear in the input
arsort($f);            // sort $f in reverse, maintaining indices
foreach($f as$l=>$F)   //
  echo$l;              // print each index in order

ตัวอย่าง:

 $ php etaoin_shrdlu.php "This function sorts an array such that array indices maintain their correlation with the array elements they are associated with."
 ATIRESHNOCYUWMDLFXZBVGPQKJ

อักขระพิเศษpreg_filter()ทำงานอย่างไร
อับราฮัม

3
ใน PHP ~ เป็นตัวดำเนินการระดับบิตมินและคุณสามารถนำไปใช้กับสตริงได้เช่นกันซึ่งในกรณีนี้มันใช้ได้กับตัวละครทุกตัว นอกจากนี้ PHP ยังมีความสุขที่จะแยกสตริงข้อความเป็นตัวอักษรสตริงเนื่องจากไม่มีอักขระพิเศษ (เช่นตัวดำเนินการ, $ สำหรับตัวแปร, เครื่องหมายอัฒภาค, parantheses ... ) ดังนั้นการเขียน ~ ‹§æ“ Ö¢ ‹ö (เวอร์ชั่นฤbitษี bitwise) แทนที่จะเป็น "# [Az] #e" จะบันทึกหนึ่งไบต์เนื่องจากไม่จำเป็นต้องยกมา
Aurel Bílý

อ่าขอบคุณ ทำให้รู้สึกตอนนี้
อับราฮัม

1
ตราบเท่าที่ทุกสิ่งใน PHP นั้นสมเหตุสมผล moly ศักดิ์สิทธิ์
ปุย

echo join(array_keys($f));สามารถบันทึกหนึ่งไบต์
Titus

3

C # ใน LINQPad - 203 ไบต์

ฉันใช้แนวทางที่แตกต่างเพื่อตอบคำถามของ Logan Dam ฉันแน่ใจก่อนว่าอักขระทุกตัวในสตริงอินพุตเรียงตามลักษณะที่ปรากฏและมีอยู่เพียงครั้งเดียวในเอาต์พุตสตริง หลังจากนั้นฉันเพิ่มอักขระที่หายไปทุกตัวจากตัวอักษรไปยังสตริงเอาต์พุต

void e(string i){var a="";foreach(var d in i.ToUpper().GroupBy(x=>x).OrderByDescending(u=>u.Count()))if(d.Key<91&&d.Key>64){a+=d.Key;}for(int x=65;x<91;x++)if(!a.Contains((char)x)){a+=(char)x;}a.Dump();}

น่าเศร้าที่มันจะไม่เอาชนะคำตอบของ Logan Dam ถ้าฉันจะทำใน Visual Studio

รุ่นที่อ่านเพิ่มเติมได้:

void e(string i)
    {
        var a = "";
        foreach (var d in i.ToUpper().GroupBy(x => x).OrderByDescending(u => u.Count()))
        {
            if (d.Key < 91 && d.Key > 64)
            {
                a += d.Key;
            }
        }
        for (int x = 65; x < 91; x++)
        {
            if (!a.Contains((char)x))
            {
                a += (char)x;
            }
        }
        a.Dump();
    }

ยิ่งรัก LINQ มากขึ้น! : D
ldam

3

C # (และ LINQ) 255 226 210 Bytes

ด้วยการใช้คำแนะนำของ Patrick Huizing ทำให้ขณะนี้ไวยากรณ์คิวรีสั้นลง:

namespace System.Linq{class P{static void Main(string[]a){Console.Write((from c in(a[0]+"ABCDEFGHIJKLMNOPQRSTUVWXYZ").ToUpper()where c>'@'&&c<'['group c by c into g orderby-g.Count()select g.Key).ToArray());}}}

คำอธิบาย:

Console.Write(
    (from c //declare our range variable
       in (a[0] + "ABCDEFGHIJKLMNOPQRSTUVWXYZ").ToUpper() //declare the datasource
     where c > '@' && c < '[' //include only letters
     group c by c into g //run of the mill group by
     orderby -g.Count() //order by descending
     select g.Key //we only want the actual letters
     ).ToArray() //mash it all into an array
  );

ไวยากรณ์ของวิธีการเทียบเท่า (217):

namespace System.Linq{class P{static void Main(string[]a){Console.Write((a[0]+"ABCDEFGHIJKLMNOPQRSTUVWXYZ").ToUpper().GroupBy(c=>c).OrderBy(c=>-c.Count()).Where(c=>c.Key>'@'&&c.Key<'[').Select(c=>c.Key).ToArray());}}}

โพสต์ต้นฉบับ:

namespace System.Linq{class P{static void Main(string[]a){(a[0]+"ABCDEFGHIJKLMNOPQRSTUVWXYZ").ToUpper().GroupBy(c=>c).OrderByDescending(c=>c.Count()).Where(c=>c.Key>'@'&&c.Key<'[').ToList().ForEach(c=>Console.Write(c.Key));}}}

นี่คือการส่งครั้งแรกของฉันและฉันควรจะทำสิ่งต่าง ๆ ในที่ทำงาน แต่นี่ดูเหมือนสนุกมากเพราะฉันรู้สึกว่าฉันสามารถมีส่วนร่วมได้ในครั้งเดียว

คำอธิบาย:

(a[0] + "ABCDEFGHIJKLMNOPQRSTUVWXYZ") //ensure each character appears once
  .ToUpper()
  .GroupBy(c => c) //get access to .Count()
  .OrderByDescending(c => c.Count())
  .Where(c => c.Key > '@' && c.Key < '[') //exclude anything other than letters
  .ToList() //Only lists have a .ForEach() :(
  .ForEach(c => Console.Write(c.Key)); //print output

ฉันไม่เคยใช้ไวยากรณ์วิธีสำหรับ LINQ ดังนั้นนี่เป็นประสบการณ์การเรียนรู้สำหรับฉัน :) และเมื่อคิดถึงตอนนี้ฉันสามารถบันทึกได้ 2 ไบต์ด้วยการแทนที่ตัวอักษรตัวอักษรด้วยจำนวนเต็มเต็ม แต่ meh

ขอบคุณสั้น ๆ จากเคล็ดลับจาก ProgramFOX และ Num Lock :)

ไวยากรณ์เคียวรีเทียบเท่า (อีกเล็กน้อย):

(from c in (a[0]+"ABCDEFGHIJKLMNOPQRSTUVWXYZ").ToUpper() where c>'@'&&c<'[' group c by c into g orderby g.Count() descending select g.Key).ToList().ForEach(c=>Console.Write(c));

1
เมื่อวันที่ดูครั้งแรกคุณสามารถบันทึกจำนวนมากของตัวละครโดยการตั้งชื่อชั้นของคุณเพียงแค่PแทนProgramและstring[]aแทนstring[] argsและแทนc=>... (c)=>...
Num Lock

แทนที่จะเป็นสองusingประโยคคุณสามารถใส่คลาสของคุณไว้ในSystem.Linqเนมสเปซและลบทั้งสองข้อความโดยใช้คำสั่ง จากนั้นคุณสามารถบันทึกตัวละครบางตัวและมันจะยังทำงานได้ดี
ProgramFOX

@NumLock ใช่แล้วยังไม่ได้คิด :) @ProgramFOX ที่จะไม่ช่วยฉันอะไรเลยเพราะnamespaceนานกว่าusingและอีกสองรายการพิเศษ{}จะทำให้ฉันเสียค่าใช้จ่ายมากขึ้น
ldam

1
namespace System.Linq{}ชัดเจนกว่าusing System;using System.Linq;แค่มองดู ความคิดคือการละเว้นทั้งสองusingอย่างสมบูรณ์
Num Lock

อ่าใช่มันลบทั้งสองคุณพูดถูกฉันคิดว่าจะลบมันออกไปเท่านั้น ขอบคุณ
ldam

3

C ++ 701 322 232 ไบต์

รุ่นแรก 701 ไบต์ (การใช้ STL แบบใช้สำนวน)

#define _HAS_TRADITIONAL_STL 1
#include <numeric>
#include <iostream>
#include <iterator>
#include <string>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#define ALL(x) x.begin(), x.end()
using namespace std;
typedef istream_iterator<char> iic;typedef pair<int, char> pic;map<char, int> c;set<pic> d;
void f1(char x) {c[x]--;}
void f2(const pic &p) {d.insert(make_pair(p.second, p.first));}
int main(){string s(26, 0);stdext::iota(ALL(s), 65);copy(ALL(s), ostream_iterator<char>(cout));transform(iic(cin), iic(), back_inserter(s), toupper);for_each(ALL(s), f1);for_each(ALL(c), f2);transform(ALL(c2), ostream_iterator<char>(cout), select2nd<pic>());}

เวอร์ชั่นขยายที่สะอาด:

#define _HAS_TRADITIONAL_STL 1
#include <numeric>
#include <iostream>
#include <iterator>
#include <string>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
using namespace std;

typedef istream_iterator<char> iic;
map<char, int> counts;
set<pair<int, char> > counts2;

void docount(char ch) { counts[ch]--; }
void toCounts2(const pair<char, int> &p) { counts2.insert(make_pair(p.second, p.first)); }

int main()
{
    string s(26, 0);
    stdext::iota(s.begin(), s.end(), 65);
    transform(iic(cin), iic(), back_inserter(s), toupper);
    for_each(s.begin(), s.end(), docount);
    for_each(counts.begin(), counts.end(), toCounts2);
    transform(counts2.begin(), counts2.end(), ostream_iterator<char>(cout), select2nd< pair<int, char> >());
}

แนวคิดคือการสาธิตโปรแกรม C ++ ที่เหมาะสมโดยไม่มีแฮ็คใด ๆ ดูรายละเอียด boilerplate และความจริงที่ว่านี้รวบรวมใน VC ++ เท่านั้น

คำอธิบาย:

เราเติม A ถึง Z ลงในสตริงด้วยiota ()เพื่อให้แน่ใจว่าเมื่อเรานับจำนวนที่เกิดขึ้นแต่ละอักขระจะปรากฏแม้ว่าจะไม่ได้อยู่ในอินพุต

Transform ()คัดลอกอักขระโดยใช้อักขระจากอินพุตมาตรฐานและวางไว้ที่ส่วนท้ายของ s หลังจากเรียกtoupper ()บนแต่ละรายการ

จำนวนของตัวละครแต่ละตัวจะลดลงในแผนที่ (โดยการรักษานับเชิงลบเราสามารถมีการเรียงลำดับจากมากไปน้อยโดยไม่มีรหัสพิเศษ)

รายการแผนที่นับจะถูกคัดลอกไปยังชุดของคู่การแลกเปลี่ยน (ถ่านนับ) ไปยัง (นับ, ถ่าน) เมื่อมีการสั่งซื้อชุดเราจะได้รับเรียงโดยการลดจำนวนความถี่

ในที่สุดเราก็คัดลอกเนื้อหาของชุดออกมาตรฐานใช้การแปลงและใช้select2nd ()เพื่อเลือกเฉพาะสมาชิกที่สองของคู่

รหัสสามารถอ่านได้ค่อนข้าง วิธีแก้ปัญหา C ++ 11 นั้นดูดีกว่ามากเพราะเราสามารถใช้ lambdas ได้

รุ่น C ++ 11 - ไม่จำเป็นต้องใช้ lambdas แต่เป็นระบบอัตโนมัติและช่วงที่ทำให้สิ่งต่าง ๆ สะอาด (ลองนึกดูว่าคุณสามารถทำได้คล้ายกับ C ++ 98 ทั่วไป)

#include<iostream>
#include<iterator>
#include<map>
#include<set>
using namespace std;int main(){istream_iterator<char> b(cin),e;map<char,int> c;set<pair<int,char>> d;for(char i='A';i<='Z';++i){--c[i];}for(auto i=b;i!=e;++i){c[toupper(*i)]--;}for(auto p:c){d.insert(make_pair(p.second,p.first));}for(auto p:d){cout<<p.second;}}

รุ่นขยาย:

#include <iostream>
#include <iterator>
#include <map>
#include <set>
using namespace std;
int main()
{
    istream_iterator<char> b(cin), e;
    map<char, int> c;
    set<pair<int, char>> d;
    for(char i = 'A'; i <= 'Z'; ++i) {--c[i];}
    for(auto i = b; i != e; ++i) {c[toupper(*i)]--;}
    for(auto p : c) { d.insert(make_pair(p.second, p.first)); }
    for(auto p : d) { cout << p.second; }
}

การทำซ้ำครั้งถัดไป (ทำไมอ่านจาก stdin เมื่อเรามี argv):

#include <set>
#include <iostream>
int c[256];int main(int n, char **s){std::set<std::pair<int,char>> d;while(*s[1]){c[toupper(*s[1]++)]--;}for(n=65;n<92;++n){d.insert(std::make_pair(--c[n],n));}for(auto p:d){std::cout<<p.second;}}

รุ่นขยาย:

#include <set>
#include <iostream>
int c[256];
int main(int n, char **s)
{
    std::set<std::pair<int, char>> d;
    while (*s[1])
    {
        c[toupper(*s[1]++)]--;
    }
    for (n = 65; n < 92; n++)
    {
        d.insert(std::make_pair(--c[n], n));
    }
    for (auto p : d)
    {
        std::cout << p.second;
    }
}

3

เยลลี่ , 9 ไบต์ (ไม่แข่งขัน)

ØAŒuċ¥@ÞU

คำอธิบาย

ØAŒuċ¥@ÞU  Main Link
       Þ   Sort
ØA         The uppercase alphabet by
  Œuċ¥@    number of occurrences in the input:
  Œu       Uppercase
    ċ      Count occurrences
     ¥     Grammar: Last two links as a dyad
      @    Swap arguments
        U  Reverse (because sort sorts up)

สิ่งนี้อ่านว่า "เรียงตัวอักษรตัวพิมพ์ใหญ่ตามจำนวนเหตุการณ์ที่เกิดขึ้นในอินพุตตัวพิมพ์ใหญ่กลับรายการ" ซึ่งเป็นการแปลความท้าทายที่แท้จริงตามตัวอักษร: P

ลองออนไลน์!

ความท้าทายนี้เชื่อมโยงกับJelly HyperTrainingซึ่งเราแก้ไขความท้าทายได้แล้ว ฉันโพสต์สิ่งนี้เพราะฉันเป็นคนแรกที่ไปถึง 10 ไบต์

-1 ไบต์ขอบคุณ Erik the Outgolfer (อาจารย์ JHT)


9 bytes:ØAŒuċ¥@ÞU
Erik the Outgolfer

@EriktheOutgolfer โอ้เยี่ยมมากขอบคุณ!
HyperNeutrino

2

C ++ 377

ใช้ qsort โดยใช้การนับตัวอักษรในอาร์เรย์ n เพื่อเรียงลำดับตัวอักษรในอาร์เรย์ A เรียกใช้ผ่านบรรทัดคำสั่ง: golf.exe < in.txt

int n[26],c,k,N;
char A[26];
int C(const void*a,const void*b)
{
int i=(int)(*(char*)a -'A');
int j=(int)(*(char*)b -'A');
return n[j]-n[i];
}
int main()
{
for(;k<26;k++)
{
A[k]=k+'A';
}
N=sizeof(A);
c=getchar();
while(c>0)
{
c=toupper(c);
c=c-'A';
if(c>=0&&c<26)n[c]++;
c=getchar();
}
qsort(A,N,1,C);
for(k=0;k<N;k++)
{
putchar(A[k]);
}
return 0;
}

2

C, 117 (119) ไบต์

x[256];m=1;char c;main(){while(c=getchar()+1)++x[c-1&95];for(;m=x[++c]<x[m]?m:c;x[m<65|m>90||c?m*!c:putchar(m)]=-1);}
  • อินพุตบางตัวที่มีรหัส ASCII> = 128 จะเพิ่มความถี่จดหมายอย่างไม่ถูกต้อง ในการแก้ไขปัญหานี้ให้แทนที่ค่าคงที่95ด้วย223ค่าใช้จ่าย 1 ไบต์พิเศษ
  • นี้จะสิ้นสุดลงในช่วงต้นของปัจจัยการผลิตที่มีตัวละครที่มีรหัส ASCII 255 การแก้ไขปัญหานี้ที่ค่าใช้จ่ายของ 1 ไบต์พิเศษการเปลี่ยนแปลงchar c;เพียงc;และการ++cc=c+1%255

2

PowerShell - 139 ตัวอักษร

ก่อนอื่นฉันไม่ใช่ผู้เชี่ยวชาญ PowerShell ค่อนข้างแน่ใจว่าสั้นกว่านี้ แต่มีความสุขกับมันและตัดสินใจที่จะแบ่งปัน

$a = Read-host
$b = ($a.ToUpper() -replace '[^A-Z]','').ToCharArray() + (65..90|%{[char[]]$_})|Group|sort Count -desc|%{$_.Name}
-join $b

มันทำงานอย่างไร:

$a = Read-host            # read from stdin and save into a string var $a
$a.ToUpper()              # Convert the string to UPPERCASE
-replace'[^A-Z]',''       # Remove all non A-Z characters from the str
(...).ToCharArray()       # Convert the inner object (string) to a Char Array
+  (65..90|%{[char[]]$_}) # Create another char array with A-Z chars expanded, 
                          #  and append it to the previous one.
|Group                    # Group the char array by value for each element, 
                          #  consolidates them and count each char occurrence. Example:
                          #  Count | Name
                          #  ----- | -----
                          #      4 | B
                          #      1 | F
                          #      2 | C 
                          #     .. | ..
                          # 
|sort Count -desc         # Sorts the previous hash-table by the 'Count' column 
                          #   in desc ordering
|%{$_.Name}               # Grab only the 'Name' column from the previous sorted hash-table. 
                          # The retuslt obj will be a simple char array again, 
                          #   with the letters in the desired order
$b = (...)                # Saves the resulting char array into a new variable $b
-join $b                  # join the resulting char array elements into a single 
                          #   string, and print it to stdout. 


2

APL, 26 20 ตัวอักษร

⎕a[⍒+/⎕a∘.=('\w'⎕r'\u0')⍞]

⎕a[⍒+/⎕a∘.=1(819⌶)⍞]

-6 ขอบคุณอดัม


1
('\w'⎕r'\u0')1(819⌶)
Adám
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.