El reto
Su objetivo es escribir el programa más corto posible que tomará una lista de eventos (como votos positivos, negativos, etc.) y devolverá la reputación del usuario y los privilegios que se ha ganado.
¿Qué tipo de eventos?
Aquí hay una tabla de los eventos, enumerados en orden de reputación ganada:
-15 answer unaccepted
-10 answer unupvoted
-5 question unupvoted
-2 answer downvoted
-2 question downvoted
-2 unaccept answer
-1 downvote answer
+1 join website
+1 undownvote answer
+2 accept answer
+2 question undownvoted
+2 answer undownvoted
+5 question upvoted
+10 answer upvoted
+15 answer accepted
+100 association bonus
¿Qué tipo de privilegios?
Aquí hay una lista de privilegios, en orden de reputación requerida.
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
200 retag questions
250 view close votes
500 cast close and reopen votes
750 established user
1000 edit questions and answers
1000 create gallery chat rooms
1250 create tag synonyms
1500 approve tag wiki edits
2000 access to moderator tools
3500 protect questions
4000 trusted user
Entrada
La entrada (en STDIN) será una lista de eventos, uno por línea, exactamente como aparecen en el primer gráfico (excepto por la cantidad de reputación). Una línea en blanco representa el final de la entrada. Aquí hay un ejemplo (debe haber una línea en blanco al final):
join website
association bonus
answer upvoted
answer upvoted
question upvoted
answer accepted
answer upvoted
accept answer
unaccept answer
question unupvoted
accept answer
question upvoted
Salida
La primera línea de salida (a STDOUT) debe nombrar la cantidad de repeticiones acumuladas. Cada línea después de eso debe enumerar un privilegio obtenido, exactamente como aparecen y en el mismo orden que el segundo gráfico. La salida esperada para la entrada anterior:
153 reputation
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
Reglas, restricciones y notas
Este es el código de golf. Se aplican las reglas estándar del código de golf.
(EDITAR: dado que he tenido dos entradas que acceden a los archivos, me gustaría señalar que la longitud del archivo debe agregarse a la longitud del código como parte de las reglas estándar para el golf de código)
fuente
Respuestas:
GolfScript (
569 568 475473 caracteres)Esto usa caracteres no imprimibles para comprimir las cadenas requeridas, por lo que en formato xxd:
Módulo de compresión de la cadena, el programa es
Bastante trivial en la mayoría de los aspectos, pero hay dos puntos de interés.
La primera es la función hash para las cadenas de entrada. Me sorprendió lo simple que una función hash produce resultados únicos para cada una de las 9
un
cadenas diferentes (una vez que se elimina), y como beneficio adicional, también produce un resultado diferente para la cadena vacía, lo que ahorra quitar la línea en blanco final de la entrada.El cálculo de rep para una línea individual es
Primero, se elimina
un
de la cadena y toma nota de si se encontró. A continuación, se aplica una función hash súper simple,h(s) = ( sum over i: (-1)^i s[i] ) % 11
. (Puedes ver por qué me sorprendió cuando lo encontré). La cuerdaes una tabla de búsqueda que asigna el valor hash al cambio en rep (resta 110 del valor ASCII) y luego, si se encuentra
un
al principio, niega el cambio.El segundo punto de interés es el filtro de los privilegios. Intenté uno un poco más simple:
que evalúa la línea (las palabras indefinidas no hacen nada) para obtener su puntaje para comparar con la reputación (almacenada en
^
). Es casi funciona. Lo que lo rompe es queand
ocurre en algunas de las cadenas, y es una función predefinida. Solución: destruya las líneas lo suficiente como para queand
ya no ocurra. (Hay que argumentar que eliminar espacios sería mejor que eliminar la letraa
, pero no hace ninguna diferencia en la longitud).fuente
Ruby 1.9.3,
514467459 (507460452 + 7 para banderas)Corre con
ruby -rzlib <program>
.Si los literales de cadena binarios no se pegaron correctamente (lo que probablemente no hicieron), aquí hay un volcado hexadecimal:
fuente
Haskell, 787 caracteres
fuente
C #
127112081206fuente
C -
10831069Me doy cuenta de que llego un poco tarde al juego, pero C no está representado, así que pensé que podría apuñalarlo.
Aquí hay una versión un poco menos golfizada:
Creo que la idea básica es similar a los enfoques de muchas otras personas. Utilizo un poco de hash casero para tratar de reconocer las entradas. El hash convenientemente da cero para una cadena vacía, haciendo que la línea de lectura de entrada sea muy compacta. Estoy seguro de que el hash podría mejorarse mucho. Se pueden obtener algunos buenos ahorros de carácter al permitir algunas colisiones estratégicas de hash para cosas que tienen la misma reputación.
También me divertí mucho perversamente escondiendogoto
una macro dentro (la primera vez que uso ungoto
me enorgullece decir que es la ).El único lugar donde estoy seguro de que tengo mucho margen de mejora es en la sección de salida. Ni siquiera he intentado comprimir la lógica de impresión real, así que estoy seguro de que también podría guardar algunos caracteres allí.
fuente
puts
lugar deprintf
.goto E
conreturn
(eliminando la etiqueta) y eliminar la!=0
función hash (es redundante).C (
765737 caracteres)O un poco más legible con saltos de línea y sangría agregados:
Los códigos anteriores suponen una nueva línea al final del archivo. Si hay dos, entonces uno necesita escribir en
s+=*l?e[…]:0
lugar des+=e[…]
, a un costo adicional de 5 caracteres . La escriturawhile(*gets(l))
sería más corta pero no funcionará, ya que no incluyo encabezados, por lo que el compilador supone que losgets
retornosint
nochar*
.La expresión hash
(l[11]%8^l[7])-97
se encontró probando todas las expresiones de las siguientes formas, buscando la que tenga la longitud de código resultante más corta:Se encontró una representación de caracteres ASCII imprimible adecuada utilizando una búsqueda de fuerza bruta similar.
Python 3 (
743715 caracteres)En el mismo espíritu que el anterior. Sin embargo, este se basa en una segunda línea nueva al final de la entrada.
fuente
Java - 1519 caracteres
Para encontrar reputación, agrega todos los caracteres en la cadena de entrada (por ejemplo, 'unirse al sitio web' se agrega al formulario 1219) y cuando b == 1219, r = r + 1.
fuente
c
hace unaif
comprobación para determinar si unatrue
ofalse
deben ser devueltos en donde como esteboolean
desde elif
se puede devolver directamente a traer el tamaño hasta 1470 ;) He sugerido una mejora para su respuesta. Está a la espera de una revisión por pares :)Scala 1089
Reescrito desde cero, casi. Si tengo que calcular los datos, es más barato (aunque feo) incluir los datos directamente.
Primer enfoque, lectura de precios de eventos y pestaña de privilegio de los archivos:
lectura de datos del archivo: 405
fuente
J (704)
El programa consta de cuatro partes:
el siguiente script decodificador ( 277 bytes)
un archivo de palabras binarias, llamado
w
, también 277 bytes (descargue aquí ).El formato del archivo es el siguiente: cada palabra se codifica como un grupo de "bytes" de cinco bits. Cada grupo de cinco bits puede tener un valor de
1
a27
en representación de letras, o0
siendo el separador. Aquí se almacena cada palabra única en la descripción de los eventos y privilegios.un archivo de eventos binarios, llamado
e
, que tiene 54 bytes (descargue aquí ).Cada evento consta de una reputación de 12 bytes y una o más palabras de 6 bytes. Por ejemplo,
accept answer
se codifica de la siguiente manera:un archivo de privilegios binarios, llamado
p
, que tiene 96 bytes (descargue aquí ).El formato del archivo es el mismo que
e
, por ejemplo,access to moderator tools
está codificado de la siguiente manera:fuente
Perl
856849 caracteressimplemente agregando saltos de línea después de algunos puntos y coma para facilitar la lectura;):
fuente
Java (1470 caracteres)
Nota: es una modificación de la respuesta de Aman ZeeK Verma pero como mi edición no fue aceptada y mi respuesta es significativamente más corta que la suya, la estoy publicando aquí.
Versión legible:
Versión Minificada:
fuente
PHP: 676 caracteres
No ganará ningún premio, pero vaya, no puedo entender cómo hacer que esto sea más pequeño, así que lo publicaré:
Dado que la parte que calcula el representante es muy difícil de leer, aquí está con formato adicional. Abusa de constantes indefinidas y usa @ para callarlas:
fuente
APL (549)
Éste empaqueta los datos en caracteres Unicode.
fuente
Python 3.x (801 caracteres)
Lo mejor que puedo hacer hasta ahora, solo necesito encontrar una mejor codificación que base64 (pista: ¿alguien puede ayudarme?).
fuente