11

鉴于以下总统名单,请在可能的最小程序中计算前十名的字数:

输入文件

    华盛顿
    华盛顿
    亚当斯
    杰斐逊
    杰斐逊
    麦迪逊
    麦迪逊
    梦露
    梦露
    约翰昆西亚当斯
    杰克逊
    杰克逊
    范布伦
    哈里森
    模具
    泰勒
    波尔克
    泰勒
    模具
    菲尔莫尔
    刺穿
    布坎南
    林肯
    林肯
    模具
    约翰逊
    授予
    授予
    海耶斯
    加菲猫
    模具
    亚瑟
    克利夫兰
    哈里森
    克利夫兰
    麦金莱
    麦金莱
    模具
    泰迪·罗斯福
    泰迪·罗斯福
    塔夫脱
    威尔逊
    威尔逊
    哈丁
    柯立芝
    胡佛
    罗斯福
    罗斯福
    罗斯福
    罗斯福
    模具
    杜鲁门
    杜鲁门
    艾森豪威尔
    艾森豪威尔
    肯尼迪
    模具
    约翰逊
    约翰逊
    尼克松
    尼克松
    退位
    福特
    卡特
    里根
    里根
    衬套
    克林顿
    克林顿
    衬套
    衬套
    奥巴马

bash 97 个字符开始

cat input.txt | tr " " "\n" | tr -d "\t " | sed 's/^$//g' | sort | uniq -c | sort -n | tail -n 10

输出

      2 尼克松
      2 里根
      2 罗斯福
      2杜鲁门
      2华盛顿
      2 威尔逊
      3 布什
      3约翰逊
      4 罗斯福
      7 模具

打破你认为合适的关系!快乐四!

对于那些关心更多关于总统的信息的人,可以在这里找到。

4

16 回答 16

12

C#, 153:

读取文件p并将结果打印到控制台:

File.ReadLines(p)
    .SelectMany(s=>s.Split(' '))
    .GroupBy(w=>w)
    .OrderBy(g=>-g.Count())
    .Take(10)
    .ToList()
    .ForEach(g=>Console.WriteLine(g.Count()+"|"+g.Key));

如果仅生成列表而不打印到控制台,则为 93 个字符。

6|DIES
4|FDR
3|Johnson
3|Bush
2|Washington
2|Adams
2|Jefferson
2|Madison
2|Monroe
2|Jackson
于 2009-07-04T18:32:57.317 回答
11

较短的外壳版本:

xargs -n1 < input.txt | sort | uniq -c | sort -nr | head

如果您想要不区分大小写的排名,请更改uniq -cuniq -ci.

稍微短一点,如果您对排名被颠倒并且由于缺少空格而降低可读性感到高兴。这有 46 个字符:

xargs -n1<input.txt|sort|uniq -c|sort -n|tail

(如果允许您首先将输入文件重命名为简单的“i”,则可以将其删除为 38。)

观察到,在这种特殊情况下,没有一个单词出现超过 9 次,我们可以通过从最终排序中删除 '-n' 参数来减少 3 个字符:

xargs -n1<input.txt|sort|uniq -c|sort|tail

这使该解决方案减少到 43 个字符,而无需重命名输入文件。(或者 35,如果你愿意的话。)

使用xargs -n1将文件拆分为每行一个单词比tr \ \\n解决方案更可取,因为这会创建大量空白行。这意味着该解决方案不正确,因为它错过了 Nixon 并显示出现 256 次的空白字符串。但是,空白字符串不是“单词”。

于 2009-07-04T17:31:57.870 回答
7

维姆 60

    :1,$!tr " " "\n"|tr -d "\t "|sort|uniq -c|sort -n|tail -n 10
于 2009-07-04T16:42:26.673 回答
7

维姆 36

:%s/\W/\r/g|%!sort|uniq -c|sort|tail
于 2009-07-04T17:48:26.983 回答
5

Haskell,102 个字符(哇,与原始字符非常接近):

import List
(take 10.map snd.sort.map(\(x:y)->(-length y,x)).group.sort.words)`fmap`readFile"input.txt"

J,只有 55 个字符:

