Rilevamento del voto seriale


51

Stack Exchange rileva automaticamente la votazione seriale (quando un utente esegue l'upgrade o il downgrade di molti post di un altro utente) e lo inverte. In questa sfida, implementerai un rilevatore di "voto seriale" molto, molto semplice.

Ingresso

L'input è una stringa che rappresenta un elenco di voti. Ogni gruppo di due personaggi rappresenta un voto: il primo è l'elettore e il secondo è l'utente a cui viene votato. Ad esempio, il seguente input

ababbccd

può essere analizzato come ab ab bc cde rappresenta la avotazione bdue volte, la bvotazione cuna volta e la cvotazione duna volta.

L'input sarà composto solo da lettere minuscole e sarà sempre una lunghezza pari> 0. Inoltre non puoi votare su te stesso (quindi no aao hh).

Produzione

Ai fini di questa sfida, il voto seriale è definito come un dato voto utente su qualsiasi altro utente tre o più volte.

L'output è il numero di voti che devono essere invertiti per ciascun utente (ovvero quanti voti su ciascun utente sono stati invertiti, non quanti voti hanno dato sono stati invertiti), nel formato [user][votes][user2][votes2].... Ad esempio, dovrebbe essere emesso un input di abababab( avotazione per bquattro volte) b4(quattro voti sono stati invertiti da aa b).

L'output può essere nell'ordine desiderato, ma sia l'input che l'output devono essere stringhe singole come descritto sopra.

Casi test

In                            Out
---------------------------------------------------------------------------
abababcbcbcbcbbababa          b7a3
edfdgdhdfgfgfgih              g3
jkkjjkkjjkkjljljljmlmlnmnmnm  j6k3m3
opqrstuv                      <none>
vwvwwvwv                      <none>
xyxyxyxyxyxyxyzyzyzyxzxzxz    y10z3
nanananananananabatman        a8
banana                        <none>

16
+1 per nanananananananabatmantest case.
nove

Risposte:


6

Pyth, 22 byte

pM_srSsfttTtMM.gkcz2 8

Provalo online: Dimostrazione o Test Suite

Spiegazione:

pM_srSsfttTtMM.gkcz2 8
                 cz2     chop the input into pairs
              .gk        group these pairs by their value
           tMM           discard the first char in each pair in each group
       fttT              discard all groups, that contain less than three pairs
      s                  concatenate all groups to get a list of chars
     S                   sort all chars
    r                8   run-length-encoding
   s                     concatenate all (count,char) pairs 
  _                      reverse the order
pM                       print each element without separator

Esempio:

input:   ededgdhdfgfgfgihed
chop:    ['ed', 'ed', 'gd', 'hd', 'fg', 'fg', 'fg', 'ih', 'ed']
group:   [['ed', 'ed', 'ed'], ['fg', 'fg', 'fg'], ['gd'], ['hd'], ['ih']]
discard: [['d', 'd', 'd'], ['g', 'g', 'g'], ['d'], ['d'], ['h']]
discard: [['d', 'd', 'd'], ['g', 'g', 'g']]
concat.: ['d', 'd', 'd', 'g', 'g', 'g']
sort:    ['d', 'd', 'd', 'g', 'g', 'g']
rle:     [[3, 'd'], [3, 'g']]
concat.: [3, 'd', 3, 'g']
reverse: ['g', 3, 'd', 3]
print:   g3d3

34

Illeggibile , 1830 1796 1791 1771 1762 1745 1736 1727 1626 1606 1577 byte

L'output è in ordine alfabetico inverso ( za a) ma in base alle regole che sembra essere consentito.

' '' '' ' ' '' '' '''' ' ' '''' ''' "" ' '' '' '' '' ''' "" "" "" ' '' ''" " ' '''" "" ' '' '' ''' "" " ' '' '' '' '' '''" "" " ' '' '' ' ' '' '' '''' " ' '''" " ' '' ' ' '' '' '''' ' ' '''' '''" "" "" "" "' '' '' ''"' ''' ''' "" "' '' '' ' ' '' '' '''' ' ' ''''"' '' ' ' '' '' '' '''' '' '' '' ' ''' "" ' ''' "" " ' '' '' '''" "" ' ''' "" "" "" "' ''" ' '' '' '' '' "' "" ' ''' "" ' '' '' '' "' '' '' '' "' ''"' '' '' '' '' ' ' ''''" ' '''"" "" "" ' '' '' '' ' ' '' ' ' '' '' '' '''' '' '' '''' '' '' ''' "" " ' '' "" "" " ' '' '' '' ' ' '''' '''" " ' '''" "' '' '' ''"' '' '' '' ' ' '''' "" ' ''' "" "" "" " ' '' '' '' ' ' '''' '''" "" "" " ' '''" " ' '''""" ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" "' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "' '' '' ' ' '' '' ''''"' "" ' ''' "" " ' '' '' '' '''" "" "" "" ' ''' "" ' ''' "" " ' '' '''" "" "'"" "" "" "" " ' '' '' '' '''" "" "" " ' '''" "" ' ''' "" "" "" " ' '' '' '' ' '' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' " ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' ""' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" '" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" "' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" '"" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" "' "" ' ''' "" ' '' "' "' '' '' ''" ' ''"' '' "' '' '' ' ' '' '' '' '''' ''" "" ' '' '' '' ''' "" " ' '' '' '' ' ' '''' '''" "" " ' '' '' '''" "" ' ''"" "" ' ''' "" "' '' ' ' '' '' '''' '' '' ' ' ''''"' '' ' ' '' '' '' '''' "" "" "" ' ''' "" ' '' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' " ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' ""' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" '" " ' '''" "' '' '' ' ' '' '' '''' '' '' ''"' '' ' ' '' '' '' '''' '' '' '' ' '' '' '' ''' "" "' '' '' '' '' ' ' '' '' '' '''' '' '' ''"' '' '' ''"" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" " ' '' ' ' '' '' '''' '''" "' '' '' ''"' "" " ' '' '''" "" "" " ' '''" "" ' ''' "" "" "" " ' '''" "" ' '' '' ''' '' "' '' "' '' ''" ' '' '' '' ' ' ''''"' '' "'" ' '' '' '' "' '' '' ''" " ' '' '' '''" " ' '''" "" ' ''' "" "" "" " ' '''" "' ''""" ' ''' "" " ' '''" "" "" "" ' ''' "" ' ''""" ' ''' "" " ' '''" "" "" "" ' ''' "" ' ''"

Spiegazione

Innanzitutto, per avere un'idea di ciò che illeggibile può fare, ecco le sue operazioni di base:

  • Hai un nastro infinito di celle intere di dimensioni arbitrarie
  • Tu non si dispone di un puntatore di memoria come in Brainfuck; invece, si dereferenziano le celle in base alla loro posizione sul nastro. Ciò significa che è possibile “leggere il valore # 4” o “leggere il valore # (leggere il valore # 4)” (doppia differenza).
  • Puoi solo leggere o scrivere celle di memoria (non incrementare / decrementare direttamente come in Brainfuck).
  • È possibile incrementare / decrementare i valori all'interno di un'espressione. Così, per incrementare una cella di memoria si deve leggere , incremento , scrittura , o in modo diverso messo: write(x, inc(read(x))).
  • Ci sono loop while e condizionali ternari che possono solo verificare lo zero rispetto a zero.

Questo programma utilizza il nastro come segue. I nomi delle variabili verranno utilizzati nello pseudocodice più avanti in basso. Inoltre, questo documenta la prima versione (che era 1830 byte); vedere le modifiche in fondo per ciò che è cambiato da allora.

  • Cella 0: variabileq
  • Cella 1: variabili a, p,ch
  • Cella 2: variabili hash,v
  • Cella 3: variabili b,r
  • Cella 4: variabili aa,l
  • Cella 5: rimane 0 per contrassegnare la "fine" della stringa di cifre decimali
  • Celle 6–95: memorizza la stringa di cifre decimali all'indietro
  • Celle 96–121: memorizza il numero di voti da detrarre dagli utenti da a(96) a z(121) (il codice ASCII della lettera meno uno).
  • Celle 4657–7380: ricorda quante combinazioni di elettori / votanti sono state incontrate quante volte. Queste celle hanno solo 4 possibili valori: 0= non ancora visto, -1= visto una volta, -2= visto due volte, -3= visto un numero qualsiasi di volte superiore a 2.

L'algoritmo procede essenzialmente come segue:

  • Continua a leggere coppie di personaggi ae b. Calcola il valore hash (a-2)*(a-1)+b-1, che è unico per ogni combinazione di lettere dalla a alla z.
  • Controlla la cella di memoria con quel valore di hash ( *hash). In tal caso -3, l'utente è già idoneo alla rimozione dei voti, quindi incrementa *(b-1). Altrimenti, decremento *hash. Se è ora -3 , l'utente è appena diventato idoneo per la rimozione dei voti dopo tre occorrenze, quindi incrementa *(b-1)di 3.
  • Dopodiché, passa attraverso i caratteri in ordine inverso ( za a) e visualizza quelli che richiedono i voti dedotti. Ciò richiede una divisione intera manuale per 10 per tradurre il numero in cifre decimali.

Con tutto ciò chiarito, ecco come appare il programma come pseudocodice:

// Read pairs of characters
while (a = read) + 1 {
    b = read

    // Calculate hash = (a-1)*(a-2)/2 + b-1
    // This also sets a = b-1
    hash = 0
    while --a {
        aa = a
        while --aa {
            ++hash
        }
    }
    while --b {
        ++a
        ++hash
    }

    // If this combination has just been seen for the third time,
    // increment *a by 3; if more than third time, increment *a by 1
    *a = (*hash + 3) ? ((--*hash) + 3 ? *a : (*a+3)) : (*a+1)
}

// Loop through the characters z to a
l = 27
while --l {                     // l loops from 26 to 1 (not 0)
    (v = *(ch = l + 95)) ? {    // 'a' is ASCII 97, but cell 96
        print (ch+1)            // print the votee

        // Now we need to turn the number v into decimal.
        // p points to where we are storing decimal digits.
        p = 5

        while v {
            // Integer division by 10 (q=quotient, r=remainder)
            r = (q = 0)
            while v {
                --v
                (++r - 10) ? 1 : {
                    r = 0
                    ++q
                }
            }
            // Store digit ASCII character
            *(++p) = r + 48     // 48 = '0'
            v = q
        }

        // Now output all the digit ASCII characters in reverse order
        while *p {
            print *(--p + 1)
        }

    } : 1
}

Modifica 1, 1830 → 1796: mi sono reso conto che posso riutilizzare il valore di ritorno di un ciclo while in un punto.

Modifica 2, 1796 → 1791: Il programma risulta leggermente più piccolo se, invece di utilizzare le celle 6–95, memorizzo le cifre decimali nelle celle con numero negativo (da -1 in poi). Come bonus aggiuntivo, il programma non è più limitato a 10⁹⁰ voti!

Modifica 3, 1791 → 1771: Invece di assegnare il risultato di *(ch = l + 95)a v, ora lo assegno a qe quindi sposta l'assegnazione v = qnella condizione while, portando il codice a 1777 byte. Quindi scambiare la posizione di qe vsul nastro perché qora è 1 più comune di v.

Modifica 4, 1771 → 1762: Duh. L'inizializzazione hashsu 1 invece di 0 è più corta di 9 byte. Il codice hash ora è 1 in più, il che non ha importanza.

Modifica 5, 1762 → 1745: se eseguo l'inizializzazione qe rsu 1 invece di 0, devo cospargere alcune -1s in alcuni punti per farlo bene, e tutto sembra annullarsi, tranne per il fatto che il while v { --v; [...] }ciclo ora deve eseguire una iterazione in meno, cosa che posso fare dicendo while --v { [...] }che è più breve di 26 caratteri.

Modifica 6, 1745 → 1736: invece di { r = 1; ++q }, possiamo scrivere q = *((r = 1)+1)+1. Ciò si basa sul fatto che si qtrova nello slot variabile n. 2. Se fosse nello slot n. 1 questo sarebbe ancora più breve, ma l'intero programma sarebbe più lungo nel complesso.

Modifica 7, 1745 → 1727: ripristinato Modifica 6 e invece ha ottenuto il salvataggio incorporando il ciclo più interno mentre nell'espressione che calcola il codice ASCII della cifra, che finisce anche a 1736 byte ... ma poi ha salvato un'istruzione di decremento (9 byte ) cambiando ((++r) - 11) ? r :in (r - 10) ? ++r :.

Modifica 8, 1727 → 1626: rielaborato il calcolo dell'hash. Ora ne usa uno in meno mentre il ciclo. Le posizioni delle celle ora sono ai loro codici ASCII effettivi (non più fuori da 1). Rimescolate le variabili in posizioni diverse sul nastro perché ora si verificano con frequenza diversa.

Modifica 9, 1626 → 1606: allineamento più folle. Il corpo del primo ciclo while ora assomiglia a questo:

// b = next char
*(b = (hash = read)) = {

    // hash = b + (a-1)*(a-2)/2
    while (a2 = --a) {
        while --a2 {
            ++hash
        }
    }

    // If this combination has just been seen for the third time,
    // increment *b by 3; if more than third time, increment *b by 1
    (*hash + 3) ? ((--*hash) + 3 ? *b : (*b+3)) : (*b+1)
}

e l'assegnazione delle variabili è ora quasi completamente cambiata.

Modifica 10 1606 → 1577 ho osservato che ae a2sono entrambi a 0 decrementato in cicli while, quindi se potessero accoppiare pcon uno di questi, ma non con ch, non avrei bisogno inizializzare pa 0(che costa 29 byte). Si scopre che posso farlo scambiando pe r. Le ultime variabili assegnate (e la loro frequenza di occorrenza nel codice) sono ora:

0 = v (3)                    (total  3)
1 = hash (6), r (5), ch (2)  (total 13)
2 = b (4), q (5)             (total  9)
3 = a (3), p (5)             (total  8)
4 = a2 (3), l (4)            (total  7)

1
Visto che un novembrevigintillion voti richiederebbe una stringa di 2 * 10 ^ 90 byte e l'attuale volume più piccolo possibile di 10 ^ 24 byte è circa 1/3 della dimensione della Grande Piramide di Giza , non penso che tu abbia qualcosa di cui preoccuparsi. ;)
ETHproductions

1
@ETHproductions: Tuttavia, mentre giocavo a golf il programma mi è capitato di correggere questa limitazione :)
Timwi

