Stack Exchange detecta automáticamente el voto en serie (cuando un usuario vota a favor o en contra de muchas de las publicaciones de otro usuario) y lo revierte. En este desafío, implementará un detector de "voto en serie" muy, muy simple.
Entrada
La entrada es una cadena que representa una lista de votos. Cada grupo de dos personajes representa un voto: el primero es el votante y el segundo es el usuario que se vota. Por ejemplo, la siguiente entrada
ababbccd
se puede analizar como ab
ab
bc
cd
y representa a
votar b
dos veces,
b
votar c
una vez y c
votar d
una vez.
La entrada consistirá solo en letras minúsculas, y siempre será una longitud par> 0. Tampoco puedes votar por ti mismo (así que no aa
o hh
).
Salida
Para los propósitos de este desafío, la votación en serie se define como cualquier usuario dado que vota sobre cualquier otro usuario tres o más veces.
El resultado es cuántos votos se deben invertir para cada usuario (es decir, cuántos votos se invirtieron en cada usuario, no cuántos votos se han invertido), en el formato [user][votes][user2][votes2]...
. Por ejemplo, una entrada de abababab
( a
votar b
cuatro veces) debería producirse
b4
(se han invertido cuatro votos de a
a b
).
La salida puede estar en el orden que desee, pero tanto la entrada como la salida deben ser cadenas simples como se describió anteriormente.
Casos de prueba
In Out
---------------------------------------------------------------------------
abababcbcbcbcbbababa b7a3
edfdgdhdfgfgfgih g3
jkkjjkkjjkkjljljljmlmlnmnmnm j6k3m3
opqrstuv <none>
vwvwwvwv <none>
xyxyxyxyxyxyxyzyzyzyxzxzxz y10z3
nanananananananabatman a8
banana <none>
nanananananananabatman
caso de prueba.Respuestas:
Pyth, 22 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
Ejemplo:
fuente
Ilegible ,
18301796179117711762174517361727162616061577 bytesLa salida está en orden alfabético inverso (
z
aa
) pero de acuerdo con sus reglas, eso parece ser permisible.Explicación
Primero, para tener una idea de lo que Unreadable puede hacer, aquí está su operación básica:
write(x, inc(read(x)))
.Este programa usa la cinta de la siguiente manera. Los nombres de las variables se usarán en el pseudocódigo más adelante. Además, esto documenta la primera versión (que tenía 1830 bytes); vea las ediciones en la parte inferior para ver qué ha cambiado desde entonces.
q
a
,p
,ch
hash
,v
b
,r
aa
,l
a
(96) az
(121) (el código ASCII de la carta menos uno).0
= aún no visto,-1
= visto una vez,-2
= visto dos veces,-3
= visto cualquier número de veces más de 2.El algoritmo esencialmente procede de la siguiente manera:
a
yb
. Calcule el valor hash(a-2)*(a-1)+b-1
, que es único para cada combinación de letras a – z.*hash
). Si es así-3
, el usuario ya es elegible para la eliminación de votos, así que incremente*(b-1)
. De lo contrario, decremento*hash
. Si es ahora-3
, el usuario acaba de ser elegible para la eliminación de votos después de tres ocurrencias, así que incremente*(b-1)
en3
.z
aa
) y muestre los que necesitan votos deducidos. Esto requiere la división de enteros manual por 10 para traducir el número a dígitos decimales.Con todo eso aclarado, así es como se ve el programa como pseudocódigo:
Edición 1, 1830 → 1796: Me di cuenta de que puedo reutilizar el valor de retorno de un ciclo while en un solo lugar.
Edición 2, 1796 → 1791: Resulta que el programa es un poco más pequeño si, en lugar de usar las celdas 6–95, guardo los dígitos decimales en las celdas con números negativos (–1 en adelante). ¡Como un bono adicional, el programa ya no se limita a 10⁹⁰ votos!
Edición 3, 1791 → 1771: en lugar de asignar el resultado de
*(ch = l + 95)
tov
, ahora lo asigno aq
y luego muevo la asignaciónv = q
a la condición while, llevando el código a 1777 bytes. Luego intercambie la ubicación deq
yv
en la cinta porqueq
ahora es 1 más común quev
.Edición 4, 1771 → 1762: Duh. Inicializar
hash
a 1 en lugar de 0 es 9 bytes más corto. El código hash ahora es 1 más, lo que no importa.Edición 5, 1762 → 1745: si inicializo
q
yr
en 1 en lugar de 0, tengo que esparcir algunos-1
s en lugares para hacerlo bien, y todo parece cancelarse, excepto que elwhile v { --v; [...] }
ciclo ahora necesita ejecutar una iteración menos, lo que puedo hacer diciendowhile --v { [...] }
, que es 26 caracteres más corto.Edición 6, 1745 → 1736: en lugar de
{ r = 1; ++q }
, podemos escribirq = *((r = 1)+1)+1
. Esto se basa en el hecho de queq
está en la ranura variable # 2. Si estuviera en la ranura # 1, esto sería aún más corto, pero entonces todo el programa sería más largo en general.Edición 7, 1745 → 1727: se revirtió la Edición 6 y, en su lugar, se logró guardar al incluir el bucle while más interno en la expresión que calcula el código ASCII de dígitos, que también termina en 1736 bytes ... pero luego guardó una instrucción de disminución (9 bytes ) cambiando
((++r) - 11) ? r :
a(r - 10) ? ++r :
.Edición 8, 1727 → 1626: Se modificó el cálculo del hash. Ahora usa un bucle while menos. Las ubicaciones de las celdas ahora están en sus códigos ASCII reales (ya no están apagados en 1). Reorganizar las variables a diferentes ubicaciones en la cinta porque ahora se producen con diferente frecuencia.
Edición 9, 1626 → 1606: más loco en línea. El cuerpo del primer bucle while ahora se ve así:
y la asignación variable ahora ha cambiado casi por completo.
Editar 10, 1606 → 1577: He observado que
a
ya2
son ambos decrementa a 0 en los bucles while, por lo que si podría emparejarsep
con cualquiera de ellos, pero no conch
, no necesitaría para inicializarp
a0
(que cuesta 29 bytes). Resulta que puedo hacer eso intercambiandop
yr
. Las nuevas asignaciones de variables (y su frecuencia de aparición en el código) son ahora:fuente
CJam, 23 bytes
¡Fiesta de corrida!
o
Ejecute todos los casos de prueba
Explicación
La otra versión comienza invirtiendo los pares, lo que ahorra dos bytes en otro lugar: a) seleccionar el primer carácter en cada cadena es solo en
:c
lugar deWf=
seleccionar el segundo. b) No necesitamos ordenar nuevamente antes del segundo RLE, porque los pares ya estaban ordenados principalmente por el carácter restante.fuente
Q
en su segunda respuesta debe serq
para fines de no envoltura de prueba.3
en una lista para la comparación es un buen truco. Lo resolví solo para mi propio entretenimiento, y perdí un byte allí porque lo usaba0=2>
. De lo contrario, terminé con casi lo mismo que su primera solución, excepto por el uso en::\
lugar delWf%
último paso.Bash,
95948581 bytesUna primera solución elegante pero larga para comenzar ...
¡Gracias a User112638726 por guardar un byte con
sed
, DigitalTrauma por guardar 9 confold
, y Rainer P. por guardar 4 más conawk
'ssubstr
!Para ver cómo funciona, tomemos la entrada
abababcbcbcbcbbababa
.Después
fold -2
(ajuste la línea a un ancho de 2), tenemosDespués
sort | uniq -c
(-c
es un indicador muy ingeniosouniq
que genera el recuento de cuántas veces aparece cada línea en la entrada), obtenemosAhora examinemos el
awk
comando final :$1>2
: Solo genera material si el registro 1 (también conocido como el número de votos idénticos) es mayor que 2 (es decir, ≥ 3). En otras palabras, ignore cualquier línea que comience con un número ≤ 2.{c[substr($2,2)]+=$1}
: Si el número es mayor que 2, agregue ese número a lac
tabla hash, utilizando el segundo carácter del registro 2 (también conocido como vote-ee) como clave. (No tenemos que inicializar todo a cero; loawk
hace por nosotros).END{...}
: Esto solo significa "después de procesar todo el archivo, esto es lo que debe hacer a continuación".for(x in c)printf x c[x]
: Bastante autoexplicativo. Imprima cada clave y su valor correspondiente.fuente
&
es equivalente a\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
, por ejemplo.JavaScript,
114113110Casos de prueba:
Mostrar fragmento de código
En un nivel alto, este código llena un objeto con pares clave-valor que asignan los destinatarios del voto al número de votos, como
{ b:7, a:3 }
y luego los une en una cadena en unfor
bucle. El código está en unaeval
expresión para permitir el usofor
dentro de una función de flecha sin necesidad de gastar bytes en{ }
y;return r
.(¡Apoyos para user81655 para guardar tres bytes!)
Explicación del
eval
código:fuente
Haskell, 103 bytes
Ejemplo de uso:
f "jkkjjkkjjkkjljljljmlmlnmnmnm"
->"k3j6m3"
Cómo funciona:
fuente
JavaScript (ES6),
195174169167158 bytesPrueba
Mostrar fragmento de código
fuente
var
s. ¿A quién le importa contaminar el alcance global del código golf? ;)/(\w{2})/g
puede ser/../g
: ya sabemos que la entrada es solo letras, y repetir uno (o dos) caracteres es más corto que{2}
. Si está interesado, puede ver (y comentar preguntas) mi respuesta de JavaScript a este desafío. ¡Bienvenido a PGCC!Mathematica,
11010099 bytesfuente
Perl,
868483 bytesEso es 82 bytes más 1 para el
-p
argumento de la línea de comandos:Algo no golfista:
${$'}
lugar de$g{$'}
. Lamentablemente,$$'
no funciona.fuente
Pure Bash, 151
Más de lo que esperaba, pero aquí está.
Utiliza la indexación de matriz asociativa para hacer el recuento necesario. Requiere bash versión 4.0 o superior.
fuente
PHP 247 caracteres
(Ay)
Explicado
Hice esto sin mirar otras respuestas. Este es el código de golf más difícil que he abordado hasta ahora. Agradezco todas las optimizaciones.
fuente
R, 221 bytes
código
sin golf
Aquí hay mucho margen de mejora.
fuente