2009-07-04 2 views
11

Учитывая следующий список президентов сделать топ количество десять слов в наименьшей программе возможно:Code Golf четвёртого издания июля: Counting Лучшие Десять употребляемые слова

входной файл

 
    Washington 
    Washington 
    Adams 
    Jefferson 
    Jefferson 
    Madison 
    Madison 
    Monroe 
    Monroe 
    John Quincy Adams 
    Jackson 
    Jackson 
    Van Buren 
    Harrison 
    DIES 
    Tyler 
    Polk 
    Taylor 
    DIES 
    Fillmore 
    Pierce 
    Buchanan 
    Lincoln 
    Lincoln 
    DIES 
    Johnson 
    Grant 
    Grant 
    Hayes 
    Garfield 
    DIES 
    Arthur 
    Cleveland 
    Harrison 
    Cleveland 
    McKinley 
    McKinley 
    DIES 
    Teddy Roosevelt 
    Teddy Roosevelt 
    Taft 
    Wilson 
    Wilson 
    Harding 
    Coolidge 
    Hoover 
    FDR 
    FDR 
    FDR 
    FDR 
    Dies 
    Truman 
    Truman 
    Eisenhower 
    Eisenhower 
    Kennedy 
    DIES 
    Johnson 
    Johnson 
    Nixon 
    Nixon 
    ABDICATES 
    Ford 
    Carter 
    Reagan 
    Reagan 
    Bush 
    Clinton 
    Clinton 
    Bush 
    Bush 
    Obama 

Чтобы начать его в Баш 97 символов

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

Выход

 
     2 Nixon 
     2 Reagan 
     2 Roosevelt 
     2 Truman 
     2 Washington 
     2 Wilson 
     3 Bush 
     3 Johnson 
     4 FDR 
     7 DIES 

Перерыв на связи, как вы видите! Счастливый четвертый!

Для тех из вас, кто интересуется более подробной информацией о президентах, можно найти here.

+0

Если не список различий между Бушем-младшим и старшим? – gnovice

+1

также, не FDR умереть, как хорошо? кажется, что многие решения не читают вопрос, много ответов не разбивают слова, просто сортируя список после группы. – jasonmw

+0

Heh FDR FDR FDR FDR Это было из памяти, я знаю ... Я согласен с обоими пунктами, но в духе веселья ... пусть это будет ездить ... – ojblass

ответ

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 

(Вы можете Strip это до 38, если вы разрешили переименовать файл ввода, просто «я» первый.)

Заметив, что в этом частном случае , ни слова не встречаются более чем в 9 раз, мы можем сбрить больше 3-х символов, понижая «-n» аргумент из окончательного вида:

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

что принимает это решение до 43 символов без переименования входного файла. (Или 35, если да.)

Использование xargs -n1 для разбиения файла на одно слово на каждой строке предпочтительнее для решения tr \ \\n, так как это создает много пустых строк. Это означает, что решение неверно, потому что оно пропускает Nixon и показывает пустую строку, показывающую 256 раз. Однако пустая строка не является «словом».

+1

выдающийся ... вы действительно больны ... – ojblass

+0

Использование xargs является умным - оно работает, даже если данные пронизаны ведущими и завершающими пробелами. И хорошо видно, что «хвост» печатает последние десять строк вывода (я забыл); который сохраняет еще 4 символа. –

+4

+1 для умного использования xargs –

7

ВИМ 60

 
    :1,$!tr " " "\n"|tr -d "\t "|sort|uniq -c|sort -n|tail -n 10 
+0

+1 - Это не часто, когда vim попадает в Code Golf. –

+0

+1 F * CK YEAH !!! – Tom

+1

': 1, $!' Можно заменить на ':%!', Не так ли? – ephemient

3

Perl: 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 
+1

Я думал наверняка, что Perl будет номером один ... – ojblass

+0

Несколько простых трюков сжимают всю команду до 84: perl -ne '$ _ {$ _. $ /} ++ для + split} print + (sort {$ _ {$ b} <=> $ _ {$ a}} keys% _) [0..9]; {'input.txt – ephemient

2

Вот сжатая версия сценария оболочки, заметив, что для разумной интерпретации входных данных (без начальных или конечных пробелов), что вторая команда «tr» и «sed» в оригинале не изменяют данные (проверяется путем вставки «tee out.N» в подходящие точки и проверки размер выходного файла - идентичный). Оболочке требуется меньше пробелов, чем люди - и использование cat вместо ввода ввода-вывода перенаправляет пространство.

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' очень умно; он имеет дело с ведущими, конечными и множественными встроенными пространствами (которые этого решения нет).