22

CJam, 23 byte

Festa di lunga durata!

q2/$e`{3a>},e~Wf=$e`Wf%

o

qW%2/$e`{3a>},e~:ce`Wf%

Esegui tutti i casi di test

Spiegazione

q2/   e# Read input and split into pairs.
$e`   e# Sort and run-length encode - this tallies the pairs.
{     e# Filter the tallies...
  3a> e#   Keep only those which start with a 3 or greater.
},    e# Now we need to group the remaining pairs.
e~    e# Run-length decode the remaining pairs.
Wf=   e# Select the second character from each pair (the one being voted on).
$e`   e# Tally the characters by sorting and RLE'ing again.
Wf%   e# Reverse each pair, because CJam's RLE has the number first and the character last.

L'altra versione inizia invertendo le coppie, il che salva due byte altrove: a) la selezione del primo carattere in ogni stringa è solo :cinvece che Wf=per la selezione del secondo. b) Non abbiamo bisogno di riordinare prima del secondo RLE, perché le coppie erano già ordinate principalmente in base al carattere rimanente.


FWIW il Qnella tua seconda risposta dovrebbe essere qper scopi non-wrapper di test.
Peter Taylor,

@PeterTaylor Lo faccio sempre -.-
Martin Ender il

So che è un dettaglio minore, ma la conversione 3in un elenco per il confronto è un bel trucco. L'ho risolto solo per il mio divertimento e ho perso un byte lì perché l'ho usato 0=2>. Altrimenti ho finito con quasi la stessa della tua prima soluzione, tranne per l'utilizzo ::\ anziché Wf%per l'ultimo passaggio.
Reto Koradi,

