2009-07-04 9 views
11

Data la seguente lista di presidenti non un top numero di dieci parole nel programma più piccolo possibile:Codice Golf 4 Luglio Edizione: Conteggio Top Ten avvenuti Parole

INPUT FILE

 
    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 

Per iniziare fuori in bash 97 caratteri

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

uscita:

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

Rompere i legami come meglio credi! Buon quarto!

Per quelli di voi che si preoccupano più informazioni sui presidenti possono essere trovati here.

+0

Non dovrebbe la lista distinguere tra Bush Jr. e Sr.? – gnovice

+1

inoltre, anche FDR non muore? sembra che molte delle soluzioni non stiano leggendo la domanda, molte risposte non stanno rompendo le parole, semplicemente ordinando la lista dopo un gruppo di. – jasonmw

+0

Heh FDR FDR FDR FDR Questo era dalla memoria, lo so ... sono d'accordo con entrambi i punti ma nello spirito del divertimento ... lascia che cavalchi ... – ojblass

risposta

11

Una versione più breve di shell:

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

Se volete caso classifica insensitive, modificare uniq -c in uniq -ci.

Un po 'più breve ancora, se si è soddisfatti del rango invertito e della leggibilità compromessa dalla mancanza di spazi. Questo orologi in 46 caratteri:

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

(Si potrebbe spogliare questo fino a 38 se si era permesso di rinominare il file di input semplicemente "i" prima.)

Osservando che, in questo caso particolare , nessuna parola si verificano più di 9 volte siamo in grado di radere altre 3 caratteri facendo cadere l'argomento '-n' dal tipo finale:

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

che prende questa soluzione fino a 43 caratteri senza rinominare il file di input. (O 35, se lo fai.)

Utilizzare xargs -n1 per dividere il file in una parola su ogni riga è preferibile alla soluzione tr \ \\n, in quanto ciò crea molte righe vuote. Ciò significa che la soluzione non è corretta, perché manca Nixon e mostra una stringa vuota che mostra 256 volte. Tuttavia, una stringa vuota non è una "parola".

+1

eccezionale ... tu sono davvero malati ... – ojblass

+0

L'uso di xargs è intelligente: funziona anche se i dati sono allacciati con spazi vuoti iniziali e finali. Ed è una buona osservazione che "tail" da solo stampa le ultime dieci righe di output (che avevo dimenticato); che salva altri 4 caratteri. –

+4

+1 per l'uso intelligente di xargs –

7

vim 60

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

+1 - Non capita spesso di entrare in Code Golf. –

+0

+1 F * CK YEAH !!! – Tom

+1

': 1, $!' Può essere sostituito da ':%!', No? – ephemient

3

Perl: 90

Perl: 114 (Compreso Perl, della linea di comando, apici e nome)

perl -nle'$h{$_}++for split/ /;END{$i++<=10?print"$h{$_} $_":0for reverse sort{$h{$a}cmp$h{$b}}keys%h}' input.txt 
+1

Ho pensato che Perl sarebbe stato il numero uno ... – ojblass

+0

Alcuni semplici trucchi riducono l'intero comando a 84: perl -ne '$ _ {$ _. $ /} ++ per + split} print + (sort {$ _ {$ b} <=> $ _ {$ a}} tasti% _) [0..9]; {'input.txt – ephemient

2

Ecco una versione compressa dello script della shell, osservandolo per una ragionevole interpretazione dei dati di input (senza spazi vuoti iniziali o finali) che il secondo comando 'tr' e 'sed' nell'originale non cambino i dati (verificato inserendo 'tee out.N' in punti appropriati e controllando le dimensioni del file di output - identiche). La shell ha bisogno di meno spazi rispetto agli umani - e usa cat invece dello spazio di spreco di reindirizzamento degli I/O di input.

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

Questo pesa in 50 caratteri incluso il fine riga alla fine della sceneggiatura.

Con due ulteriori osservazioni (tirato da risposte di altre persone):

  1. tail da solo equivale a 'tail -10', e
  2. in questo caso, l'ordinamento numerico e alfa sono equivalenti,

questo può essere ridotto di un ulteriore 7 caratteri (a 43 compreso fine riga):

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

L'utilizzo di 'xargs -n1' (senza prefisso di comando fornito) anziché 'tr' è estremamente intelligente; si occupa di spazi iniziali, finali e multipli (che questa soluzione non comporta).

+0

Buon lavoro ... sempre diversi modi di pensare a cose ... – ojblass

7

Vim 36

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

Bello! Ci lavoro ... – ojblass

+0

dato questo input funziona, ma questo non corre il rischio di ordinare i numeri in modo lessicale? – ojblass

+0

assolutamente. ma/dato questo input /, posso fare a meno di quei tre caratteri extra :) –

2