+0

Хорошая работа ... всегда разные способы думать о вещах ... – ojblass

7

Vim 36

:%s/\W/\r/g|%!sort|uniq -c|sort|tail
+1

Ницца! Работа там ... – ojblass

+0

Учитывая этот ввод, он работает, но разве это не приводит к опасности лексической сортировки чисел? – ojblass

+0

совершенно. но/учитывая этот вход /, я могу обойтись без этих дополнительных трех символов :) –

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 еще.

+0

вы можете заменить первую строку на h = {} –

+0

Также вы можете заменить .eac бит h_line дает вам это для первой строки: File.open ('f.1'). each {| l | l.split (/ /).each{|e|h[e]==nil? h [e] = 1: h [e] + = 1}} сохраняет вас 4 персонажа –

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 
+1

Моя главная жалоба на Java и CSharp - это их многословие ... вы могли бы сократить его с помощью некоторого эквивалента использования ...? – ojblass

+2

Это довольно аккуратно и аккуратно, подумал я. И, по крайней мере, полупознаваемый, по крайней мере, по сравнению с версией Perl. –

+0

«ReadLines» должен быть «ReadAllLines». Кроме того, это может быть немного короче, если вы удалите .ToList(), поскольку вы можете предвидеть над IEnumerable, что Take возвращает. Итак: foreach (var v в File.ReadAllLines (p) .SelectMany (s => s.Split ('')) .GroupBy (w => w) .OrderBy (g => -1 * g.Count()) .Take (10)) Console.WriteLine (v.Count() + "|" + v.Key); – JulianR

2

питон 3,1 (88 символов)

import collections 
collections.Counter(open('input.txt').read().split()).most_common(10) 
+0

Счетчик находится в коллекциях, а не itertools. Это также не выводит вывод и его в обратном порядке по сравнению с выходом исходного вопроса. – truppo

+0

Да, это была опечатка. но я не вижу смысла удовлетворять все прихоти OP. Почему это происходит в порядке возрастания и не убывания? он печатается при запуске в интерпретаторе. – SilentGhost

+0

код гольфа не позволяет использовать модули –

2

Python 2.6, симв:

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 
+0

вам вообще не нужно. взгляните на мой ответ. – SilentGhost

2

ВИМ 38 и работает для всех входных

:%!xargs -n1|sort|uniq -c|sort -n|tail 
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 
+0

