... au moins pour une définition de "auto-modification".
La tâche
Dans ce défi, votre tâche est d'écrire trois chaînes A
, B
et C
qui satisfont les propriétés suivantes.
La chaîne
B
a une longueur d'au moins 1.Pour chaque
n ≥ 0
chaîne, la chaîne est un programme valide (c'est-à-dire un programme exécutable complet ou une définition de fonction) dans le langage de programmation de votre choix. La répétition de la désigne superscript, donc ce moyen les cordes , , , etc. Chaque programme prend une chaîne en entrée, et retourne une chaîne en sortie.ABnC
AC
ABC
ABBC
ABBBC
Pour tout
m, n ≥ 0
, si le programme est exécuté avec une entrée , il retourne . Pour les entrées qui ne sont pas de cette forme, le programme peut faire n'importe quoi, y compris un plantage.ABmC
ABnC
ABm*n+1C
Quelques exemples dans le format program(input) -> output
:
AC(AC) -> ABC
ABC(AC) -> ABC
ABBBBBC(AC) -> ABC
AC(ABC) -> ABC
AC(ABBBBC) -> ABC
ABC(ABC) -> ABBC
ABBC(ABC) -> ABBBC
ABBBBC(ABBBC) -> ABBBBBBBBBBBBBC
ABBBC(ABBBBBBC) -> ABBBBBBBBBBBBBBBBBBBC
Règles et notation
Votre score est la longueur totale de A
etC
, le score le plus bas étant meilleur. Notez que bien que B
ne soit pas compté dans la partition, il doit être produit par A
et C
comme dans le premier exemple.
Les failles standard sont interdites. Les programmes ne sont pas autorisés à accéder directement ou indirectement à leur propre code source (sauf quand ils le reçoivent en entrée). Vous devez identifier les chaînes A
, B
et C
dans votre réponse d'une manière ou d'une autre, et les encourager à expliquer votre solution.
la source
Pyth, 10
Nous avons divisé la source en deux lignes. La première ligne est A, la deuxième ligne sont les Bs. Comme A est sur la première ligne, le premier
w
imprime simplement A - facile, c'est fait.En Pythme, les zéros de tête sont des jetons séparés, il
[00)
en est de même[0, 0]
. Notez que la première ligne se termine parl[
et la deuxième ligne est constituée de0000...
. Donc,l[
compte réellement le nombre de Bs dans ce programme. La secondew
lit dans la seconde ligne de l'entrée - c'est le nombre de Bs de l'entrée. À partir de là, il suffit de multiplier, incrémenter et afficher autant de zéros.la source
Retina ,
2519 octetsExemple de
ABC
code:Le code a deux étapes de substitution:
changer l'entrée
AB^mC
enAB^(m*n)C
en changeant chaqueB
enB^n
:]\]
correspond à tousB
dans l'entrée et rien d'autre grâce à échapper dans les lignes de modèle]]...]]
estB^n
changer
B^(m*n)
àB^(m*n+1)
parm`^]*$
en prenant la ligne avec seulement]
« s]$0]
l'ajout d'une paire supplémentaire de]]
manière à ce que cette ligne ne corresponde pas à la première expression régulièreJ'ai ajouté 3 octets à la partition pour l'
-s
indicateur multiligne nécessaire afin que tout le code Retina puisse figurer dans un fichier.2 octets enregistrés grâce à @ MartinBüttner.
la source
Python 3, 51 octets
Exemple d'utilisation:
La fonction calcule
n*m+1
avec(1+len("xxx")*(len(s)-51))
où il y am
x
s dans la chaîne (laxxx
partie est laB^m
). Multiplier la chaîne"x"
avec ce nombre donneB^(n*m+1)
et la fonction prendA
etC
sort de l'entrée et concatène tous ceux-ci à obtenirAB^(n*m+1)C
.La même approche dans J:
J, 35 octets
la source
CJam, 22
Exemple d'exécution:
ce qui se traduit par
avec entrée comme
ce qui donne la sortie suivante:
Comment ça marche :
Jetons un coup d'œil à quels programmes
AC
et à quoiABC
ressemble:Nous remarquons que
C
=B_~
Regardons ce qui
B
se passe:Voyons maintenant ce que faire
AC
sans entrée fera:Wow, la sortie est
ABC
.Nous comptons essentiellement combien
B
il en existe dans le code. Puis combien sont en entrée (en utilisant la longueur). Multipliez-les, incrémentez deux fois (depuis aC
égalementB
) et ajoutez_~
pour obtenirC
Essayez-le en ligne ici
la source
Haskell , 50 octets
f
est une fonction prenant et retournant unString
.La chaîne B n'est qu'un seul espace, alors que C commence par un.
Essayez-le en ligne!
_:b=" "
assigne à tous les espaces du littéral chaîne, à l'exception du premierb
, ce qui est égal aux m m copies du programme.s
est la chaîne d'entrée.a:c<-words s
la scinde en mots séparés par des espaces, de sorte que celaa
devienne A etc
devienne une liste de mots constituant C. Les copies B sont ignorées carwords
pressent de multiples espaces (ce que le reste du programme évite).drop 50s
est une chaîne de longueur égale au nombre n de B copies en entrée.drop 50s>>b
concatène autant de copies deb
, en donnant des espaces mn .unwords$a:(drop 50s>>b):c
relie toutes les chaînes avec des espaces. Puisqu'il y a un "mot" supplémentaire(drop 50s>>b)
inséré dans la liste, il y a aussi un espace de jonction supplémentaire, ajoutant automatiquement le +1 à la multiplication.la source
Matlab, 85
C'était la première fois que je faisais un défi aussi abstrait, alors pour moi, c'était plus un défi de codage qu'un défi de golf-code!
Les trois chaînes sont, sans les guillemets:
Comment cela fonctionne: Je divise l'argument d'entrée en espaces, je
n
peux donc le déterminer à partir du nombre de parties de chaîne. B fonctionne comme une sorte de compteur à obtenirm
. Pour reconstituer la réponse, j'utilise A et C à partir de la scission, répétez B m * n + 1 fois et j'insère les espaces en utilisant leur valeur ASCII, afin d'éviter toute scission indésirable dans C.EDIT: whoops, compté accidentellement A + B
la source
C (gcc) , 81 octets
L'obligation d'identifier les chaînes semble contredire le fait que nous soyons autorisés à adopter un comportement arbitraire pour entrée illégale, à moins que nous n'ayons des normes assez laxistes en ce qui concerne l'identification. Naturellement, j'ai pris l'interprétation qui met le plus d'octets.
Essayez-le en ligne!
la source
TI-Basic (série 83), 65 octets
Segment A (33 octets):
Segment B:
Segment C (32 octets):
Je suis vraiment excité de trouver ce défi quine! La plupart des quines ne fonctionnent pas dans TI-Basic sans au moins un peu de triche, car il n’ya aucun moyen d’échapper au
"
symbole. (Dans les deux sens du mot "évasion".) Mais ici, nous obtenons une chaîne de saisie via laInput
commande, et taper"
dedans est parfaitement correct.Il reste encore un peu de bêtise de TI-Basic à contourner: une chaîne vide est invalide, donc la solution naïve d'insérer la chaîne
"XXX...XX"
dans une boucle ne fonctionnera pas lorsque n = 0. Au lieu de cela, nous calculons manuellement la valeur de mn + 1 et insérons la chaîne"X"
autant de fois que nécessaire.Les constantes magiques
27
et28
dans le programme sont légèrement des octets compte 33 et 32, parce queStr1
,sub(
etlength(
sont seulement qui contribuent jetons à deux octets 1 à la longueur d'une chaîne.Si nous utilisons des nouvelles lignes au lieu de
:
, il semble que vous pouvez économiser quelques octets en laissant de côté les guillemets, mais cela ne fonctionne pas. Tout d'abord, vous avez besoin d'un éditeur hexadécimal avant de pouvoir ajouter le caractère de nouvelle ligne dans une chaîne: vous ne pouvez pas simplement le saisir, car si vous appuyez sur la touche Entrée pendant uneInput
commande, il soumet l'entrée. Lorsque j'ai essayé l'approche de l'éditeur hexadécimal, j'ai eu une erreur de débordement de mémoire tampon étrange qui a modifié le contenu de mon programme. N'essayez donc pas cela à la maison avec votre calculatrice coûteuse.la source
Java 11,
13565 + 26 = 91 octetsUNE
B
C
Essayez-le en ligne ici (TIO n’ayant pas encore Java 11, il s’agit d’une méthode d'assistance au lieu de
String::repeat()
).Ungolfed:
la source