11

次の大統領のリストが与えられた場合、可能な限り最小のプログラムで上位 10 語数を数えます。

入力ファイル

    ワシントン
    ワシントン
    アダムス
    ジェファーソン
    ジェファーソン
    マディソン
    マディソン
    モンロー
    モンロー
    ジョン・クインシー・アダムス
    ジャクソン
    ジャクソン
    ヴァン・ビューレン
    ハリソン
    ダイ
    タイラー
    ポーク
    テイラー
    ダイ
    フィルモア
    ピアス
    ブキャナン
    リンカーン
    リンカーン
    ダイ
    ジョンソン
    許す
    許す
    ヘイズ
    ガーフィールド
    ダイ
    アーサー
    クリーブランド
    ハリソン
    クリーブランド
    マッキンリー
    マッキンリー
    ダイ
    テディ・ルーズベルト
    テディ・ルーズベルト
    タフト
    ウィルソン
    ウィルソン
    ハーディング
    クーリッジ
    フーバー
    FDR
    FDR
    FDR
    FDR
    死ぬ
    トルーマン
    トルーマン
    アイゼンハワー
    アイゼンハワー
    ケネディ
    ダイ
    ジョンソン
    ジョンソン
    ニクソン
    ニクソン
    退位する
    フォード
    カーター
    レーガン
    レーガン
    ブッシュ
    クリントン
    クリントン
    ブッシュ
    ブッシュ
    オバマ

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 FDR
      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 -cしてuniq -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ファイルを各行で1つの単語に分割するために使用するtr \ \\nことは、多くの空白行を作成するため、ソリューションよりも望ましい方法です。これは、ニクソンを見逃し、256回表示される空白の文字列を表示するため、ソリューションが正しくないことを意味します。ただし、空白の文字列は「単語」ではありません。

于 2009-07-04T17:31:57.870 に答える
7