10

Bash, 95 94 85 81 byte

fold -2|sort|uniq -c|awk '$1>2{c[substr($2,2)]+=$1}END{for(x in c)printf x c[x]}'

Un'elegante ma lunga prima soluzione per iniziare ...

Grazie a User112638726 per il salvataggio di un byte con sed, DigitalTrauma per il salvataggio di 9 con folde Rainer P. per il salvataggio di altri 4 con awk's substr!

Per vedere come funziona, prendiamo l'input abababcbcbcbcbbababa.

  • Dopo fold -2(avvolgere la linea con una larghezza di 2), abbiamo

    ab
    ab
    cb
    cb
    cb
    cb
    ba
    ba
    ba
    
  • Dopo sort | uniq -c( -cè un flag molto elegante uniqche genera il conteggio di quante volte appare ogni riga nell'input), otteniamo

          3 ab
          3 ba
          4 cb
    
  • Ora esaminiamo il awkcomando finale :

    • $1>2: Produce materiale solo se il record 1 (ovvero il numero di voti identici) è maggiore di 2 (ovvero ≥ 3). In altre parole, ignora qualsiasi riga che inizia con un numero ≤ 2.

    • {c[substr($2,2)]+=$1}: Se il numero è maggiore di 2, aggiungi quel numero alla ctabella hash, usando il secondo carattere del record 2 (aka il voto-ee) come chiave. (Non dobbiamo inizializzare tutto a zero; lo awkfa per noi.)

    • END{...}: Questo significa semplicemente "dopo aver elaborato l'intero file, ecco cosa fare dopo".

    • for(x in c)printf x c[x]: Abbastanza esplicativo. Stampa ogni chiave e il suo valore corrispondente.


&è equivalente a \0in sed
User112638726

@ User112638726 Non lo sapevo, grazie
Maniglia della porta

Ridotto un po 'sed -r 's/.(.)/\1\n/g'|awk '{a[$1]++}END{for(i in a)printf (a[i]>2)?i a[i]:y}
User112638726

@ User112638726 Ad esempio, ciò non riesce per l'input bacada.
Maniglia della porta

Oh si il mio male!
Utente112638726

8

JavaScript, 114 113 110

f=s=>eval('o={},s.replace(/../g,m=>s.search(`^((..)*${m}){3}`)?0:o[c=m[1]]=~~o[c]+1);r="";for(v in o)r+=v+o[v]');

Casi test:

A un livello elevato, questo codice popola un oggetto con coppie chiave-valore che associano i destinatari del voto al numero di voti, come { b:7, a:3 }e quindi li unisce in una stringa in un forciclo. Il codice è in evalun'espressione per consentire l'uso forall'interno di una funzione freccia senza la necessità di spendere byte su { }e ;return r.

( Propone all'utente 81655 per salvare tre byte!)

Spiegazione del evalcodice:

o={},                             // object to hold name/vote mapping
s.replace(/../g,                  // for each pair of chars in input
  m=>s.search(`^((..)*${m}){3}`)  // see if pair appears 3 times
                                  //   (0 if true, -1 if not)
     ?0                           // if not, do nothing
     :o[c=m[1]]=~~o[c]+1          // if yes, increment the property named after
                                  //   the second character in the pair
);
r="";                       // return string
for(v in o)r+=v+o[v]        // populate string with characters and vote totals

6

Haskell, 103 byte

import Data.Lists
f s|c<-chunksOf 2 s,b<-[e!!1|e<-c,countElem e c>2]=nub b>>= \q->q:show(countElem q b)

Esempio di utilizzo: f "jkkjjkkjjkkjljljljmlmlnmnmnm"->"k3j6m3"

Come funziona:

c<-chunksOf 2 s                      -- split the input into lists of 2 elements
b<-[e!!1|e<-c,countElem e c>2]       -- for every element e of that list take the 2nd
                                     -- char if there are more than 2 copies of e
nub b>>= \q->q:show(countElem q b)   -- take every uniq element thereof and append
                                     -- the number how often it appears 

6

JavaScript (ES6), 195 174 169 167 158 byte

s=v=>eval("a={},b={},e='';(v.match(/../g)).forEach(c=>{a[c]=(a[c]||0)+1});for(var k in a){d=k[1];a[k]>2&&(b[d]=(b[d]||0)+a[k])};for(var k in b){e+=k+b[k]};e")

Test


1
Benvenuti in PPCG :) Abbiamo alcuni suggerimenti per giocare a golf in JS qui e qui . Non conosco JS abbastanza bene per aiutare davvero, ma felice golf :)
FryAmTheEggman

