Stack Exchange détecte automatiquement le vote en série (lorsqu'un utilisateur augmente ou diminue le nombre de messages d'un autre utilisateur) et l'inverse. Dans ce défi, vous allez implémenter un détecteur de «vote en série» très, très simple.
Contribution
L'entrée est une chaîne représentant une liste de votes. Chaque groupe de deux personnages représente un vote - le premier est l'électeur et le second l'utilisateur sur lequel un vote est demandé. Par exemple, l'entrée suivante
ababbccd
peut être analysé comme ab
ab
bc
cd
, et représente représenter a
voter b
deux fois,
b
voter c
une fois et c
voter d
une fois.
L'entrée ne comprend que des lettres minuscules et sera toujours égale à 0. Vous ne pouvez pas non plus voter sur vous-même (donc non aa
ou hh
).
Sortie
Aux fins de ce défi, le vote en série est défini comme tout utilisateur donné votant sur un autre utilisateur trois fois ou plus.
La sortie indique combien de votes doivent être inversés pour chaque utilisateur (c'est-à-dire combien de votes sur chaque utilisateur ont été inversés et non pas combien de votes ont été inversés), dans le format [user][votes][user2][votes2]...
. Par exemple, une entrée de abababab
( a
vote sur b
quatre fois) doit être sortie
b4
(quatre votes ont été inversés de a
à b
).
La sortie peut être dans l’ordre que vous souhaitez, mais l’entrée et la sortie doivent être des chaînes uniques, comme décrit ci-dessus.
Cas de test
In Out
---------------------------------------------------------------------------
abababcbcbcbcbbababa b7a3
edfdgdhdfgfgfgih g3
jkkjjkkjjkkjljljljmlmlnmnmnm j6k3m3
opqrstuv <none>
vwvwwvwv <none>
xyxyxyxyxyxyxyzyzyzyxzxzxz y10z3
nanananananananabatman a8
banana <none>
nanananananananabatman
le cas de test.Réponses:
Pyth, 22 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
Exemple:
la source
Illisible ,
18301796179117711762174517361727162616061577 octetsLa sortie est dans l'ordre alphabétique inverse (
z
àa
) mais selon vos règles, cela semble être autorisé.Explication
Tout d'abord, pour avoir une idée de ce que peut illisible, voici son fonctionnement de base:
write(x, inc(read(x)))
.Ce programme utilise la bande comme suit. Les noms de variables seront utilisés dans le pseudocode plus tard. En outre, cela documente la première version (qui était de 1830 octets); voir les modifications au bas de ce qui a changé depuis.
q
a
,p
,ch
hash
,v
b
,r
aa
,l
a
(96) àz
(121) (le code ASCII de la lettre moins un).0
= pas encore vu,-1
= vu une fois,-2
= vu deux fois,-3
= vu un nombre quelconque de fois supérieur à 2.L'algorithme procède essentiellement comme suit:
a
etb
. Calculez la valeur de hachage(a-2)*(a-1)+b-1
, qui est unique pour chaque combinaison de lettres a – z.*hash
). Si c'est le cas-3
, l'utilisateur est déjà éligible pour le retrait du vote, donc incrémenté*(b-1)
. Sinon, décrémentez*hash
. S'il est maintenant-3
, l'utilisateur vient se droit à la suppression de vote après trois occurrences, si incrément*(b-1)
par3
.z
ena
) et indiquez ceux pour lesquels des votes doivent être déduits. Cela nécessite une division manuelle en nombre entier par 10 pour traduire le nombre en chiffres décimaux.Avec tout cela clarifié, voici à quoi ressemble le programme en tant que pseudocode:
Edit 1, 1830 → 1796: Je me suis rendu compte que je pouvais réutiliser la valeur de retour d'une boucle while à un endroit.
Éditer 2, 1796 → 1791: il s'avère que le programme est légèrement plus petit si, au lieu d'utiliser les cellules 6 à 95, je stocke les chiffres décimaux dans les cellules numérotées négatives (à partir de –1). En prime, le programme n'est plus limité à 10⁹⁰ voix!
Edit 3, 1791 → 1771: Au lieu d’affecter le résultat de
*(ch = l + 95)
tov
, je l’assigneq
puis je déplace l’affectationv = q
dans la condition while, en portant le code à 1777 octets. Puis permutez l'emplacement deq
etv
sur la bande car ilq
est maintenant 1 plus commun quev
.Éditer 4, 1771 → 1762: Duh. Initialiser
hash
à 1 au lieu de 0 est 9 octets plus court. Le code de hachage est maintenant 1 plus, ce qui n'a pas d'importance.Edit 5, 1762 → 1745: Si j’initialise
q
etr
à 1 au lieu de 0, je dois saupoudrer un peu-1
de place pour que tout soit correct, et tout semble s’annuler - sauf que lawhile v { --v; [...] }
boucle doit maintenant exécuter une itération de moins, ce que je peux faire en disantwhile --v { [...] }
, qui est 26 caractères plus court.Edit 6, 1745 → 1736: Au lieu de
{ r = 1; ++q }
, nous pouvons écrireq = *((r = 1)+1)+1
. Cela repose sur le fait qu’il seq
trouve à la variable emplacement n ° 2. Si c'était dans l'emplacement 1, ce serait encore plus court, mais le programme tout entier serait plus long dans l'ensemble.Edit 7, 1745 → 1727: Revered Edit 6 et à la place, a réalisé la sauvegarde en insérant la boucle la plus interne en boucle dans l’expression qui calcule le code de code ASCII, qui se termine également à 1736 octets ... mais a ensuite enregistré une instruction de décrémentation (9 octets). ) en changeant
((++r) - 11) ? r :
pour(r - 10) ? ++r :
.Édition 8, 1727 → 1626: Retouche du calcul du hachage. Il utilise maintenant une boucle while de moins. Les emplacements des cellules sont maintenant à leurs codes ASCII réels (pas plus de 1). Remaniement des variables à différents emplacements sur la bande car elles se produisent maintenant à une fréquence différente.
Edit 9, 1626 → 1606: Inlining plus fou. Le corps de la première boucle while ressemble maintenant à ceci:
et l'assignation de variable a maintenant presque complètement changé.
Modifier 10, 1606 → 1577: Je remarquai que
a
eta2
sont tous les deux décrémenté à 0 pendant que les boucles, donc si je pouvais pairep
avec l'un de ceux -ci , mais pas avecch
, je ne aurais pas besoin d'initialiserp
à0
(qui coûte 29 octets). Il se trouve que je peux le faire en échangeantp
etr
. Les affectations de variable les plus récentes (et leur fréquence d'apparition dans le code) sont maintenant:la source
CJam, 23 octets
Fête de longueur!
ou
Exécuter tous les cas de test
Explication
L'autre version commence par inverser les paires, ce qui économise deux octets ailleurs: a) la sélection du premier caractère de chaque chaîne
:c
remplace uniquement celleWf=
du second. b) Il n'est pas nécessaire de trier à nouveau avant le deuxième RLE, car les paires étaient déjà triées principalement par le personnage restant.la source
Q
dans votre deuxième réponse devrait être à desq
fins non-test-wrapper.3
en liste pour la comparaison est une astuce intéressante. Je l'ai résolu uniquement pour mon propre divertissement et j'ai perdu un octet parce que je l'utilisais0=2>
. Sinon, je me suis retrouvé avec presque la même chose que votre première solution, sauf que vous utilisiez la::\
place deWf%
la dernière étape.Bash,
95948581 octetsUne première solution élégante, mais longue
Merci à User112638726 pour l' enregistrement d' un octet avec
sed
, DigitalTrauma pour sauver 9 avecfold
, et Rainer P. pour sauver 4 plus avecawk
« ssubstr
!Pour voir comment cela fonctionne, prenons l’entrée
abababcbcbcbcbbababa
.Après
fold -2
(enroulez la ligne à une largeur de 2), nous avonsAprès
sort | uniq -c
(-c
est un indicateur très astucieuxuniq
qui indique le nombre de fois où chaque ligne apparaît en entrée), nous obtenonsExaminons maintenant la dernière
awk
commande:$1>2
: N'affiche que les choses si l'enregistrement 1 (c'est-à-dire le nombre de votes identiques) est supérieur à 2 (c'est-à-dire ≥ 3). En d'autres termes, ignorez les lignes commençant par un nombre ≤ 2.{c[substr($2,2)]+=$1}
: Si le nombre est supérieur à 2, ajoutez ce nombre à lac
table de hachage, en utilisant le deuxième caractère de l’enregistrement 2 (alias le vote-ee) comme clé. (Nous n'avons pas à tout initialiser à zéro;awk
c'est ce que nous faisons .)END{...}
: Cela signifie simplement "après avoir traité l’ensemble du fichier, voici ce qu’il faut faire ensuite".for(x in c)printf x c[x]
: Assez explicite. Imprimer chaque clé et sa valeur correspondante.la source
&
est équivalent à\0
in sedsed -r 's/.(.)/\1\n/g'|awk '{a[$1]++}END{for(i in a)printf (a[i]>2)?i a[i]:y}
bacada
, par exemple.JavaScript,
114113110Cas de test:
Afficher l'extrait de code
À un niveau élevé, ce code renseigne un objet avec des paires clé-valeur qui mappent les destinataires d'un vote sur le nombre de votes,
{ b:7, a:3 }
puis les relie à une chaîne enfor
boucle. Le code est dans uneeval
expression pour permettre l'utilisation defor
dans une fonction de flèche sans avoir besoin de dépenser des octets sur{ }
et;return r
.(Accessoires à user81655 pour économiser trois octets!)
Explication du
eval
code:la source
Haskell, 103 octets
Exemple d'utilisation:
f "jkkjjkkjjkkjljljljmlmlnmnmnm"
->"k3j6m3"
Comment ça fonctionne:
la source
JavaScript (ES6),
195174169167158 octetsTester
Afficher l'extrait de code
la source
var
s. Qui se soucie de polluer la portée mondiale du code golf? ;)/(\w{2})/g
pouvons simplement savoir/../g
- nous savons déjà que l’entrée n’est que des lettres et que la répétition d’un (ou deux) caractères est plus courte que{2}
. Si cela vous intéresse, vous pouvez consulter (et commenter des questions) ma réponse JavaScript à ce défi. Bienvenue chez PGCC!Mathematica,
11010099 octetsla source
Perl,
868483 octetsC'est 82 octets plus 1 pour l'
-p
argument en ligne de commande:Un peu non-golfé:
${$'}
au lieu de$g{$'}
. Malheureusement,$$'
ça ne marche pas.la source
Pure Bash, 151
Plus longtemps que je l'espérais, mais le voici.
Utilise l'indexation par tableaux associatifs pour effectuer le comptage nécessaire. Nécessite bash version 4.0 ou supérieure.
la source
Caractères PHP 247
(Aie)
A expliqué
Est-ce que cela sans regarder d'autres réponses. C'est le code de golf le plus difficile que j'ai jamais abordé. Je me félicite de toutes les optimisations.
la source
R, 221 octets
code
non-golfé
Il y a beaucoup de place à l'amélioration ici.
la source