vim 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'
+---------------------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------...
| | ワシントン ワシントン Adams Jefferson Jefferson Madison Madison Monroe Monroe John Quincy Adams Jackson Jackson Van Buren Harrison DIES Tyler Polk Taylor DIES Fillmore Pierce ...
+---------------------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------...
   注意。行に分割
   <;._2[1!:1<'input.txt'
+--------------------+------+---------+--------- --+-------------+-----------+-----------+------- ---+----------+---------------------+-----------+- ----------+-------------+-----------------+------- --+--------+---------------+------------+--------- ------...
| | ワシントン| ワシントン| アダムス| ジェファーソン| ジェファーソン| マディソン| マディソン| モンロー| モンロー| ジョン・クインシー・アダムス| ジャクソン| ジャクソン| ヴァン・ビューレン| ハリソン・ダイス| タイラー| ポーク| テイラー・ダイス| フィルモア| ピアス| ...
+--------------------+------+---------+--------- --+-------------+-----------+-----------+------- ---+----------+---------------------+-----------+- ----------+-------------+-----------------+------- --+--------+---------------+------------+--------- ------...
   注意。言葉に分ける
   ;;:&.><;._2[1!:1<'input.txt'
+------------+------------+-----+---------+---------+- ------+-------+------+------+----+------+-----+--- ----+------+---+-----+--------+----+-----+----+-- ----+----+--------+------+--------+-------+------- +----+-------+-----+-----+-----+--------+----+---- --+---...
|ワシントン|ワシントン|アダムス|ジェファーソン|ジェファーソン|マディソン|マディソン|モンロー|モンロー|ジョン|クインシー|アダムス|ジャクソン|ジャクソン|ヴァン|ビューレン|ハリソン|ダイス|タイラー|ポーク|テイラー|ダイス|フィルモア|ピアース|ブキャナン|リンカーン|リンカーン|ダイス|ジョンソン|グラント|グラント|ヘイズ|ガーフィールド|ダイス|アーサー|クレ...
+------------+------------+-----+---------+---------+- ------+-------+------+------+----+------+-----+--- ----+------+---+-----+--------+----+-----+----+-- ----+----+--------+------+--------+-------+------- +----+-------+-----+-----+-----+--------+----+---- --+---...
   注意。繰り返しを数える
   |:~.(,.~[:<"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 ...
+------------+-----+---------+-------+------+----+-- ----+------+---+-----+--------+----+-----+----+-- ----+--------+------+--------+-------+-------+---- -------+--------+------+---------+--------+------- --+----+------+-------+--------+------+---+------+ ------...
|ワシントン|アダムス|ジェファーソン|マディソン|モンロー|ジョン|クインシー|ジャクソン|ヴァン|ビューレン|ハリソン|ダイス|タイラー|ポーク|テイラー|フィルモア|ピアース|ブキャナン|リンカーン|ジョンソン|グラント|ヘイズ|ガーフィールド|アーサー|クリーブランド|マッキンリー|ルーズベルト|タフト|ウィルソン|ハーディング|クーリッジ|フーバー|FDR|トルーマン|アイゼン...
+------------+-----+---------+-------+------+----+-- ----+------+---+-----+--------+----+-----+----+-- ----+--------+------+--------+-------+-------+---- -------+--------+------+---------+--------+------- --+----+------+-------+--------+------+---+------+ ------...
   注意。選別
   |:\:~~.(,.~[:<"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|FDR|ジョンソン|ブッシュ|ウィルソン|ワシントン|トルーマン|ルーズベルト|レーガン|ニクソン|モンロー|マッキンリー|マディソン|リンカーン|ジェファーソン|ジャクソン|ハリソン|グラント|アイゼンハワー|クリントン|クリーブランド|アダムス|ヴァン|タイラー|テイラー|タフト|クインシー|ポーク|ピアース|オバマ|ケネディ|ジョン|フーバー|ヘイズ|ハーディング|ガーフ...
+----+---+-------+----+------+----------+------+-- -------+------+-----+------+--------+-------+----- --+---------+-------+--------+-----+----------+--- --+---------+-----+---+-----+------+----+------+ ----+-----+-----+-------+----+------+-----+------ ------...
   注意。10を取る
   10{.\:~~.(,.~[:<"0@(+/)=/~);;:&.><;._2[1!:1<'input.txt'
+-+----------+
|6|ダイ |
+-+----------+
|4|FDR |
+-+----------+
|3|ジョンソン |
+-+----------+
|3|ブッシュ |
+-+----------+
|2|ウィルソン |
+-+----------+
|2|ワシントン|
+-+----------+
|2|トルーマン |
+-+----------+
|2|ルーズベルト |
+-+----------+
|2|レーガン |
+-+----------+
|2|ニクソン |
+-+----------+
于 2009-07-05T07:48:40.917 に答える
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 に答える
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 に答える
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

ルビー

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

vim38およびすべての入力で機能します

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

これまでのルビーでの私の最善の試み、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

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

これは、シェル スクリプトの圧縮バージョンです。入力データを合理的に解釈する (先頭または末尾の空白がない) ために、元の 2 番目の 'tr' および 'sed' コマンドはデータを変更しないことを観察します (挿入することによって検証されます)。適切なポイントで 'tee out.N' を実行し、出力ファイルのサイズをチェックする - 同じ)。シェルが必要とするスペースは人間よりも少なく、入力 I/O リダイレクトの代わりに cat を使用すると、スペースが無駄になります。

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

これは、スクリプトの最後の改行を含めて 50 文字になります。

さらに2つの観察があります(他の人の回答から抜粋):

  1. tailtail -10単独では ' 'と同等であり、
  2. この場合、数値ソートとアルファ ソートは同等です。

これは、さらに 7 文字分 (末尾の改行を含めて 43 文字まで) 縮小できます。

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

' xargs -n1' の代わりに ' ' (コマンド プレフィックスを指定しない) を使用するtrのは非常に賢い方法です。先頭、末尾、および複数の埋め込みスペースを処理します (このソリューションでは処理しません)。

于 2009-07-04T17:12:14.563 に答える
2

ルビー66B

puts (a=$<.read.split).uniq.map{|x|"#{a.count x} "+x}.sort.last 10
于 2009-07-07T14:41:31.500 に答える
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

エコーがすでにオフで、コマンド拡張と遅延変数展開がオンの場合、これは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 に答える