1
Per prima cosa, è possibile rimuovere la vars. A chi importa inquinare l'ambito globale nel code golf? ;)
Maniglia della porta

Inoltre, /(\w{2})/gpossiamo solo essere /../g: sappiamo già che l'input è solo lettere e che ripetere uno (o due) caratteri è più breve di {2}. Se sei interessato, puoi dare un'occhiata (e commentare domande) alla mia risposta JavaScript a questa sfida. Benvenuti in PGCC!
apsillers,

4

Mathematica, 110 100 99 byte

g=Cases[Tr@#,#2,All]&;""<>g[g[BlockMap[$,Characters@#,2],i_*_/;i>2]/.$->Last,i_*x_:>x<>ToString@i]&

3

Perl, 86 84 83 byte

s/../$h{$&}++/eg;@l=%l=map{/./;$h{$_}>2?($',${$'}+=$h{$_}):()}keys%h;$"="";$_="@l"

Sono 82 byte più 1 per l' -pargomento della riga di comando:

$ echo xyxyxyxyxyxyxyxyzyzyzyxzxzxz | perl -p 86.pl
y11z3


Abbastanza ungolfed:

s/../$h{$&}++/eg;     # construct hash %h with pair counts

@l = %l = map         # assign to array via hash to filter dupes
{                     
  /./;                # match the first character

  $h{$_}>2?           # filter on 3 or more identical votes
  (                   # return a 2 element list (k/v pair for %l):
    $',               # $POSTMATCH: the 2nd character (votee)
    ${$'} += $h{$_}   # increment votee total votes, value is new total
  )
  :()
}
keys %h;              # iterate the unique pairs

$" = "";              # set $LIST_SEPARATOR to empty string
$_ = "@l"             # implicit join using $";  $_ gets printed with -p
  • aggiornamento 84 Salva 2 byte incorporando grep
  • aggiornamento 83 Salvare 1 byte utilizzando var temporanee globali ${$'}anziché $g{$'}. Sfortunatamente, $$'non funziona.

3

Pure Bash, 151

Più a lungo di quanto sperassi, ma eccolo qui.

declare -A a n
for((;v<${#1};v+=2));{((a[${1:v:2}]++));}
for u in ${!a[@]};{((a[$u]>2))&&((n[${u:1}]+=a[$u]));}
for u in ${!n[@]};{ printf $u${n[$u]};}

Utilizza l'indicizzazione di array associativo per eseguire il conteggio necessario. Richiede bash versione 4.0 o successiva.


1

Personaggi PHP 247

(Ahia)

$f='';for($i=0;$i<strlen($s);$i=$i+2){$a[]=$s[$i].$s[$i+1];}$r=[];for($i=0;$i<count($a);$i++){$t=array_count_values($a);$c=$t[$a[$i]];if($c>=3){$r[$a[$i][1]][$a[$i][0]]=$c;}}for($i=0;$i<count($r);$i++){$f.=key($r).array_sum(current($r));next($r);}

spiegato

// Test Case
$s = 'nanananananananabatman';

// Final result here
$f = '';

// Seperate strings into array in 2 character chunks
for ($i = 0; $i < strlen($s); $i = $i + 2)
{
    $a[] = $s[$i] . $s[$i + 1];
}

// Make an array of data
// The first level of array has voted on user as key
// Inside of that array is a dictionary with the voter user as the key, and the number of votes as the value
$r = [];
for ($i = 0; $i < count($a); $i++)
{
    $t = array_count_values($a);
    $c = $t[$a[$i]];
    if ($c >= 3)
    {
        $r[$a[$i][1]][$a[$i][0]] = $c;
    }
}

// Combine votes from different users to the same user into the final result string
for ($i = 0; $i < count($r); $i++)
{
    $f .= key($r) . array_sum(current($r));
    next($r);
}

echo $f;

Fatto questo senza sbirciare le altre risposte. Questo è il codice golf più difficile che abbia mai affrontato. Accolgo con favore tutte le ottimizzazioni.


0

R, 221 byte

codice

f=function(s){t=strsplit(gsub("(.{2})","\\1 ", s)," ")[[1]];z=table(t)[table(t)>2];n=substr(names(z),2,2);x=data.frame(y=z,t=n);a=aggregate(x$y,by=list(x$t),sum);for(i in nrow(a):1)cat(as.character(a[i,1]),a[i,2],sep="")}

ungolfed

f <- function(s){
  l <- gsub("(.{2})", "\\1 ", s)
  t <- strsplit(l," ")[[1]]
  z <- table(t)[table(t)>2]
  n <- substr(names(z),2,2)
  x <- data.frame(y=z,t=n)
  a <- aggregate(x$y, by=list(x$t),sum)
  for(i in nrow(a):1){
    cat(as.character(a[i,1]),a[i,2],sep="")
  }
}

C'è molto margine di miglioramento qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.