получите свой awk! er thats scary ... Happy Fourth! – ojblass

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{.\:~~.(,.~[:<"[email protected](+/)=/~);;:&.><;._2[1!:1<'input.txt' 

(Мне еще предстоит выяснить, как элегантно выполнять текстовое манипулирование ulations в J ... это намного лучше массив данных структурированная)


 
    NB. read the file 
    <1!:1<'input.txt' 
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------... 
| Washington  Washington  Adams  Jefferson  Jefferson  Madison  Madison  Monroe  Monroe  John Quincy Adams  Jackson  Jackson  Van Buren  Harrison DIES  Tyler  Polk  Taylor DIES  Fillmore  Pierce  ... 
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------... 
    NB. split into lines 
    <;._2[1!:1<'input.txt' 
+--------------+--------------+---------+-------------+-------------+-----------+-----------+----------+----------+---------------------+-----------+-----------+-------------+-----------------+---------+--------+---------------+------------+----------+----... 
| Washington| Washington| Adams| Jefferson| Jefferson| Madison| Madison| Monroe| Monroe| John Quincy Adams| Jackson| Jackson| Van Buren| Harrison DIES| Tyler| Polk| Taylor DIES| Fillmore| Pierce| ... 
+--------------+--------------+---------+-------------+-------------+-----------+-----------+----------+----------+---------------------+-----------+-----------+-------------+-----------------+---------+--------+---------------+------------+----------+----... 
    NB. split into words 
    ;;:&.><;._2[1!:1<'input.txt' 
+----------+----------+-----+---------+---------+-------+-------+------+------+----+------+-----+-------+-------+---+-----+--------+----+-----+----+------+----+--------+------+--------+-------+-------+----+-------+-----+-----+-----+--------+----+------+---... 
|Washington|Washington|Adams|Jefferson|Jefferson|Madison|Madison|Monroe|Monroe|John|Quincy|Adams|Jackson|Jackson|Van|Buren|Harrison|DIES|Tyler|Polk|Taylor|DIES|Fillmore|Pierce|Buchanan|Lincoln|Lincoln|DIES|Johnson|Grant|Grant|Hayes|Garfield|DIES|Arthur|Cle... 
+----------+----------+-----+---------+---------+-------+-------+------+------+----+------+-----+-------+-------+---+-----+--------+----+-----+----+------+----+--------+------+--------+-------+-------+----+-------+-----+-----+-----+--------+----+------+---... 
    NB. count reptititions 
    |:~.(,.~[:<"[email protected](+/)=/~);;:&.><;._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  ... 
+----------+-----+---------+-------+------+----+------+-------+---+-----+--------+----+-----+----+------+--------+------+--------+-------+-------+-----+-----+--------+------+---------+--------+---------+----+------+-------+--------+------+---+------+------... 
|Washington|Adams|Jefferson|Madison|Monroe|John|Quincy|Jackson|Van|Buren|Harrison|DIES|Tyler|Polk|Taylor|Fillmore|Pierce|Buchanan|Lincoln|Johnson|Grant|Hayes|Garfield|Arthur|Cleveland|McKinley|Roosevelt|Taft|Wilson|Harding|Coolidge|Hoover|FDR|Truman|Eisenh... 
+----------+-----+---------+-------+------+----+------+-------+---+-----+--------+----+-----+----+------+--------+------+--------+-------+-------+-----+-----+--------+------+---------+--------+---------+----+------+-------+--------+------+---+------+------... 
    NB. sort 
    |:\:~~.(,.~[:<"[email protected](+/)=/~);;:&.><;._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|Johnson|Bush|Wilson|Washington|Truman|Roosevelt|Reagan|Nixon|Monroe|McKinley|Madison|Lincoln|Jefferson|Jackson|Harrison|Grant|Eisenhower|Clinton|Cleveland|Adams|Van|Tyler|Taylor|Taft|Quincy|Polk|Pierce|Obama|Kennedy|John|Hoover|Hayes|Harding|Garf... 
+----+---+-------+----+------+----------+------+---------+------+-----+------+--------+-------+-------+---------+-------+--------+-----+----------+-------+---------+-----+---+-----+------+----+------+----+------+-----+-------+----+------+-----+-------+----... 
    NB. take 10 
    10{.\:~~.(,.~[:<"[email protected](+/)=/~);;:&.><;._2[1!:1<'input.txt' 
+-+----------+ 
|6|DIES  | 
+-+----------+ 
|4|FDR  | 
+-+----------+ 
|3|Johnson | 
+-+----------+ 
|3|Bush  | 
+-+----------+ 
|2|Wilson | 
+-+----------+ 
|2|Washington| 
+-+----------+ 
|2|Truman | 
+-+----------+ 
|2|Roosevelt | 
+-+----------+ 
|2|Reagan | 
+-+----------+ 
|2|Nixon  | 
+-+----------+ 
+2

J == Klingon ????? Как вы можете сохранить этот код? – ojblass

+0

Я полагаю, что наиболее очевидная проблема заключается в том, что поток символов бессмыслен, не зная набора символов и словаря J ... но это не так уж плохо. Существуют ли какие-либо языки для продвижения поддерживаемых однострочных линий? – ephemient

+0

хорошо, мой ответ обеспечивает наиболее читаемое решение этой проблемы. – SilentGhost

2

Пересмотр на previous entry, который должен спасти 10 символов:.

h = {} 
File.open('f.1').each {|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]}"} 
+0

Я понятия не имел, как предварительно обработать код в ответ - это не запись, а поддержка кода предыдущего участника. –

2

Perl 86 символов

94, если вы считаете входное имя файла.

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

Если вам все равно, сколько результатов вы получите, тогда это всего 75, за исключением имени файла.

perl -anE'$_{$_}[email protected];END{say"$_{$_} $_"for sort{$_{$b}<=>$_{$a}}keys%_}' test.in 
+1

Ah, -E требует Perl 5.10. – ephemient

2

Рубин 66B

puts (a=$<.read.split).uniq.map{|x|"#{a.count x} "+x}.sort.last 10 
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]}"} 
2

Окна Batch File

Это, очевидно, п от самого маленького решения, но я решил опубликовать его в любом случае, просто для удовольствия. :) NB: командный файл использует временный файл с именем $ для хранения временных результатов.

Оригинал несжатый версия с комментариями:

@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% 

Сжатого & затемненной версии, символов:

@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 

Это может быть сокращено до символов, если эхо уже выключено и команды расширения и замедленное переменное расширение:

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 
+1

MY EYES !!! 1 11 – Tom

+1

Я пошел оглянуться назад на этот пост, и я рад, что это сделал. Вы сделали очень хорошую работу, сделав это на действительно отсталом языке. – ojblass

Смежные вопросы