Il y a eu quelques défis liés au doublement du code source: ici et ici . La tâche que nous avons ici est un peu plus difficile, mais devrait être réalisable dans presque toutes les langues.
Dans ce défi, vous prendrez un entier positif arbitraire. Votre programme doit sortir cet entier doublé . Lorsque votre code source est doublé, il prend un entier positif et le sort au carré .
Comment votre code source est-il doublé? Eh bien, vous pouvez l'avoir à votre guise . C'est - à - dire que vous pouvez diviser votre code source vers le haut dans les chaînes d'octets ou des caractères (ou jetons dans Langs lexicalisés) de toute égale longueur que vous voulez , et répéter chaque morceau deux fois de suite.
Pour un programme initial de ABCDEFGHIJKL
, (longueur 12) voici tous les programmes doublés possibles:
Chunk length | Doubled source code
-------------+-------------------------
1 | AABBCCDDEEFFGGHHIIJJKKLL
2 | ABABCDCDEFEFGHGHIJIJKLKL
3 | ABCABCDEFDEFGHIGHIJKLJKL
4 | ABCDABCDEFGHEFGHIJKLIJKL
6 | ABCDEFABCDEFGHIJKLGHIJKL
12 | ABCDEFGHIJKLABCDEFGHIJKL
Notez que cela signifie que les programmes de première longueur ne peuvent être doublés que de deux manières: chaque caractère est doublé ou le programme complet est répété deux fois.
Règles:
- Le code doit être un programme ou une fonction complète.
- Les failles standard sont interdites.
- Les méthodes d'E / S standard sont autorisées.
- Tous les caractères / octets, y compris les espaces et les sauts de ligne, sont comptés dans la longueur du code et contribuent aux morceaux.
- Vous pouvez supposer que l'entrée et son carré peuvent être représentés par le type int / entier de votre langue.
- Vous ne pouvez pas assumer un retour à la ligne ou un autre caractère.
- Indiquez votre taille de bloc dans l'en-tête après le nombre d'octets.
- C'est du golf de code , donc des programmes plus courts sont meilleurs! Si deux programmes ont la même longueur, celui qui utilise la plus petite longueur de morceau l'emporte. (Si vous avez un programme plus long qui utilise une plus petite longueur de morceau, cela vaut également la peine d'être publié!)
- Si votre programme nécessite une deuxième entrée / ligne, vous ne pouvez faire aucune hypothèse sur sa valeur. En particulier, votre programme devrait fonctionner si la deuxième entrée est vide, la même que la première, ou un entier différent. Si votre programme ne nécessite pas de deuxième entrée / ligne, vous pouvez ignorer cette restriction.
la source
.0
à la fin)?5 -> 10
; double code:5 -> 25 25
.Réponses:
Perl 5 , 8 octets (taille de bloc 4)
Essayez-le en ligne ou essayez la version doublée .
Unaire
~
est la négation au niveau du bit, donc l'appliquer deux fois est un noop. Ainsi, le programme de base multiplie simplement$_
(la variable d'entrée-sortie implicite) par 2.Le binaire
~~
est smartmatch, qui renvoie un booléen.~~+2~~+2
analyse comme(~~+2) ~~ (+2)
. Puisque 2 est égal à 2, cela donne vrai (1). Ainsi, le programme doublé se multiplie d'abord$_
par 1, puis se multiplie$_
par lui-même.la source
05AB1E , 4 octets (taille de bloc 2 ou 4)
Essayez-le en ligne ou doublé en un seul morceau de 4 octets ou doublé en deux morceaux de 2 octets .
la source
Python 3 , 26 octets (taille de bloc 13)
Essayez-le en ligne!
Doublé:
Cette solution est fournie par @Grimy.
Python 3 ,
323028 octets (taille de bloc161514)Essayez-le en ligne!
-4 octets grâce à @negativeSeven
Doublé:
Essayez-le en ligne!
La fonction tire parti de la règle de bloc unique de ce défi.
la source
Befunge-98 (FBBI) , 8 octets (longueur de bloc 2)
Essayez-le en ligne!
Essayez-le en ligne! (doublé)
À l'exclusion du flux de contrôle, le premier programme s'exécute
&:+q
(entrée, sommet de la pile en double, ajout, sortie avec code retour) et le second exécute&:*+q
(entrée, haut de la pile en double, multiplication, ajout (sommes avec un 0 implicite), sortie avec retour code)la source
Hexagonie , 14 octets (taille de bloc 14)
Étendu:
Essayez-le en ligne!
Doublé
Étendu:
Essayez-le doublé en ligne!
L'hexagonie est dans une position un peu bizarre dans ce défi, en ce sens que la réalisation de la tâche n'est pas beaucoup plus difficile que de simplement écrire les deux programmes individuels. Cependant, jouer au golf avec la solution s'est avéré plutôt difficile.
Cette solution est l'idée triviale sous la forme la plus courte que je pourrais adapter, mais je soupçonne qu'il y a des réponses plus courtes et plus intelligentes. Cette version définit très naïvement deux valeurs à l'entrée et les additionne ou les multiplie, selon que la source est doublée. La seule réutilisation de code est celle
"+
qui rend le code de copie pour le programme doublé suffisamment court pour tenir dans l'espace inutilisé du programme d'origine.Je soupçonne que l'utilisation des instructions de changement IP
[]
facilitera l'isolement des pièces, mais une solution vraiment idéale réutilisera beaucoup de code entre les deux. J'ai créé un programme d'aide pour doubler le code source hexagone. Notez qu'il supprime les no-ops de fin, donc si vous voulez avoir des no-ops à la fin, remplissez simplement un autre caractère et changez-le après. Il peut gérer différentes tailles de morceaux, même si je n'ai pas encore écrit de code pour sortir chaque programme possible (Hexagony semble se prêter à l'utilisation de la taille complète des morceaux).la source
Hexagonie , 12 octets (taille de bloc 4)
Essayez-le en ligne!
Formaté:
Et doublé , puis formaté:
Fondamentalement, cela définit le premier bord à l'entrée, puis le deuxième bord à l'une
2
ou à une copie de l'entrée, puis multiplie ces deux bords dans le troisième bord, imprime cela et se termine. La liste des instructions exécutées est justeet
La seule différence étant le
+
dépassement2
du deuxième programme.la source
JavaScript (ES6),
2422 octetsMalgré son format inhabituel, il s'agit de la définition d'une fonction anonyme, qui peut être appelée directement ou affectée à une variable.
Essayez-le en ligne!
Essayez-le en ligne doublé!
Comment?
L'application de l'unaire
+
à une fonction est interprétée comme une tentative de la contraindre à un nombre et donne NaN . Par conséquent, le principal+(g=x=>x*x)
est faux dans les deux versions.Par contre, l'application du binaire
+
entre 2 fonctions donne une chaîne. Par conséquent,(x=>x*2)+(g=x=>x*x)
est vrai dans la version doublée.la source
Perl 6 , 8 octets (taille de bloc 1)
Essayez-le en ligne! Essayez-le doublé!
Un lambda Whats / HyperWwhat qui prend un nombre et renvoie un nombre pour le premier programme et une liste singleton pour le deuxième programme. Fondamentalement, cela conserve la même logique exacte, sauf que l'opérateur de multiplication (
*
) est remplacé par l' opérateur exponentiel (**
).Le littéral
*
Whats ( également confondu par a ) est doublé en un HyperWwhat (**
) qui est fondamentalement le même, sauf qu'il mappe sur des listes. L'espace est nécessaire pour séparer le littéral Quoi que ce soit de la multiplication et est ignoré lorsqu'il est doublé. Au lieu de simplement2
(ce qui serait doublé22
), nous utilisons une liste contenant deux éléments, qui est évaluée à 2 dans un contexte numérique). Le<>
peut être doublé en une liste avec interpolation, et les deux éléments à l'intérieur sont doublés, mais aucun de ceux-ci ne modifie la longueur de la liste.la source
Enchantements runiques , 9 octets (taille de bloc 3)
Essayez-le en ligne!
Essayez-le doublé!
Le
3?
saute les 3 instructions suivantes, ce qui donne un (exécuté)i3?...:+@
. Lorsqu'il est doublé, il en résulte un exécutéi3?...:*@
où.
représente les 3 instructions NOP'd.@
est "imprimer la pile entière et terminer".la source
C # (Visual C # Interactive Compiler) / Javascript, 22 octets, taille de bloc 11
Essayez-le en ligne!
la source
=
en-
. Bonne réponse!Brain-Flak ,
4830 octets (taille de bloc 10)Essayez-le en ligne! Essayez-le doublé!
Cela prend essentiellement trois étapes, puis lorsque doublé exécute ces étapes deux fois chacune. Le programme initial est le suivant:
Pour une entrée
n
dans un programme sans problème, cela se traduit par:Pour le programme doublé:
la source
Brain-Flak , 76 octets, morceaux de 76 octets
Essayez-le en ligne!
Doublé (avec une nouvelle ligne pour plus de clarté)
Essayez-le en ligne!
Voici une version qui utilise une procédure de doublage plus complexe. Il fait 5 morceaux de taille 15. Le code ici est de 46 octets mais en raison du remplissage requis, il est sensiblement plus long.
10590 octets, morceaux de 15 octetsEssayez-le en ligne!
Doublé (avec de nouvelles lignes pour plus de clarté)
Essayez-le en ligne!
la source
Cubix ,
1814 octets (longueur de bloc97)Notez l'espace de fin. Essayez-le en ligne!
Doublé:
Encore une fois, il y a un espace de fuite. Essayez-le en ligne!
Explication
L'idée principale est que le doublement du code augmente la taille du cube, de sorte que le pointeur d'instruction commence à un symbole différent. Étant donné que le programme d'addition ne peut pas être placé sur un cube de longueur latérale 1, la longueur latérale sera de 2. En outre, le code doublé doit être sur un cube de longueur latérale 3, donc le code doublé doit être d'au moins 25 octets. . Cela signifie que le code doit être d'au moins 13 octets. En tant que tel, au plus 1 octet de plus peut être enregistré.
Passons maintenant au code réel. La première observation est que la face supérieure (c'est-à-dire les 4 premiers caractères) n'est pas utilisée par le programme d'addition. De plus, si nous faisons en sorte que le 5ème caractère reflète l'IP autour du cube, nous pouvons libérer 2 caractères supplémentaires. Nous utiliserons ces caractères pour mettre le programme de quadrature.
la source
Mornington Crescent , 656 octets (taille de bloc 328)
Juste pour ajouter du poids à la théorie selon laquelle cela peut être résolu dans presque toutes les langues ...
(La nouvelle ligne de fin est importante)
Essayez la version unique! ... ou ... Essayez la version doublée!
C'était un défi particulièrement délicat à Mornington Crescent parce que le programme doit avoir une structure aussi rigide. Il est également important de surveiller où le doublement aurait lieu, car la téléportation entre les stations est illégale à Londres.
La théorie ici est simple: dans la version simple, «Bounds Green» est rempli avec une chaîne aléatoire, mais dans la version doublée, il est rempli avec l'entrée au carré. Une fois le bloc terminé, les deux versions doublent l '«entrée», mais dans la version doublée du code, l'entrée a été remplacée par 0.
Ce résultat est ramené à Bounds Green, qui effectue une opération max () deux fois, avant de prendre le résultat en sortie. Dans la version simple, cela laisse le doublage inchangé (l'int et la chaîne sont simplement commutés d'avant en arrière), mais dans la version doublée, cela remplace le 0 par le résultat au carré déjà stocké dans Bounds Green.
Si mon explication n'était pas assez bonne, je vous suggère de visiter Londres et d'essayer les deux itinéraires vous-même.
la source
JavaScript (Node.js) ,
1512 octets (taille de bloc: 6)Essayez-le en ligne!
Cas unique:
Double étui:
Semble également fonctionner en C # et en Java si vous passez
=>
à->
?la source
R ,
423528 octets (taille de bloc 4)Maintenant avec un plus petit morceau et aucune erreur. J'ai également une solution plus longue avec la taille de bloc 3; voir ci-dessous.
Je ne pense pas qu'il soit possible d'écrire une réponse R avec une taille de bloc 1 ou 2; Je donnerai volontiers une prime à tous ceux qui me prouveront le contraire.
Essayez-le en ligne!
le
#
pour les commentaires dans R. La 3ème ligne est seulement des espaces, ce qui fait un bloc de retour à la ligne + 2 espaces + retour à la ligne, de sorte que le bloc précédent et suivant ne puisse pas avoir de retour à la ligne.Doublé, il devient:
Essayez-le en ligne!
La version unique calculen2× 4 = 2 n ; la version double calculen2× n2× 4 = n2 .
Voici une solution légèrement plus longue, mais avec une taille de bloc 3:
R , 39 octets (taille de bloc 3)
Essayez-le en ligne!
Doublé:
Essayez-le en ligne!
Notez que Giuseppe a une autre réponse R, avec un bloc de 30 octets.
la source
R ,
5930 octets (taille de bloc5930)Essayez-le en ligne!
Nous remercions Robin Ryder d' avoir inspiré cela; incrémente à
F
chaque fois et la fonctionf
sélectionne la sortie appropriée.Ce n'est pas particulièrement intéressant, mais sans doute quelque chose d'intelligent manipulant la taille des morceaux sera imaginé.Comme prévu, Robin Ryder est venu avec ce qui est à la fois plus court et a une certaine manipulation des morceaux.la source
PowerShell , 22 octets (taille de bloc 11)
Essayez-le en ligne .
Doublé:
Cette solution est basée sur la solution de @ ShieruAsakoto .
Solution @Grimy qui a été convertie en PowerShell, 26 octets (taille de bloc 13)
Essayez-le en ligne .
Doublé:
la source
Perl 5 (
-p
),2215 octets-7 octets grâce à Grimy
TIO
la source
$_*=/@F/?2:$_/4;
charbon , 13 octets
Essayez-le en ligne! Explication: La liste vide prédéfinie est falsey, donc l'entrée est multipliée par 2. Lorsqu'elle est doublée, la deuxième passe voit que la chaîne vide a été poussée dans la liste afin qu'elle multiplie l'entrée par elle-même à la place. Essayez-le en ligne! En syntaxe verbeuse, cela correspond à
Multiprint(Cast(Times(Cast(q), Ternary(u, Cast(q), 2)))); Push(u, w);
.la source
Python 3,
5653 octetsMes compétences en python sont un peu nulles, donc je peux certainement jouer au golf. Basé sur la réponse de Python dans le " je défi Je double la source, vous doublez la sortie! " .
Longueur de morceau 53.
Essayez-le en ligne ou essayez-le en ligne doublé .
la source
Java 8, 62 octets
Longueur de morceau 62.
Essayez-le en ligne ou essayez-le en ligne doublé .
Explication:
En Java, les commentaires disponibles sont
// comment
et/* comment */
. Qui sont combinés ici pour écraser certaines parties. Découvrez comment ces commentaires fonctionnent grâce à la mise en évidence Java:Le programme doublé a créé une
Byte
classe personnalisée et sa valeurSIZE=9
, qui écrase lajava.lang.Byte
classe par défaut et sa valeurSIZE=8
.la source
Japt ,
75 octetsEssayez-le | Doublé
²
pousse 2 dans le tableau des entrées,N
puisj
supprime et renvoie l'élément à l'indexJ=-1
(c'est-à-dire le nouvel inséré2
) et multiplie l'entrée par cela.Lorsqu'il est doublé, il
J
est multiplié par2
, donc l'élément à l'index-2
(c'est-à-dire l'entrée) est renvoyé parj
et utilisé comme multiplicateur.la source
Gelée ,
86 octets (longueur de morceau 3)Essayez-le en ligne!
Doublé
la source
Bonne solution: Lua , 66 octets (taille de bloc 66 octets)
Essayez-le en ligne! (doublez-le vous-même, ce n'est pas si difficile)
Oh oui, je suis sûr qu'il existe une solution plus courte à cela, mais c'est le mieux que j'ai pu trouver de cette façon. Prenez l'entrée comme premier argument.
Brève explication: toute l'entreprise avec
a
est assez évidente pour tout le monde, tandis que la deuxième partie avecx
est plus intéressante. Fondamentalement, je crée un tableau (ou en mets à jour un existant lors du deuxième passage) avec le finaliseur (__gc
métaméthode) qui est appelé lorsque le programme se termine.Lame solution: Lua , 60 bytes (chunk size 30 bytes)
Essayez-le en ligne! ou Essayez-le doublé!
Plus petit et avec de meilleurs morceaux, mais finalement ennuyeux et boiteux sans astuces intelligentes. Je suis presque sûr qu'aucun commentaire n'est requis pour celui-ci.
la source
J ,
15109 octetsEssayez-le en ligne!
Version doublée: essayez-la en ligne!
f : g
crée un verbe qui s'exécutef
lorsqu'il est appelé avec un argument etg
lorsqu'il est appelé avec 2 arguments. Ainsi, la nôtre s'exécute en double+:
avec la source d'origine et*-:
lorsque la source est doublée.Cela fonctionne car un train de deux verbes en J devient un crochet, et
f f
est donc exécuté commey f (f y)
où y est l'entrée d'origine. De plus,*-:
est lui-même un "crochet dyadique" qui fonctionne en multipliant*
l'argument de gauche par deux-:
l'arg droit. L'argument de gauche sera l'entrée d'origine et l'argument de droite sera l'entrée doublée, ce qui produira le carré de l'entrée d'origine.réponse originale
J , 15 octets
Essayez-le en ligne!
Version doublée: essayez-la en ligne!
Dans la version unique, nous avons un seul verbe qui utilise Agenda
@.
pour faire la logique if ... then: Si l'argument est égal à lui=~
- même , alors prenez l'argument et doublez-le(+:@[)
.Cependant, lorsque nous doublons le code, nous obtenons un crochet J. Appelez le verbe
f
et l'entréey
. Ensuite, le crochetf f
s'exécute comme ceci:Ce qui signifie que maintenant l'entrée d'origine est l'argument de gauche et l'argument de droite est l'entrée doublée. Puisque ceux-ci ne seront pas égaux,
=~
retourneront faux cette fois-ci, et maintenant nous allons exécuter l'autre fork de l'Agenda, c'est-à-dire*:@]
, ce qui signifie "cadrer l'argument de droite". Et puisque~
inverse les entrées d'un verbe dyadique, l'argument de droite sera l'entrée d'origine.la source
Python 3 , 60 octets
Taille du morceau 6.
Pas une bonne solution, mais ça marche. C'est un défi tellement unique qu'il vous fait vraiment réfléchir sous un angle différent.
Essayez-le en ligne!
Doublé:
Essayez-le en ligne!
la source
Cascade , 13 octets (taille de bloc 13)
Essayez-le en ligne!
Essayez-le doublé!
C'était assez difficile. L'essentiel de base est d'imprimer l'entrée multipliée par
2
pour le premier programme, et de la remplacer2
par une copie de l'entrée pour le second.Explication:
La partie exécutée du premier programme ressemble à
Le programme doublé ajoute essentiellement le premier
]
à la fin de la dernière ligne, donc le programme s'enroule autour de cela au lieu de&
. Cela en faitla source
Zsh , 30 octets (taille de bloc 10)
Essayez-le en ligne! Essayez-le doublé!
Abuse le fait que
$var
in$[$var]
est développé en premier, puis évalué dans le contexte arithmétique.Si quelqu'un veut une fissure pour abaisser cela, voici le plus proche d'une
24/8
solution que j'ai obtenue (les sortiesx^2+2
sont doublées)la source