Votre objectif : écrire un morceau de code qui donnera le résultat classique de "Hello, world!" en cours d'impression sur STDOUT ou équivalent.
Règles : Le code doit être entièrement imprimé en ASCII. Tout le code doit être fonctionnel - la suppression de tout caractère de comptage unique doit modifier le résultat ou empêcher le code de fonctionner. Toutes les variables doivent être utilisées après l'affectation. Les littéraux de caractère et de chaîne doivent être nécessaires à la sortie - c'est-à-dire que le remplacement de tout littéral de caractère ou de tout caractère dans un littéral de chaîne par un autre caractère doit être capable de changer le résultat (et non via l'effet de la séquence d'échappement - remplacer le caractère par une barre oblique inverse) ou équivalent)
(REMARQUE: la règle finale a été modifiée dans)
Scoring : C'est là que ça devient intéressant. Le score le plus élevé l'emporte en fonction du nombre de caractères, selon les règles de bowling de code typiques. Mais l'utilisation répétée de caractères entraînera des déductions de points. Plus précisément...
- L'utilisation répétée de tout caractère alphanumérique (az, AZ, 0-9) entraînera une déduction de 3 points par répétition (la première utilisation n'entraîne pas de déduction).
- L'utilisation répétée de la ponctuation de base ([!? .-, ": ';]) - y compris les crochets - entraînera une déduction de 2 points par répétition.
- L'utilisation répétée d'autres caractères ASCII {`~ @ # $% ^ & * _ + = | \ /> <} - y compris les accolades - entraînera une déduction de 4 points par répétition.
- L'utilisation répétée d'espaces, de tabulations et de nouvelles lignes entraînera une déduction de 1 point par répétition. Autrement dit, seule la première utilisation d'un espace, d'un onglet ou d'une nouvelle ligne comptera pour votre total.
Remarque: les commentaires ne comptent pas dans le total, bien que les caractères marquant le début / la fin d'un commentaire le soient. Par exemple, en C / C ++, si vous en avez /* This is a comment */
, alors il comptera deux barres obliques et deux astérisques, mais rien entre eux.
Quelques exemples (remarque: utiliser Julia comme exemple de langue) ...
print("Hello, world!");
Nombre total de caractères visibles: 22
Contient un espace: +1
Alphanumériques répétés: -12 pour llor Ponctuation
répétée: -2 pour "
Score final: 22 + 1-12-2 = 9
print("Hel",char(108),"o, wor",0x108,"d!"); # 0x108 makes a Uint8 that prints as ASCII
Nombre total de caractères: 43 (ne compte aucun caractère après #, qui est le caractère de commentaire)
Contient un espace: +1
Alphanumériques répétés: -18 pour rr1008 Ponctuation
répétée: -24 pour () "" "" ",,,,,
Final score: 43 + 1-24-18 = 2
xy=STDOUT
m="Hello, world!"
print(xy,m);
Nombre total de caractères visibles: 37
Contient une nouvelle ligne: +1
Contient un espace: +1
Alphanumériques répétés: -18 pour xyllor Ponctuation
répétée: -4 pour ",
Autres ASCII répétés: -4 pour =
Score final: 37 + 1 + 1-18-4 -4 = 13
Quelques morceaux de code invalides ...
x=2;print("Hello,world!")
Problème: x
est attribué, mais pas utilisé.
print("Hello,"*" world!")
Problème: *
inutile, le résultat sera le même sans lui.
k=1
if k>0
print("Hello, world!")
else
print("abcghjmquvxyzABCDEFGIJKLMNOPQRSTUVWXYZ_+*-&|")
end
Problème: la deuxième print
commande ne s'exécutera pas. De plus, la suppression des caractères entre guillemets dans la deuxième print
commande ne changera pas la sortie.
x="Hello, world!";
print(x)
Problème: la suppression de la nouvelle ligne ne changera pas le résultat ou ne provoquera pas d'erreur (dans Julia, le point-virgule n'est nécessaire que si plusieurs commandes sont sur la même ligne, sinon supprime simplement la valeur de retour).
print("Hellos\b, world!")
Problème: le s
caractère n'affecte pas le résultat, car il est effacé par \b
. Ceci est acceptable si cela se fait via le code ( "Hello",char(100),"\b, world!"
), mais ne peut pas être fait via des littéraux de chaîne ou des littéraux de caractère.
Calculatrice de score pratique - http://jsfiddle.net/4t7qG/2/ - grâce à Doorknob
Réponses:
Perl - 96
(Assez bien, étant donné le score théorique maximal de 97)
(Notez que la deuxième ligne commence par un
\t
caractère de tabulation réel )Le code comporte 98 caractères et contient chaque caractère ascii exactement une fois, plus un extra
-
.98 - 2 = 96
Il n'y a pas de littéraux de chaîne ici, mais la suppression d' un caractère unique interrompt le programme.
Désobfuscation
Il y a 3 déclarations dans ce programme (enfin, en fait 2 mais j'ai abusé
+
comme une sorte de séparateur de déclaration)s{}[Hel0o, w3$=d!]
Il s'agit d'un cas très étiré de l'opérateur sed. Il est plus communément écrit comme
s/a/b/
, ous:a:b:
, mais perl permet beaucoup plus de fantaisie ici:,s(a)(b)
s(a)^b^
s(a)[b]
et mêmes qaqbq
.Il remplace une chaîne vide (à l'intérieur
{}
) parHel0o w360d!
(à l'intérieur[]
) ($=
interpole à60
par défaut). En raison de l'absence d'un~=
opérateur, il fonctionne$_
.y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)
Il s'agit également d'un cas très étiré, mais d'un
tr
opérateur, également appeléy
(y< >( )
).Regardons le tableau de remplacement:
" # %&'*.124578:?@BCDEFGIJKLMNOQ /-9
\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cA k-u
j'ai déplacé certains caractères pour que la chaîne existante ne soit pas rompue. La seule partie réellement fonctionnelle ici est
/-9
->k-u
. Il remplace0
parl
,3
aveco
et6
parr
.Encore une fois, faute d'
~=
opérateur, il fonctionne.$_
Nous avons donc maintenant la phrase complète dans la
$_
variable.print
Le manque d'arguments permet d'imprimer uniquement la
$_
variable.la source
/-9
etk-u
sont réellement utilisés pour transformer la chaîne. Le reste est une poubelle de taille égale . Si vous supprimez un seul caractère, les ensembles se désaligneront et le programme ne produira pas "Bonjour, monde!" plus.<...> removal of any single counting character must change the result or cause the code to not function.
suppression d'un caractère n'importe où le brise. Vous pouvez le faire fonctionner en supprimant 2 caractères, mais ce n'est pas dans les règles.All code must be functional
. Vous contournez clairement les règles, à tout le moins. Je ne dis pas "cela enfreint les règles", mais c'est certainement discutable.Cette réponse a été créée avant l'ajout de la règle sur les littéraux de chaîne et ne participe pas au concours.
C'est complètement légitime. : P Si vous supprimez un caractère de cette chaîne, il s'imprimera
ello, world!
.la source
<<
doivent être supprimés.if 'x'>'w'
techniques, mais bloque "k \ bH" pour aboutir à "H", par exemple. N'hésitez pas à fournir une deuxième réponse après la restriction supplémentaire.CJam, 94
Essayez-le en ligne! Notez qu'il doit y avoir un tabulateur juste avant le saut de ligne. SE n'aime pas les tabulateurs, vous devrez donc les insérer manuellement.
Note totale: 94
J'ai utilisé le code suivant pour vérifier qu'aucun des caractères à l'intérieur de la chaîne ne peut être supprimé:
Il imprime un tableau indiquant le nombre de fois Hello, world! serait imprimé si le caractère correspondant à l'index était supprimé.
la source
254b
). Le module de résultat final 7 doit être 1, donc le bloc de code précédent est exécuté une fois. J'aurai besoin d'un module pour rendre chaque caractère nécessaire.Z
, leT
ou probablement quelques autres caractères ne change pas le résultat.Rubis,
2841Pour commencer les réponses avec une solution dans l'esprit de la question:
Notation (je pense avoir bien compris):
orli
)"'
)la source
.
entrée3.1
peut être supprimée sans problème. Tout comme lex
in0x4
ou le-
in8-5
.PHP, 1 (oui, un point!)
Utilisation de caractères magiques pour générer une somme de contrôle qui, sous forme binaire, correspond à "Hell", "o, w", "orld" et "!".
D'habitude, j'aime trouver des échappatoires, mais cette fois j'ai décidé de jouer selon l'esprit et l'intention du concours. Chaque personnage et sa position sont essentiels à la sortie. Les seuls endroits que vous pouvez remplacer sont des noms de variables qui ne sont pas des valeurs littérales, les espaces entre
php
etforeach
quiPHP
traitent comme équivalents et l'utilisation de'
vs"
quiPHP
traite comme similaires.Pour info, ce sont quelques autres chaînes magiques et hachages d'intérêt:
la source
\t
,\n
ou l'espace. Pas un expert PHP, mais;
semble également facultatif.Befunge-98 , 97 points!
Essayez-le en ligne!
L'onglet est entre le
q
et len
.Utilise une astuce similaire à la réponse Befunge précédente pour remplir les lignes avec les caractères restants, mais évite d'utiliser des caractères en double dans la section d'exécution. La suppression de l'un des caractères non exécutables a pour conséquence que les parties en cours d'exécution sont déplacées, se terminant généralement par des boucles infinies ou imprimant la mauvaise sortie.
Comment ça fonctionne
Vraiment, la seule partie d'exécution ressemble à:
Tout d'abord, il utilise un littéral de chaîne d'habillage pour ajouter
, world!
à la pile. Cela évite deux"
s.Cela ajoute
Hello
à la pile en utilisant une variété de méthodes pour éviter les caractères en double.$
saute l'espace excédentaire causé par le littéral de chaîne d'habillage7+
ajoute 7 à lah
fin du littéral de chaîne pour créer leo
.ba*46\%:
calcule 111, la valeur asciil
et la duplique.'e
ajoute e à la pile.f1g
obtient le personnage à 1,15 qui est leH
Il réutilise ensuite le
,
dans la chaîne pour imprimer le toutHello, world!
. Le reste n'est que des changements de direction pour naviguer jusqu'à la fin@
.la source
Rubis, 78
Plus d'abus de règles, je me sens, je ne sais pas exactement quel serait le patch. Prend une longue chaîne et vérifie la somme du résultat, donc toute suppression ou modification entraînera l'échec du programme. Pourrait probablement être optimisé un peu pour supprimer la duplication de certaines lettres et y ajouter des espaces.
la source
if
peut être supprimé.if
fonctionne réellement et que le truc après obéit toujours aux règles.puts('Hello, world!')
marcherait. Je pense que les règles doivent être clarifiées si cela est légitime.PHP, 2257
Faille: la barre oblique inverse a été omise des spécifications et du calculateur de score!
Ce code compte le nombre d'occurrences de barres obliques inverses dans chaque chaîne et imprime un équivalent ASCII. Le remplacement d'une barre oblique inverse par un autre caractère ou la suppression d'une barre oblique inverse provoque une erreur d'analyse ou modifie le résultat.
Une caractéristique intéressante des barres obliques inversées
PHP
est qu'elles doivent être échappées, de sorte que le score double automatiquement! Vous pouvez re-doubler, tripler, etc., le score en multipliant le nombre de barres obliques inverses, mais vous ne voulez pas être gourmand, et je pense que cela pourrait dépasser les limites de ce que vous pouvez entrer.la source
Befunge - 87
La première ligne vaut quatre points en raison de toutes les répétitions, mais il n'y a pas de caractères dupliqués sur la deuxième ligne. Le seul littéral de chaîne dans ce code est
dlrow ,olleH
, qui est inversé et imprimé en sortie. La suppression d'un caractère entraînera la déconnexionv
de la fin de la première ligne de@
la fin de la seconde, ce qui empêchera le programme de se terminer. Si lev
lui-même est supprimé, le code entrera dans une boucle infinie imprimant la sortie correcte.la source
Aceto , 3
Enfin réussi à obtenir un score positif!
Essayez-le en ligne!
la source
∑
n'est pas en cours d'impression ASCIIAcc !! , -138 (et oui c'est négatif 138)
Bien que ce ne soit pas exactement le meilleur score que j'ai jamais obtenu en PPCG, je doute qu'il puisse être plus élevé que cela en Acc !!
Essayez-le en ligne!
la source