Fabriquer une imprimante entière polyvalente est agréable et tout, mais écrire un seul code qui imprime beaucoup de nombres différents est lourd. Ne serait-il pas plus facile de créer un script qui génère un nombre, mais vous donne également un nouveau script pour obtenir le nombre suivant?
Défi:
Écrivez un code qui produit un seul entier N
et un code exécutable. Le code suivant devrait sortir N+1
et un code qui peut sortir N+2
. Continuez ce chemin jusqu'à ce que vous atteigniez N = 15
. (Le dernier numéro imprimé doit être 15).
Règles:
- Aucune entrée (supposez que l'entrée est vide).
- Un programme ou une fonction complète ou d'autres formats pratiques sont autorisés.
- Le premier code devrait sortir
1
. - Vous ne pouvez pas générer de zéros non significatifs. -À- dire que vous ne pouvez pas imprimer
01
pour1
. - La sortie doit être au format
N, Code_for_N+1
. Notez que la sortie est séparée par une virgule et un seul espace. Le code deN+1
n'a pas de guillemets.N , Code_for_N+1
n'est pas accepté (espace devant la virgule). Les retours à la ligne de fin sont OK. - Le ou les premiers caractères de la sortie doivent être le nombre. (Pas d'espaces de tête, ou
ans = N
). - Le numéro imprimé ne doit pas faire partie du code suivant (le code peut contenir ce numéro, mais vous ne pouvez pas prendre le numéro de sortie comme faisant partie du code)
- Exemple: La sortie
N=2
peut être:2, printer 2
. Dans ce cas,printer 2
est le code pourN=3
. Vous ne pouvez pas utiliser la sortie entière:2, printer 2
comme code pourN=3
.
- Exemple: La sortie
- Les scripts peuvent être dans différentes langues
- Les types de données ne sont pas pertinents (le nombre peut être une chaîne), mais il ne peut être entouré de rien (guillemets, parenthèses, etc.).
- S'il y a un code sorti,
N=15
il doit soit imprimerSTOP!
(voir bonus), soit ne rien imprimer du tout (pas même un espace ou une nouvelle ligne).- Le code de
N=15
ne peut pas planter (mais la sortie vers STDERR est OK). - Vous êtes disqualifié si le code de sortie pour les
N=15
impressions16
ou toute autre chose (sauf le cas bonus).
- Le code de
- Les opérateurs de quine intégrés ne sont pas autorisés.
- L'accès au fichier source via le système de fichiers n'est pas autorisé.
Prime:
-10 octets si le code qui imprime 15 produit également un code qui imprime " STOP!
"
Exemples utilisant la syntaxe Python: (évidemment, cela ne fonctionnera que pour les entiers sélectionnés, pas de 1 à 15.)
N = 1
print "1, print 2"
1, print 2
---
N = 15
print 15
15
---
N = 15 (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'
print 'STOP!'
STOP!
----
N = 15 (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!') (disp('STOP!') outputs STOP! in MATLAB)
----
N = 15 (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16
Les règles de golf standard s'appliquent! Le plus petit code (pour N = 1) en octets gagne!
f=>f+""
serait invalide? (f+""
renvoie le code de construction de la fonction.)14, print(14+1)
ou non?Réponses:
Pyth + ///, 15 octets - 10 = 5
Cela s'imprime
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!
en Pyth, en prenantrange(1,15+1)
et en supprimant les crochets de début et de fin, et en l'imprimant immédiatement suivi de ", STOP!".Les quatorze programmes suivants sont dans ///, qui génère directement tous les programmes qui ne contiennent pas
/
ou\
. Donc, le deuxième programmedonne
2
et le troisième programme3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
. L'avant-dernier programme15, STOP!
,, imprime15, STOP!
, donc le dernier programme est justeSTOP!
.la source
cat
que ça compte comme langue?cat
ne fait pas de test de primalité, donc non.JavaScript, 131238 - 10 = 131228 octets
L'approche naïve s'est avérée pire que prévu. Avec du recul, j'aurais dû m'y attendre. Mais je pensais que je le partagerais de toute façon. Code complet ici.
Idée: échapper itérativement et ajouter le
N-1, ...
la source
CJam,
262524 octetsEssayez-le en ligne.
Les programmes suivants ont simplement le premier numéro incrémenté. Cela exécute le programme 16 fois.
Ou avec bonus pour le même score:
Essayez-le en ligne.
Les programmes suivants ont simplement le premier numéro incrémenté. Cela exécute le programme 16 fois.
Solution alternative pour le bonus:
la source
</selfpromotion>
JavaScript (ES6),
6261 octets - 10 bonus = 51 pointsExplication
Une solution qui ne lit pas son propre code source et qui n'est pas non plus ridiculement longue.
Le premier programme construit les 15 autres programmes et les imbrique les uns dans les autres à l'aide d'une fonction récursive. Je contourne le problème de la barre oblique inverse en imbriquant les fonctions elles-mêmes (qui sont ensuite converties en chaînes lors de la sortie) plutôt qu'en chaînes.
Tester
Afficher l'extrait de code
la source
"" + (n=>m)
compte pas comme obtenir le corps de la fonctionn=>m
?Matlab,
226212- 10 = 202 octetsMerci à @StewieGriffin pour quelques octets =)
La première partie est une chaîne qui représente la deuxième ligne (ci-dessous), le code réel (juste décalé de 9). Dans Matlab, les chaînes sont des matrices remplies de caractères, vous pouvez donc facilement effectuer les décalages en ajoutant / soustrayant simplement un scalaire. Ainsi, le programme imprime à nouveau la même chaîne *, plus la même chaîne mais décalée, ce qui donne le code.
* Pas tout à fait: le premier octet est le compteur qui doit être augmenté à chaque itération.
L'astuce quine avec la chaîne a été volée sans vergogne d' ici.
Voici les dernières lignes de la séquence copiées depuis la console:
la source
JavaScript,
5047444244 * octetsC'est une fonction qui extrait (juste
a
) son propre corps et y fait des remplacements. Obtenir le corps de la fonction une fonctionnalité intégrée de JavaScript, bien qu'il ne soit pas explicitement un opérateur de quine (s'il n'est pas valide, supprimera la réponse).Dans le cas où cela ne fonctionne pas correctement intégré (car pour moi, cela ne fonctionne pas), vous pouvez voir un exemple ici .
* - on dirait que l'extrait produit le résultat sans
a=
, rendant les appels ultérieurs impossiblesla source
.replace(x++,x)
?a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)
marche?Python 2.7.10,
19692-10 = 82 octetsWhee !!! C'était amusant. Beaucoup plus court maintenant. : P
Explication:
J'ai commencé avec ceci:
Ce n'est qu'une simple quine. C'est cela avec un compteur ajouté:
n
est une variable de compteur qui est imprimée au début. Ensuite, lorsque son imprime len=
pièce, il remplacen+1
le%d
. Donc, à partir d'ici, il comptera infiniment.Et voici la version finale. Il ajoute une clause if pour s'arrêter à 15 et affiche "STOP!" ainsi que.
Ancien code:
Jamais gagner, mais amusant. : PBeaucoup plus court maintenant, même si je n'ai toujours aucune chance. : Pla source
else
s.PowerShell,
(215-10) = 205197167106104103 octets(Si votre seul outil est PowerShell, chaque problème ressemble à un clou. Attendez ...)
Essentiellement, nous commençons avec un réglage
$d
égal à une chaîne longue de gros ole d'une quasi- quine du code original. Il produit1
et ensuite$d
avec l'opérateur de format-f
pour remplir correctement le{0}
,{1}
,{2}
stand-ins, incrémenter le{2}
numéro dans la,1*{2}
section par un à chaque fois.L'
,x*y
opération dans PowerShell crée un nouveau tableau d'y
éléments, chacun étant égal àx
. Par exemple,,2*3
est équivalent à@(2,2,2)
.Cela signifie que la première sortie sera
1, $c=(,1*2).length;$d=(etc...)
, donc lorsque le deuxième code sera exécuté,$c
sera égal au nombre du tableau@(1,1)
, ou2
, etc. Notez que$c
n'est pas utilisé comme une variable dans le code d' origine, juste dans les courses suivantes.Arrête quand il imprime 15 en calculant simplement si
$c
égal15
et en indexant ensuite dans un tableau, le 0ème élément est$c, $d
comme décrit ci-dessus, l'autre est juste15
. Ainsi, à$c
15 ans, il sortira15
et rien d'autre. Ne donne pas droit au bonus, car"15, {0}STOP!{0}"
5 caractères sont trop longs pour que le -10 en vaille la peine.Nécessite un terminal PowerShell d'une largeur> ~ 150. Ou pour vous de supprimer manuellement le saut de ligne supplémentaire (que le terminal obligeamment insère sur sortie) lors du copier-coller du code. Ou pour que vous capturiez la sortie dans une variable, puis réexécutez cette variable. Etc.
Edit 1 - Enregistré quelques octets en supprimant le "STOP!" formulation.
Edit 2 - Durr, n'utilisez pas .length à chaque fois, appelez-le une seule fois
Edit 3 - N'a pas besoin d'être une quine, donc l'exécution initiale peut être beaucoup plus courte
Edit 4 - Changé d'utiliser des chaînes en tableaux à calculer
$c
, ce qui a permis d'économiser deux octets. Je suis presque sûr que c'est presque optimal pour cette approche.Edit 5 - Sauvegardé un autre octet en comptant directement l'égalité plutôt que le modding
la source
JavaScript, 79-10 = 69 octets
Sans utiliser
Function.prototype.toString
du tout.la source
Befunge, 57-10 = 47 octets
Celui-ci est génial. Essayez-le ici .
la source
STOP!
Lot, 73 + 5 - 10 = 68 octets
Nécessite
CMD /V:ON
donc j'ai ajouté 5 octets pour cela.la source
Python 2.7, 107 caractères
En utilisant la récursivité et en n'écrivant pas de quine, j'ai pensé que je pourrais économiser beaucoup, ce qui est vrai, mais pas assez bon. Bien que n'étant pas gagnant, je pense que l'approche est amusante à partager.
J'ai commencé par créer une chaîne pour N = 4, en échappant aux caractères
\
et"
.J'ai ensuite créé une fonction lambda qui crée cette chaîne, basée sur un index de démarrage et un index d'arrêt, en utilisant la récursivité. Ça y est:
Utilisez-le comme ceci:
Sortie: [32902 caractères, trop long à gérer]
Donc, il semble que mon approche de la complexité kolmogorov ne soit pas si réussie ;-)
la source
SMBF , 28 octets
\x10
représente un octet littéral (valeur décimale 16). L'entier est sorti sous forme d'entier (octet). Donc, la première sortie de caractère est\x01
. Le programme imprime ensuite ",". Lors de l'impression de sa propre source, il imprime un supplément+
au début.Explication:
Notez que vous ne pouvez pas l'exécuter dans un interpréteur standard car il nécessite un littéral hexadécimal en entrée. Vous avez également besoin d'un terminal spécial pour que la sortie hexadécimale fonctionne correctement.
la source
Bash,
787473 - 10 = 63 octets (exemple, impossible de gagner)Arrivant tard, mais vu que bash n'avait pas été essayé, essayez-le. Premier défi du golfe et puzzle de type quine. Ils sont amusants!
Explication:
Cela fonctionne parce que les
a
étapes de 1 à 15 et est ensuiteunset
avecp
. Le script (stocké dansp
) les imprime tous les deux s'ils sontset
et "STOP!" autrement. La valeur initialeunset
a
estset
à 0 car elle apparaît dans une expansion arithmétique.la source
𝔼𝕊𝕄𝕚𝕟, 30 caractères / 47 octets (non compétitif)
Try it here (Firefox only).
J'ai enfin trouvé une bonne vraie quine pour 𝔼𝕊𝕄𝕚𝕟.
Explication
Voici le vrai quine que j'ai utilisé:
⟮ⒸⅩ222+ᶈ0
Vous le voyez dans ma réponse? Espérons que vous pourrez tous vous développer à partir de là.
la source
Keg + PHP, 19-10 = 10 octets
Compte de 1 à 15 puis s'arrête. TIO
Keg, 13 octets
la source