10{.\:~~.(,.~[:<"0@(+/)=/~);;:&.><;._2[1!:1<'input.txt'

(我还没有弄清楚如何在 J 中优雅地执行文本操作......它在数组结构化数据方面要好得多。)


   注意。读取文件
   <1!:1<'input.txt'
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------...
| 华盛顿华盛顿亚当斯杰斐逊杰斐逊麦迪逊麦迪逊梦露梦露约翰昆西亚当斯杰克逊杰克逊范布伦哈里森死了泰勒波尔克泰勒死菲尔莫尔皮尔斯...
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------...
   注意。分成几行
   <;._2[1!:1<'input.txt'
+--------------+--------------+----------+--------- ----+-------------+------------+-----------+------- ---+------------+---------+------------+- ----------+-------------+-----------------+-------- --+--------+---------------+------------+--------- -+----...
| 华盛顿| 华盛顿| 亚当斯| 杰斐逊| 杰斐逊| 麦迪逊| 麦迪逊| 梦露| 梦露| 约翰昆西亚当斯| 杰克逊| 杰克逊| 范布伦| 哈里森去世| 泰勒| 波尔克| 泰勒去世| 菲尔莫尔| 皮尔斯| ...
+--------------+--------------+----------+--------- ----+-------------+------------+-----------+------- ---+------------+---------+------------+- ----------+-------------+-----------------+-------- --+--------+---------------+------------+--------- -+----...
   注意。分成单词
   ;;:&.><;._2[1!:1<'input.txt'
+----------+----------+------+---------+---------+- ------+--------+------+------+----+------+-----+--- ----+-------+---+-----+--------+----+-----+----+-- ----+----+--------+-----+--------+-------+------- +----+-------+-----+-----+-----+--------+----+---- --+---...
|华盛顿|华盛顿|亚当斯|杰斐逊|杰斐逊|麦迪逊|麦迪逊|梦露|梦露|约翰|昆西|亚当斯|杰克逊|杰克逊|范|布伦|哈里森|DIES|泰勒|波尔克|泰勒|DIES|菲尔莫尔|皮尔斯|布坎南|林肯|林肯|DIES|约翰逊|格兰特|格兰特|海耶斯|加菲猫|DIES|亚瑟|克莱...
+----------+----------+------+---------+---------+- ------+--------+------+------+----+------+-----+--- ----+-------+---+-----+--------+----+-----+----+-- ----+----+--------+-----+--------+-------+------- +----+-------+-----+-----+-----+--------+----+---- --+---...
   注意。计算重复次数
   |:~.(,.~[:<"0@(+/)=/~);;:&.><;._2[1!:1<'input.txt'
+---------+------+---------+--------+------+----+-- ----+-------+---+-----+--------+----+-----+----+-- ----+--------+------+--------+-------+--------+---- -+-----+--------+------+---------+--------+------- --+----+------+--------+--------+------+---+------+ ------...
|2 |2 |2 |2 |2 |1 |1 |2 |1 |1 |2 |6 |1 |1 |1 |1 |1 |1 |2 |3 |2 |1 |1 |1 |2 |2 |2 |1 |2 |1 |1 |1 |4 |2 |2 ...
+---------+------+---------+--------+------+----+-- ----+-------+---+-----+--------+----+-----+----+-- ----+--------+------+--------+-------+--------+---- -+-----+--------+------+---------+--------+------- --+----+------+--------+--------+------+---+------+ ------...
|华盛顿|亚当斯|杰斐逊|麦迪逊|梦露|约翰|昆西|杰克逊|范|布伦|哈里森|DIES|泰勒|波尔克|泰勒|菲尔莫尔|皮尔斯|布坎南|林肯|约翰逊|格兰特|海耶斯|加菲尔德|亚瑟|克利夫兰|麦金利|罗斯福|塔夫脱|威尔逊|哈丁|柯立芝|胡佛|罗斯福|杜鲁门|艾森...
+---------+------+---------+--------+------+----+-- ----+-------+---+-----+--------+----+-----+----+-- ----+--------+------+--------+-------+--------+---- -+-----+--------+------+---------+--------+------- --+----+------+--------+--------+------+---+------+ ------...
   注意。种类
   |:\:~~.(,.~[:<"0@(+/)=/~);;:&.><;._2[1!:1<'input.txt'
+----+---+-------+----+------+----------+------+-- --------+------+-----+------+--------+--------+----- --+---------+-------+--------+-----+---------+--- ----+---------+-----+----+-----+------+----+------+ -----+-----+-----+-----+----+------+-----+------ -+----...
|6 |4 |3 |3 |2 |2 |2 |2 |2 |2 |2 |2 |2 |2 |2 |2 |2 |2 |2 |2 |2 |2 |1 |1 |1 |1 |1 |1 |1 |1 |1 |1 |1 |1 |1 |1 ...
+----+---+-------+----+------+----------+------+-- --------+------+-----+------+--------+--------+----- --+---------+-------+--------+-----+---------+--- ----+---------+-----+----+-----+------+----+------+ -----+-----+-----+-----+----+------+-----+------ -+----...
|DIES|罗斯福|约翰逊|布什|威尔逊|华盛顿|杜鲁门|罗斯福|里根|尼克松|门罗|麦金利|麦迪逊|林肯|杰斐逊|杰克逊|哈里森|格兰特|艾森豪威尔|克林顿|克利夫兰|亚当斯|范|泰勒|泰勒|塔夫脱|昆西|波尔克|皮尔斯|奥巴马|肯尼迪|约翰|胡佛|海耶斯|哈丁|加夫...
+----+---+-------+----+------+----------+------+-- --------+------+-----+------+--------+--------+----- --+---------+-------+--------+-----+---------+--- ----+---------+-----+----+-----+------+----+------+ -----+-----+-----+-----+----+------+-----+------ -+----...
   注意。拿 10
   10{.\:~~.(,.~[:<"0@(+/)=/~);;:&.><;._2[1!:1<'input.txt'
+-+----------+
|6|模具 |
+-+----------+
|4|罗斯福|
+-+----------+
|3|约翰逊 |
+-+----------+
|3|布什|
+-+----------+
|2|威尔逊 |
+-+----------+
|2|华盛顿|
+-+----------+
|2|杜鲁门 |
+-+----------+
|2|罗斯福|
+-+----------+
|2|里根|
+-+----------+
|2|尼克松 |
+-+----------+
于 2009-07-05T07:48:40.917 回答
3

珀尔:90

Perl:114(包括 perl、命令行开关、单引号和文件名)

perl -nle'$h{$_}++for split/ /;END{$i++<=10?print"$h{$_} $_":0for reverse sort{$h{$a}cmp$h{$b}}keys%h}' input.txt
于 2009-07-04T17:10:26.343 回答
3

缺少AWK令人不安。

xargs -n1<input.txt|awk '{c[$1]++}END{for(p in c)print c[p],p|"sort|tail"}'

75 个字符。

如果你想获得更多的 AWKy,你可以忘记 xargs:

awk -v RS='[^a-zA-Z]' /./'{c[$1]++}END{for(p in c)print c[p],p|"sort|tail"}' input.txt
于 2009-07-05T01:19:32.613 回答
2

这是 shell 脚本的压缩版本,观察到为了合理解释输入数据(没有前导或尾随空格),原始中的第二个 'tr' 和 'sed' 命令不会更改数据(通过插入验证'tee out.N' 在适当的点并检查输出文件大小 - 相同)。shell 需要的空间比人类少 - 使用 cat 而不是输入 I/O 重定向会浪费空间。

tr \  \\n<input.txt|sort|uniq -c|sort -n|tail -10

这有 50 个字符,包括脚本末尾的换行符。

还有两个观察结果(从其他人的答案中提取):

  1. tail就其本身等价于' tail -10',并且
  2. 在这种情况下,数字和字母排序是等价的,

这可以再缩小 7 个字符(包括尾随换行符在内的 43 个字符):

tr \  \\n<input.txt|sort|uniq -c|sort|tail

使用 ' xargs -n1' (没有给出命令前缀)而不是 ' tr' 是非常聪明的;它处理前导、尾随和多个嵌入空格(此解决方案不处理)。

于 2009-07-04T17:12:14.563 回答
2

到目前为止,我对 ruby​​ 的最佳尝试是 166 个字符:

h = Hash.new
File.open('f.l').each_line{|l|l.split(/ /).each{|e|h[e]==nil ?h[e]=1:h[e]+=1}}
h.sort{|a,b|a[1]<=>b[1]}.last(10).each{|e|puts"#{e[1]} #{e[0]}"}

我很惊讶没有人发布一个疯狂的 J 解决方案。

于 2009-07-04T18:13:14.807 回答
2

python 3.1(88个字符)

import collections
collections.Counter(open('input.txt').read().split()).most_common(10)
于 2009-07-04T18:51:40.827 回答
2

Python 2.6,104字符:

l=open("input.txt").read().split()
for c,n in sorted(set((l.count(w),w) for w in l if w))[-10:]:print c,n
于 2009-07-04T19:01:29.610 回答
2

vim 38适用于所有输入

:%!xargs -n1|sort|uniq -c|sort -n|tail
于 2009-07-04T19:13:14.817 回答
2

Perl86 个字符

94,如果你计算输入文件名。

perl -anE'$_{$_}++for@F;END{say"$_{$_} $_"for@{[sort{$_{$b}<=>$_{$a}}keys%_]}[0..10]}' test.in

如果您不在乎得到多少结果,那么它只有 75,不包括文件名。

perl -anE'$_{$_}++for@F;END{say"$_{$_} $_"for sort{$_{$b}<=>$_{$a}}keys%_}' test.in
于 2009-07-05T15:11:07.437 回答
2

红宝石 66B

puts (a=$<.read.split).uniq.map{|x|"#{a.count x} "+x}.sort.last 10
于 2009-07-07T14:41:31.500 回答
2

红宝石

115 个字符

w = File.read($*[0]).split
w.uniq.map{|x| [w.select{|y|x==y}.size,x]}.sort.last(10).each{|z| puts "#{z[1]} #{z[0]}"}
于 2009-07-10T15:17:54.450 回答
2

Windows 批处理文件

这显然不是最小的解决方案,但我还是决定发布它,只是为了好玩。:) 注意:批处理文件使用名为$的临时文件来存储临时结果。

带有注释的原始未压缩版本:

@echo off
setlocal enableextensions enabledelayedexpansion

set infile=%1
set cnt=%2
set tmpfile=$
set knownwords=

rem Calculate word count
for /f "tokens=*" %%i in (%infile%) do (
  for %%w in (%%i) do (

    rem If the word hasn't already been processed, ...
    echo !knownwords! | findstr "\<%%w\>" > nul
    if errorlevel 1 (

      rem Count the number of the word's occurrences and save it to a temp file
      for /f %%n in ('findstr "\<%%w\>" %infile% ^| find /v "" /c') do (
        echo %%n^|%%w >> %tmpfile%
      )

      rem Then add the word to the known words list
      set knownwords=!knownwords! %%w
    )
  )
)

rem Print top 10 word count
for /f %%i in ('sort /r %tmpfile%') do (
  echo %%i
  set /a cnt-=1
  if !cnt!==0 goto end
)

:end
del %tmpfile%

压缩和混淆版本,317 个字符:

@echo off&setlocal enableextensions enabledelayedexpansion&set n=%2&set l=
for /f "tokens=*" %%i in (%1)do for %%w in (%%i)do echo !l!|findstr "\<%%w\>">nul||for /f %%n in ('findstr "\<%%w\>" %1^|find /v "" /c')do echo %%n^|%%w>>$&set l=!l! %%w
for /f %%i in ('sort /r $')do echo %%i&set /a n-=1&if !n!==0 del $&exit /b

如果 echo 已关闭并且命令扩展和延迟变量扩展已打开,则可以将其缩短为258个字符:

set n=%2&set l=
for /f "tokens=*" %%i in (%1)do for %%w in (%%i)do echo !l!|findstr "\<%%w\>">nul||for /f %%n in ('findstr "\<%%w\>" %1^|find /v "" /c')do echo %%n^|%%w>>$&set l=!l! %%w
for /f %%i in ('sort /r $')do echo %%i&set /a n-=1&if !n!==0 del $&exit /b

用法:

> filename.bat input.txt 10 & pause

输出:

6|DIES
4|FDR
3|Johnson
3|Bush
2|Wilson
2|Washington
2|Truman
2|Roosevelt
2|Reagan
2|Nixon
于 2009-07-29T19:19:45.643 回答