La mia migliore prova con rubino finora, 166 caratteri:

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]}"} 

Sono sorpreso che nessuno ha scritto una soluzione pazza J ancora.

+0

è possibile sostituire la prima riga con h = {} –

+0

Inoltre, è possibile sostituire il file .eac h_line bit che ti dà questo per una prima riga: File.open ('f.1'). each {| l | l.split (/ /).each{|e|h[e]==nil? h [e] = 1: h [e] + = 1}} salva 4 caratteri –

12

C#, 153:

Legge nel file a p e stampa i risultati alla console:

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

Se solo produrre l'elenco, ma non la stampa alla console, è di 93 caratteri.

6|DIES 
4|FDR 
3|Johnson 
3|Bush 
2|Washington 
2|Adams 
2|Jefferson 
2|Madison 
2|Monroe 
2|Jackson 
+1

La mia lamentela maggiore con Java e CSharp è la loro verbosità ... potresti accorciarlo con qualche equivalente di utilizzo ...? – ojblass

+2

Questo è abbastanza pulito e ordinato, ho pensato. E almeno semi-comprensibile, almeno rispetto alla versione Perl. –

+0

'ReadLines' dovrebbe essere 'ReadAllLines'. Inoltre, può essere un po 'più breve se si rimuove .ToList() come si può foreach su IEnumerable che Take restituisce. Quindi: foreach (var v in 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

pitone 3,1 (88 caratteri)

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

Il contatore risiede nelle raccolte, non itertools. Anche questo non stampa l'output e il suo nell'ordine inverso rispetto all'output della domanda originale. – truppo

+0

sì, quello era un errore di battitura. ma non vedo alcun motivo nel soddisfare tutti i capricci dell'OP. Perché è in ordine ascendente e non discendente? stampa quando viene eseguito nell'interprete. – SilentGhost

+0

codice golf non consente l'utilizzo dei moduli –

2

Python 2.6, chars:

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

non ti serve affatto. dai un'occhiata alla mia risposta – SilentGhost

2

vim 38 e funziona per tutti gli input

:%!xargs -n1|sort|uniq -c|sort -n|tail 
3

La mancanza di AWK è disturbante.

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

75 caratteri.

Se si vuole ottenere un po 'più AWKy, si può dimenticare xargs:

awk -v RS='[^a-zA-Z]' /./'{c[$1]++}END{for(p in c)print c[p],p|"sort|tail"}' input.txt 
+0

attira l'attenzione! Questo è un po 'spaventoso ... Buon quarto! – ojblass

5

Haskell, 102 caratteri (wow, così vicino alla corrispondenza all'originale):

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

J, solo 55 caratteri:

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

(ho ancora capire come eseguire elegantemente manip testo ulazioni in J ... è molto meglio a dati su array strutturato)


 
    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 ????? Come puoi mantenere quel codice? – ojblass

+0

Suppongo che il problema più ovvio sia che il flusso di simboli non ha senso senza conoscere il set di caratteri e il vocabolario di J ... ma non è male nemmeno a parte questo. Esistono linguaggi che promuovono one-liner manutenibili? – ephemient

+0

beh, la mia risposta fornisce di gran lunga la soluzione più leggibile a questo problema. – SilentGhost

2

Una revisione sulla previous entry che dovrebbe salvare 10 caratteri:.

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

Non avevo idea di come eseguire il preprocesso del codice in risposta: questa non è una voce ma un supporto per il codice del concorrente precedente. –

2

Perl 86 caratteri

94, se si conta il nome file di input.

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

Se non vi interessa quanti risultati si ottiene, allora è solo 75, escludendo il nome del file.

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

Ah, -E richiede Perl 5.10. – ephemient

2

Rubino 66B

puts (a=$<.read.split).uniq.map{|x|"#{a.count x} "+x}.sort.last 10 
2

Rubino

115 caratteri

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

di Windows Batch File

Si tratta ovviamente di n o la soluzione più piccola, ma ho deciso di postarlo comunque, solo per divertimento. :) NB: il file batch utilizza un file temporaneo denominato $ per la memorizzazione di risultati temporanei.

versione non compressa originale con commenti:

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

compresso & versione offuscato, caratteri:

@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 

Questo può essere abbreviato caratteri se eco è già spento e comando estensioni e espansione variabile ritardata sono attive:

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 

Usage:

> filename.bat input.txt 10 & pause 

uscita:

6|DIES 
4|FDR 
3|Johnson 
3|Bush 
2|Wilson 
2|Washington 
2|Truman 
2|Roosevelt 
2|Reagan 
2|Nixon 
+1

I MIEI OCCHI !!! 1 11 – Tom

+1

Sono tornato a guardare questo post e sono felice di averlo fatto. Hai fatto un ottimo lavoro facendo questo in una lingua davvero arretrata. – ojblass

Problemi correlati