Le défi
Votre objectif est d'écrire le programme le plus court possible qui prendra une liste d'événements (tels que les votes positifs, négatifs, etc.) et restituera la réputation de l'utilisateur et les privilèges qu'il a gagnés.
Quel genre d'événements?
Voici un tableau des événements, classés par ordre de réputation gagnée:
-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
Quelle sorte de privilèges?
Voici une liste de privilèges, par ordre de réputation requis.
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
Contribution
L'entrée (sur STDIN) sera une liste d'événements, un par ligne, exactement comment ils apparaissent dans le premier graphique (à l'exception du montant de la réputation). Une ligne vierge représente la fin de l'entrée. Voici un exemple (il devrait y avoir une ligne vide à la fin):
join website
association bonus
answer upvoted
answer upvoted
question upvoted
answer accepted
answer upvoted
accept answer
unaccept answer
question unupvoted
accept answer
question upvoted
Production
La première ligne de sortie (vers STDOUT) doit nommer la quantité de répétitions accumulées. Chaque ligne après cela doit répertorier un privilège gagné, exactement tel qu'il apparaît et dans le même ordre que le deuxième graphique. La sortie attendue pour l'entrée ci-dessus:
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
Règles, restrictions et notes
C'est le golf de code. Les règles de golf à code standard s'appliquent.
(EDIT: Étant donné que j'ai eu deux entrées qui accèdent aux fichiers, je voudrais souligner que la longueur du fichier doit être ajoutée à la longueur du code dans le cadre des règles standard pour le golf de code)
la source
Réponses:
GolfScript (
569 568 475473 caractères)Cela utilise des caractères non imprimables pour compresser les chaînes requises, donc au format xxd:
Modulo la compression de chaîne, le programme est
Assez trivial à bien des égards, mais il y a deux points d'intérêt.
La première est la fonction de hachage pour les chaînes d'entrée. J'ai été étonné de voir à quel point une fonction de hachage produit des résultats uniques pour chacune des 9
un
chaînes différentes (une fois supprimée) et, en bonus, elle produit également un résultat différent pour la chaîne vide, ce qui évite de supprimer la dernière ligne vierge du contribution.Le calcul du représentant pour une ligne individuelle est
Tout d'abord, il supprime
un
de la chaîne et note s'il a été trouvé. Ensuite , il applique une fonction de hachage super simple,h(s) = ( sum over i: (-1)^i s[i] ) % 11
. (Vous pouvez voir pourquoi j'ai été surpris quand je l'ai trouvé). La chaîneest une table de correspondance qui mappe la valeur de hachage au changement de rep (soustrayez 110 de la valeur ASCII), puis s'il a trouvé
un
au début, il annule le changement.Le deuxième point d'intérêt est le filtre des privilèges. J'ai essayé un peu plus simple:
qui évalue la ligne (les mots non définis ne font rien) afin d'obtenir son score pour comparaison avec la réputation (stockée dans
^
). Cela fonctionne presque . La chose qui la casse est celle quiand
se produit dans certaines chaînes, et c'est une fonction prédéfinie. Solution: modifiez suffisamment les lignes pour qu'ellesand
ne se produisent plus. (Il y a un cas à faire que supprimer des espaces serait mieux que supprimer la lettrea
, mais cela ne fait aucune différence dans la longueur).la source
Rubis 1.9.3,
514467459 (507460452 + 7 pour les drapeaux)Courez avec
ruby -rzlib <program>
.Si les littéraux de chaîne binaire ne se sont pas collés correctement (ce qu'ils n'ont probablement pas fait), voici un vidage hexadécimal:
la source
Haskell, 787 caractères
la source
C #
127112081206la source
C -
10831069Je me rends compte que je suis un peu en retard dans le match, mais C n'est pas représenté, alors je me suis dit que j'allais essayer.
Voici une version légèrement moins golfée:
Je pense que l'idée de base est similaire à celle de nombreuses autres personnes. J'utilise un petit hachage fait maison pour gérer la reconnaissance des entrées. Le hachage donne commodément zéro pour une chaîne vide, ce qui rend la ligne de lecture d'entrée très compacte. Je suis sûr que le hachage pourrait être considérablement amélioré. De bonnes économies de caractère pourraient être obtenues en permettant des collisions de hachage stratégiques pour des choses qui ont la même réputation.
J'ai également eu un vrai plaisir pervers à cacher unegoto
macro à l'intérieur (ma première utilisation d'ungoto
, je suis fier de le dire).Le seul endroit où je suis sûr que j'ai beaucoup de place pour l'amélioration est dans la section sortie. Je n'ai même pas tenté de compresser la logique d'impression réelle, donc je suis sûr que je pourrais également y enregistrer certains caractères.
la source
puts
place deprintf
.goto E
parreturn
(en éliminant l'étiquette) et supprimer la!=0
fonction de hachage (c'est redondant).C (
765737 caractères)Ou un peu plus lisible avec des sauts de ligne et un retrait supplémentaires:
Les codes ci-dessus supposent une seule nouvelle ligne à la fin du fichier. S'il y en a deux, alors il faut écrire
s+=*l?e[…]:0
au lieu des+=e[…]
, à un coût supplémentaire de 5 caractères . L'écriturewhile(*gets(l))
serait plus courte mais ne fonctionnera pas car je n'inclus pas d'en-têtes, donc le compilateur suppose que lesgets
retoursint
ne le sont paschar*
.L'expression de hachage a
(l[11]%8^l[7])-97
été trouvée en essayant toutes les expressions des formes suivantes, en recherchant celle avec la longueur de code résultante la plus courte:Une représentation de caractères ASCII imprimable appropriée a été trouvée en utilisant une recherche de force brute similaire.
Python 3 (
743715 caractères)Dans le même esprit que ci-dessus. Celui-ci s'appuie cependant sur une deuxième nouvelle ligne à la fin de l'entrée.
la source
Java - 1519 caractères
Pour trouver de la réputation, il ajoute tous les caractères dans la chaîne d'entrée (par exemple, «rejoindre le site Web» ajoute au formulaire 1219) et lorsque b == 1219, r = r + 1.
la source
c
fait unif
contrôle pour déterminer si untrue
oufalse
doit être renvoyé dans son pays comme celaboolean
duif
peut directement être retourné pour amener la taille vers le bas pour 1470 ;) J'ai suggéré une amélioration pour votre réponse. Il attend l'examen par les pairs :)Scala 1089
Réécrit à partir de zéro, presque. Si je dois calculer les données, il est moins cher (bien que moche) d'inclure les données directement.
Première approche, lecture des prix des événements et onglet privilège des fichiers:
lecture des données du fichier: 405
la source
J (704)
Le programme se compose de quatre parties:
le script de décodeur suivant ( 277 octets)
un fichier de mots binaires, appelé
w
, également 277 octets (télécharger ici ).Le format de fichier est le suivant: chaque mot est codé comme un groupe d '"octets" de cinq bits. Chaque groupe de cinq bits peut avoir une valeur de
1
à27
représentant des lettres ou0
être le séparateur. Chaque mot unique dans la description des événements et privilèges est stocké ici.un fichier d'événements binaires, appelé
e
, qui fait 54 octets (à télécharger ici ).Chaque événement se compose d'une réputation de 12 octets et d'un ou plusieurs mots de 6 octets. Par exemple,
accept answer
est codé comme suit:un fichier de privilèges binaires, appelé
p
, qui fait 96 octets (à télécharger ici ).Le format de fichier est le même que
e
, par exemple, ilaccess to moderator tools
est codé comme suit:la source
Perl,
856849 caractèresjuste ajouter des sauts de ligne après quelques points-virgules pour plus de lisibilité;):
la source
Java (1470 caractères)
Remarque: il s'agit d'une modification de la réponse d' Aman ZeeK Verma mais comme ma modification n'a pas été acceptée et que ma réponse est nettement plus courte que la sienne, je la poste ici.
Version lisible:
Version réduite:
la source
PHP: 676 caractères
Il ne gagnera aucun prix, mais bon sang, je ne peux pas comprendre comment le réduire, alors je vais le poster:
Étant donné que la partie qui calcule le représentant est très difficile à lire, la voici avec un formatage supplémentaire. Il abuse des constantes non définies et utilise @ pour les fermer:
la source
APL (549)
Celui-ci regroupe les données en caractères Unicode.
la source
Python 3.x (801 caractères)
Le mieux que je puisse faire jusqu'à présent, il suffit de trouver un meilleur codage que base64 (indice: quelqu'un peut-il aider?).
la source