Votre entreprise a récemment embauché un nouveau groupe d' administrateurs système extrêmement dévoués . Ils estiment que le simple fait de regarder des écrans d’ordinateur est très limitatif (je veux dire, une fréquence de rafraîchissement de 60Hz n’est PAS suffisant), ils ont donc connecté le bus de données de la CPU à un DAC et le reproduire sur un haut-parleur via la salle des serveurs afin de leur permettre de mieux entendre. à 20kHz. Un problème: ce sont des administrateurs système, pas des ingénieurs électriciens, et la configuration de leurs haut-parleurs ne cesse de se dégrader. Ils ont supposé que cela était dû à des modifications trop brutales des valeurs d'octet dans le code que les ingénieurs logiciels compilent sur le grand système. Les administrateurs système organisent maintenant un petit concours pour voir qui peut créer un code le plus doux possible pour la configuration de leurs haut-parleurs.
Défi
Votre mission est de créer un programme ou une fonction dans la langue de votre choix en laissant le moins de différences possible entre octets consécutifs (voir la section Calcul). Ce programme aura pour tâche de calculer son propre score.
Contribution
Une chaîne ASCII sur stdin
ou l'équivalent le plus proche de votre langue ou une entrée de fonction si vous créez une fonction. Étant donné que votre programme devra se prendre lui-même en tant qu'entrée pour calculer votre score, votre programme devrait prendre en charge Unicode s'il contient un caractère Unicode. Sinon, ASCII est suffisant. On peut supposer que la longueur d’entrée est d’au moins 2 octets.
Calcul
Chaque caractère de la chaîne sera converti en son équivalent numérique, en utilisant le standard ASCII. Ensuite, la différence entre tous les personnages sera d'abord mise au carré , puis additionnée . Par exemple, la chaîne abd
obtiendra un score de 1²+2²=5
.
Sortie
La sortie sera le titre de votre entrée. Cela signifie qu’il devrait être précédé d’un #
ou ajouté par un retour à la ligne et d’un -
(tiret). Ensuite, le nom de votre langage de programmation devrait être indiqué, suivi d'une virgule, d'un espace, puis d'un entier représentant le résultat du calcul. Par exemple
#C++, 98
serait sortie valide. La sortie doit être indiquée sur stdout
ou dans votre équivalent linguistique le plus proche, ou comme valeur de retour pour votre fonction.
Notation
Votre score sera la valeur calculée par votre programme, avec le programme lui-même en entrée.
Edit: Devrait gérer les nouvelles lignes maintenant, désolé pour avant, les gens
Voici un script Pyth pour vérifier le calcul de la partition.
la source
Réponses:
CJam,
1051827643569545407327279235233229Le programme ci-dessus génère le code source réel, long de 1 179 112 octets.
Essai
À l'aide de l' interpréteur Java , le code source peut être généré et testé comme suit:
Version alternative
Au prix de 36 points - pour un score final de 265 - nous pouvons raccourcir le code source de 99,92%:
Vous pouvez essayer cette version en ligne dans l' interpréteur CJam .
Idée
Nous voulons exécuter le code
garder le score aussi bas que possible. Pour ce faire, nous allons construire cette chaîne caractère par caractère (avec quelques no-ops avant et après) et évaluer le résultat.
Heureusement,
'
(littéral),(
(décrémentation) et)
(incrémentation) sont des caractères ASCII consécutifs. Il est donc relativement peu coûteux d’envoyer des caractères arbitraires.Les caractères ASCII suivants
'
peuvent être insérés après'()…)(
, le nombre de)
dépend du point de code.Par exemple,
+
peut être poussé comme'())))(
. La distance entre'
et(
, et(
et)
est égale à 1. La fin)(
s’annule; leur seule fonction est d’ouvrir la voie aux'
(correspondant au caractère suivant) avec des caractères consécutifs.Les personnages poussés de cette manière augmenteront le score de 4 points.
Les caractères ASCII précédents
'
peuvent être poussés comme''(…(
, le nombre de(
dépend du point de code.Par exemple,
#
peut être poussé comme''((((
. La distance entre'
et(
est 1.Les personnages poussés de cette manière augmenteront le score de 2 points.
''(…(
fonctionne réellement pour tous les caractères ASCII, puisque caractère est large de 16 bits et enroule autour. Par exemple,+
peut être poussé comme''
, suivi de 65 532(
s.Cette technique est utilisée dans la version de 1,2 Mo du code.
Le personnage
'
peut être poussé comme''
, laissant le score inchangé.Code
la source
Haskell,
1528279574291196839217744771742Usage (note:
"
doit être échappé):Je préfixe la chaîne vide
""
à la chaîne d'entrée pour aider l'interpréteur Haskell à déterminer les types. Sans cela, l'inférence de type échoue, le code est trop polymorphe. Le reste fonctionne comme d’habitude: mappez chaque caractère en ascii, dressez une liste des différences entre voisins, ainsi que les noms de carré, somme et préfixe.la source
> <>, 30227
Gah, le titre a doublé mon score; dans les mots de mon propre programme, n & oooooo! Je prendrai du temps plus tard pour améliorer la situation. Je sais aussi que ce score est peut-être faux, car je ne sais pas vraiment entrer de nouvelles lignes sur l'interprète en ligne et je ne suis pas sûr qu'il existe un moyen de renseigner une pile d'entrées sur celle officielle.
Bien que non totalement optimisé, il tire
pleinementparti de la proximité relative (au moins en termes de caractères ASCII) des commandes dans> <>. Je ne pouvais pas envoyer facilement la nouvelle ligne en entrée. J'ai donc utilisé l'outil de vérification du score Pyth, mais il correspond à un grand nombre de tests aléatoires que j'ai utilisés, donc tout devrait bien se passer.En voici un avec un score de 30353 (ce qui devrait être correct puisqu'il ne s'agit que d'une ligne):
la source
Java,
664656550662434Étonnamment court. Accepte un tableau de caractères au lieu d'une chaîne.
J'ai utilisé un programme pour générer les meilleurs noms de variables.
la source
((Function<char[],String>) ABCD->{…}).apply(…)
, merci. Ces lambdas semblent être assez incomplets sans le contexte de type.K5, 25478
Solution assez simple. C'est une fonction qui prend son entrée via une chaîne.
la source
Hôte ISE Windows PowerShell, 62978
638946796077050Éditer - économise des points en éliminant la
$A
variable et en comptant à rebours dans la chaîne, ainsi qu'en convertissant certains mots clés en CAPSEdit2 - a enregistré quelques points supplémentaires en utilisant
$($HOST.NAME)
au lieu dePowerShell
Edit3 - a enregistré quelques points supplémentaires en échangeant les noms de variables et en modifiant la façon dont la sortie est générée.
Utilise des variables nommées avec des nombres, car elles sont "plus proches" de
$
notre pénalité.Il est intéressant de ne pas utiliser les techniques de golf habituelles. Par exemple,
|%{$
est 22534, alors que|foreach{$
n’est que 8718.Ceci est probablement proche de l'optimum sans changer de technique.
la source
MATLAB,
1921439748394443878537593Merci à Luis Mendo pour avoir réduit davantage la différence!
Merci à NumberOne d’avoir réduit le nombre de bruit en modifiant le nom de la variable en entrée!
Comment ça marche
ans
variable par défaut dans MATLABA9876543210
et affiche la somme des différences carrées voisines de la chaîne.diff
trouve des différences voisines par paires dans un tableau et produit un tableau delength(A9876543210)-1
. En utilisantdiff
un tableau de chaînes, cela devient castdouble
tableau dans lequel les codes ASCII de chaque caractère sont générés et les différences des paires consécutives résultent en un autre tableau.diff(A9876543210)'
réellement produit plus de bruit qu'avecA9876543210.'
(merci Luis Mendo!)la source
A=
norm(diff(B))^2
est plus courte%d
.B
comme nom de variable?A=@(A)...
est valide MATLAB, carA
est limité.QBasic, 38140
YAY POUR SHOUTY SYNTAX
(Testé avec QB64 .)
C'est un programme complet qui entre la chaîne et sort la réponse. La seule limitation ici est que le programme ne peut pas prendre une entrée multiligne (
LINE INPUT
peut gérer n'importe quoi tant que c'est une seule ligne).Désobfusqué:
De manière pratique, le passage d'une chaîne de plusieurs caractères à
ASC
donne la valeur ASCII du premier caractère. De plus, les variables numériques sont automatiquement initialisées à zéro.la source
Python 2, 91026
Définit une fonction anonyme qui prend une chaîne et renvoie le score. Essayez-le en ligne .
La plupart de ceci est une implémentation fonctionnelle assez simple: zip
A
avecA[1:]
pour obtenir une liste de paires de lettres, puis soustrayez leursord
s, leur carré et leur somme avec une expression génératrice.Observez que les deux variables dans l'expression du générateur ne sont jamais suivies par les caractères suivants:
)
,,
, et dans l' espace. Ces trois valeurs ont des valeurs ASCII très basses, il est donc important de terminer chaque variable par un caractère de valeur ASCII aussi basse que possible. Le caractère le plus bas pouvant terminer une variable en Python est0
. De plus, chaque occasion que nous avons de scinder un grand saut en deux petits sauts fera baisser le score:A0
289, maisA90
seulement 145 etA9876543210
73!(Cette approche n'a pas aidé la variable lambda
A
, probablement parce qu'elle est suivie d'[
une occurrence.)la source
JSFuck, 144420642
Construisez-le à partir de:
Coller dans JSFuck.com petite boîte d'entrée de compiler à JSFuck. Le résultat est un script long de 112701 caractères, je ne peux donc pas le mettre ici. Les deux derniers caractères de ce script sont des parenthèses, insérez l’entrée entre eux.
Il faut presque 20 secondes au programme sur mon ordinateur pour s’évaluer.
Explication
J'ai plus de temps pour travailler dessus, alors je me suis assis et j'ai essayé d'optimiser les noms de variables. Voici les noms de variables qui valent la peine d’être utilisés, dans l’ordre de leur score.
Voici le code JavaScript que j'ai traduit en JSFuck:
J'ai examiné de plus près le traducteur de JSFuck.com et compris comment fonctionne sa fonction d'évaluation. Si "Source Eval" est coché, le code deviendra une fonction JSFuck à exécution automatique. Cependant, pour obtenir les entrées, nous devons accéder aux arguments [0] depuis la fonction. Cela porte notre code JS final à ...
(Si vous vous demandez pourquoi ma version précédente avait un score inférieur à celui-ci, c'est parce que c'était un programme JSFuck qui renvoyait une chaîne qui devait être évaluée en tant que JS. C'est aussi pourquoi je ne l'ai pas laissé dans le post)
la source
abs
est inutile. Je suppose que cela pourrait faire la différence ... :)JSFuck, 102280181
.CJam,
236631938911547Essayez-le en ligne
On commence à penser que cela peut être poussé presque sans fin en ajoutant stratégiquement plus de personnages. Mais je pense que je commence à atteindre un point de rendements décroissants ici, alors je vais arrêter pour le moment. Par exemple, où j'ai
ULC;;;
, je pourrais utiliser tout l’alphabet à l'envers suivi de 26;
, mais les gains deviennent de plus en plus petits.De loin, le plus grand écart qui me reste est entre le
m
et le,
dans la chaîne initiale. Je n'ai rien trouvé de raisonnable pour m'en débarrasser. Je suis sûr qu'il y a des moyens. Mais si je le pousse à l'extrême, cela pourrait ressembler à la solution de Dennis ...la source
JAVASCRIPT, 33911
C'est de loin l'une des optimisations les plus stupides que j'ai jamais faites dans un code de golf ...
Accessoires de Neil pour la suggestion "commentaire spam" = P
la source
/**/
dans des endroits appropriés.JAVASCRIPT, 31520
Cette solution était
nettement plus ridicule ettrès différente de la précédente, et j’ai estimé qu’elle méritait sa propre réponse.Il s’agit de 7306 caractères, dont la plupart sont le programme réel codé dans cette chaîne 0/1, le reste servant simplement à le décoder. Cela fonctionne en obtenant l'index de chaque '1' moins l'indice du précédent '1' pour obtenir la valeur de caractère nécessaire. Il évalue ensuite la chaîne résultante dans la fonction réelle, qui est essentiellement un programme de golf standard permettant de résoudre le problème (qui ne compte que 105 caractères environ).
la source
R,
68911571835381652224Prend une chaîne de STDIN et la convertit en un entier via raw. Diffs, carrés et résume le vecteur résultant. Le résultat est renvoyé sous forme de chaîne. Merci à @nimi pour le nom de variable tip.
la source
Mathematica, 33552
Ce code est évalué à une fonction non nommée, qui calcule le "bruit" d'une chaîne d'entrée. Il tire parti du fait que la représentation ASCII des données binaires est essentiellement "sans bruit". Les données binaires que vous voyez sont la chaîne
ce qui aurait été une réponse valable en elle-même, marquant 37848.
Tout le reste
décode simplement la chaîne binaire et l’interprète en tant que code Mathematica. Notez que le commentaire vide de Mathematica
(**)
est très "peu bruyant" et supprime réellement le bruit du"
s.la source
Java8:
1171701005089906298890Avec l'aide de l'expression lambada et l'affectation en ligne d'une variable, vous pouvez raccourcir un peu ce code.
la source
Java,
129 300128 400110930106581105101Ce défi m'a en fait amené à approfondir la réflexion sur l'utilisation et l'optimisation des personnages plutôt que sur la recherche de la solution la plus courte. Je vais continuer à travailler pour réduire le nombre.
C'est une fonction lambda,
B
la chaîne représentant la fonction. N'oubliez pas d'échapper à la citation ("
) lorsque vous transmettez ceci sous forme de chaîne.la source
Pyth, 16391
Le seul truc à noter utilisé ici est le codage en base 256
#Pyth,
, qui coûte beaucoup moins cher que la chaîne elle-même.la source
M, 47033
52798Pour utiliser cela, nous devons échapper les guillemets et "échapper" les caractères d'espaces (qui sont significatifs dans MUMPS!) Comme ceci:
Notez que "M" est un nom alternatif pour "MUMPS" - il existe un désaccord parmi les praticiens à propos de celui qui est correct. Naturellement, j'ai choisi l'option plus courte ici.
la source
NEW
farcir). Donc, quand je commence à faire de l'arithmétiqueAAAA
(maintenantAAA9876543210
), il est contraint0
(c'est peut-être juste un détail d'implémentation de Caché? Je n'ai pas d'installation GT.M contre laquelle tester). Bon appel à la chose des priorités de l'opérateur; J'ai toujours du mal à penser en termes d'opérations purement de gauche à droite. (J'ai aussi oublié que M a un opérateur d'exponentiation - ce n'est pas quelque chose qui revient souvent lorsque vous écrivez des applications CRUD.)Ruby, 118402
Il lit dans un fichier via la ligne de commande, telle que
ruby diff.rb /path/to/file
. Il y a place à l'amélioration, et c'est un sujet sur lequel je travaille actuellement.la source
C ++ 166345
la source
Perl, 93556
Je vais essayer de réduire cela un peu plus.
Il s'avère que les accolades (
{
et les}
ASCII 123 et 125) et le trait de soulignement (_
, ASCII 95) sont très coûteux, car tous les autres caractères se situent autour de 30 à 70, c'est pourquoi j'ai formatéif
la manière que j'ai faite, et pourquoi j'utilise$AAAAA
plutôt que le bien-aimé de Perl$_
.Malheureusement, toutes les variables contenant des symboles sont en lecture seule. Je ne peux donc pas tirer parti des combinaisons telles que
$#
et$$
.la source
F #,
136718130303Où il y a un
\n
après le;
.la source
POSIX Shell, 172026
dommage que je ne puisse pas obtenir le même résultat que le vérificateur Pyth (178386) ...
la source
Lua,
171078117896Golfé:
Ungolfed:
la source
C ++, 49031
une macro C ++ qui prend une chaîne de caractères et écrit le résultat dans la sortie standard
Essayez-le en ligne!
la source
C ++, 5
la source