Votre défi est simple. Écrivez deux programmes qui ne partagent aucun caractère qui se produisent mutuellement.
Exemple
Deux programmes P et Q sont des quines mutuellement exclusives si:
- Sorties P Q
- Q sorties P
- Il n'y a pas de caractère c qui appartient à la fois à P et à Q
- Chaque programme P et Q sont des quines correctes
- Cela compte les quines vides et les quines qui lisent leur propre code source (ou l'autre) comme non valides .
Plus de règles
- La durée combinée la plus courte de ces programmes l'emporte. Autrement dit, la taille ( P ) + la taille ( Q ) est votre score, et le score le plus bas l'emporte.
- Les deux programmes sont dans la même langue
- Chaque programme peut être un programme ou une fonction complète, et il n'est pas nécessaire qu'ils soient identiques.
- Par exemple, P peut être un programme complet et Q peut être une fonction.
Vérification
Cette Essayez en ligne! L'extrait ici peut vérifier si deux programmes s'excluent mutuellement ou non. Les entrées sont placées dans les deux premiers arguments.
code-challenge
quine
Conor O'Brien
la source
la source
Réponses:
> <> , Score: 41 + 41 = 82
Edit: les deux contenaient un 3. Fixe
et
Essayez-le en ligne! (échangez les lignes pour obtenir l'autre sortie) Avec vérification cette fois!
><>
est un langage particulièrement difficile à utiliser ici, car il n'y a qu'une seule façon de produire des caractères, la commandeo
. Heureusement, nous pouvons utiliser la commande p ut pour placer uno
dans le code source pendant l'exécution, comme dans mon réponse Programmation dans un monde vierge.Celui-ci a pris beaucoup d'essais et d'erreurs. J'ai commencé avec les deux programmes mutuellement exclusifs:
et
Chacun se transforme lui-même et ses données par N, le premier soustrait et le second additionne. Il sort ensuite cela en sens inverse. Le fait est que les données après chaque programme sont l'autre programme en sens inverse, décalées de N. (
X
est le numéro de cellule où le programme doit placer leo
et Y est la cellule où le pointeur revient en boucle.?
Est l'endroit oùo
est placé) .Les deux suivent la même structure, représentée de différentes manières. Ils exécutent un littéral de chaîne sur tout le code, l'ajoutant à la pile. Ils recréent la commande littérale de chaîne qu'ils ont utilisée et la placent au bas de la pile. Ils bouclent sur la pile, ajoutant / soustrayant N à chaque caractère et les imprimant.
Le premier programme utilise
'
comme littéral de chaîne et le simpled3*}
pour créer la valeur 39 et la pousser au bas de la pile. Le second utilise"
comme littéral de chaîne avec la même fonction. Ilr
évite la pile,g
ets le caractère à la cellule 0,0 et inverse à nouveau la pile. Il ajoute ensuiteg
la valeur à la cellule 4,0 (g
) et y ajoute 8 pour obteniro
et met cela à X.Les deux programmes utilisent une méthode différente de bouclage. Le premier programme utilise la commande skip (
!
) pour exécuter seulement la moitié des instructions tout en allant à gauche, inverse la direction et exécute l'autre moitié. La seconde utilise la commande jump (.
) pour revenir en arrière au début de la boucle à la cellule Y. Ces deux s'exécutent jusqu'à ce qu'il n'y ait plus d'éléments sur la pile et les erreurs de programme.J'ai rencontré un certain nombre de problèmes avec la plupart des valeurs inférieures de N, car le déplacement d'un caractère le transformerait en un autre caractère essentiel pour ce programme (et ne pourrait donc pas être utilisé comme données pour l'autre programme) ou deux caractères de la deux programmes passeraient au même caractère. Par exemple:
+
+1 =,
=-
-1.
+2 =0
*
=-
-3g
+4 =k
=o
-4etc.
Finalement, je suis arrivé à 10 (
a
), où j'ai pu éviter ces problèmes. Il peut y avoir une version plus courte où les décalages sont inversés et le premier programme ajoute N tandis que le second le soustrait. Cela pourrait être pire, car le premier programme se situe généralement dans la partie inférieure de l'échelle ASCII, il est donc préférable de soustraire pour éviter les conflits.la source
Forth (gforth 64 bits Little Endian) , 428 + 637 = 1065 octets
Essayez-le en ligne!
Script de vérification
Merci à @Nathaniel pour l'idée d'utiliser Forth - il m'a rappelé dans les commentaires que Forth n'est pas sensible à la casse . Puis sont arrivées les sautes d'humeur - j'ai trouvé des raisons pour lesquelles cela ne fonctionnerait pas, suivi par des solutions à ces problèmes, encore et encore. Tout en faisant tourner mon vélo d'entraînement intérieur comme un spinner fidget déformé et déformé (il suffit de saisir une extrémité du guidon et de l'incliner un peu).
Avant d'écrire ces programmes, j'ai rédigé quels caractères peuvent être utilisés par quel programme. Plus précisément, le deuxième programme ne peut utiliser que des lettres majuscules, des chiffres décimaux, des tabulations et des virgules. Cela signifierait que le premier programme est entièrement en minuscules, mais j'ai utilisé des lettres majuscules pour leurs valeurs ASCII.
Étant donné que les onglets sont peu maniables, j'utiliserai plutôt des espaces dans l'explication.
Le premier programme est de la forme
s" code"code
- les"
démarre un littéral de chaîne, qui est ensuite traité par la deuxième copie du code - un cadre de quine standard. Cependant, au lieu de produire son propre code source, il créera l'autre programme, qui ressemble à ceci:HERE
64-bit-number-literal ,
length-of-the-string
115 EMIT 34 EMIT 9 EMIT 2DUP TYPE 34 EMIT TYPE
Cela utilise l'espace de données de Forth.
HERE
renvoie le pointeur à la fin de la zone d'espace de données actuellement allouée et y,
ajoute une cellule remplie d'un nombre. Par conséquent, les trois premières puces peuvent être vues comme un littéral de chaîne créé à l'aide des"
. Pour terminer le deuxième programme:EMIT
renvoie un caractère donné sa valeur ASCII, donc:115 EMIT
imprime un minuscules
34 EMIT
imprime le caractère de citation"
9 EMIT
imprime un onglet2DUP
duplique les deux premiers éléments de la pile( a b -- a b a b )
, ici c'est le pointeur et la longueur de la chaîneTYPE
imprime une chaîne pour sortir la première copie du code34 EMIT
imprime le devis de clôture"
, et enfinTYPE
sort la deuxième copie du codeVoyons comment fonctionne le premier programme. Dans de nombreux cas, les nombres doivent être évités, ce qui se fait en utilisant l'
'x
extension de syntaxe gforth pour les littéraux de caractères, et parfois en soustrayant la valeur ASCII de l'espace, qui peut être obtenue en utilisantbl
:Pour terminer, je voudrais dire que j'ai essayé d'utiliser
EVALUATE
, mais le deuxième programme devient plus grand que les deux présentés ci-dessus. Bref, le voici:Si vous parvenez à jouer au golf assez bas pour déjouer mon
s" ..."...
approche, allez-y et postez-le comme votre propre réponse.la source
Perl,
(311 + 630 = 941 octets)190 + 198 = 388 octetsLes deux programmes impriment sur une sortie standard.
Le premier programme Perl contient principalement des caractères ASCII et des sauts de ligne imprimables, et il se termine exactement par un saut de ligne, mais les deux lettres ÿ représentent l'octet non ASCII \ xFF:
Le second contient principalement des octets non ASCII, y compris plusieurs caractères de contrôle élevé qui sont remplacés par des étoiles dans ce post, et aucune nouvelle ligne du tout:
Un hexdump du premier programme avec
xxd
est:Et un hexdump du deuxième programme est:
Dans le deuxième programme, la chaîne entre guillemets (189 octets de long, délimitée par des tildes) est le premier programme entier à l'exception de la nouvelle ligne finale, uniquement codée par bit complétant chaque octet. Le deuxième programme décode simplement la chaîne en complétant chacun des octets, ce que fait l'
~
opérateur en perl. Le programme imprime la chaîne décodée suivie d'une nouvelle ligne (lesay
méthode ajoute une nouvelle ligne).Dans cette construction, le décodeur du deuxième programme utilise seulement six caractères ASCII différents, donc le premier programme peut être pratiquement arbitraire, tant qu'il ne contient que des caractères ASCII et exclut ces six caractères. Il n'est pas difficile d'écrire un programme Perl sans utiliser ces cinq caractères. La logique de quine réelle est donc dans le premier programme.
Dans le premier programme, la logique quine utilise un dictionnaire de 11 mots
@f
et assemble la sortie de ces mots. Les premiers mots répètent la plupart du code source du premier programme. Les autres mots sont des caractères uniques spécifiques. Par exemple, le mot 5 est un tilde, qui est le délimiteur pour le littéral à deux chaînes dans le deuxième programme. La liste des nombres entre parenthèses est la recette pour quels mots imprimer dans quel ordre. Il s'agit d'une méthode de construction générale assez ordinaire pour les quines, la seule torsion dans ce cas est que les premiers mots du dictionnaire sont imprimés avec leurs octets complétés au niveau du bit.la source
Haskell , 306 + 624 = 930 octets
Programme 1: une fonction anonyme prenant un argument fictif et renvoyant une chaîne.
Essayez-le en ligne!
Programme 2:
q[[40,...]]
à la fin est une fonction anonyme prenant un argument fictif et renvoyant une chaîne.Essayez-le en ligne!
Jeu de caractères 1 (inclut l'espace):
Jeu de caractères 2 (inclut la nouvelle ligne):
Étant donné que seul l'ensemble 1 contient des caractères non ASCII, leurs octets UTF-8 sont également disjoints.
Comment ça marche
Le programme 1 est généralement écrit avec des expressions lambda, des espaces et des parenthèses, une utilisation gratuite des fonctions alphanumériques intégrées et avec les données de quine en tant que littéraux de chaîne à la fin.
a
oub
, qui forment des séquences d'échappement valides qui font le tourshow
.a
,b
etc
sont les seules lettres minuscules dont les codes ASCII sont inférieurs à 100, enregistrant un chiffre dans le codage numérique utilisé par le programme 2.Le programme 2 est généralement écrit avec des équations de fonction de niveau supérieur (à l'exception de la dernière anonyme), des littéraux de caractères et des nombres décimaux, une syntaxe de liste / plage et des opérateurs, et avec les données de quine comme une liste de listes de
Int
s à la fin.Procédure pas à pas, programme 1
b
etc
sont les valeurs des littéraux de chaîne pour le programme 2 et 1, respectivement, données comme arguments finaux à l'expression lambda.()
est un argument factice uniquement pour satisfaire la règle de PPCG selon laquelle le programme doit définir une fonction.foldr(\a->map pred)b(show()>>c)
décode la chaîneb
en code de base du programme 2 en lui appliquantmap pred
un nombre de fois égal à la longueur deshow()>>c == c++c
, ou182
.tail(show c)
convertit la chaînec
en code de base du programme 1, avec un guillemet double final ajouté.:pure b
combine cela dans une liste avec la chaîneb
.map(map fromEnum)$
convertit les chaînes en listes de points de code.`mappend`show(...)
sérialise la liste de listes résultante et l'ajoute finalement au code principal du programme 2.Procédure pas à pas, programme 2
z~z=[[['@','0'..]!!4..]!!z]
est une fonction qui convertit les points de code en caractères (nécessaire pour écrire car tous les caractères netoEnum
sont pas disponibles.)z
. Le marqueur de paresse~
n'a aucun effet dans cette position mais évite un caractère d'espace.['@','0'..]
est une plage de liste de pas en arrière commençant par le code ASCII 64, puis sautant 16 vers le bas à chaque étape.!!4
à cela donne un\NUL
caractère.[ ..]
plage donne une liste de tous les caractères, qui!!z
indexe.z
sur des listes en utilisant=<<
au lieu de l'indisponiblemap
et<$>
.q[x,q]_=z=<<x++q++[34,34]++x
est une fonction construisant le programme 1 à partir de la liste des données de quine.x
est les données pour le noyau du programme 1 (y compris une double citation finale) et l'intérieurq
est les données obscurcies pour le noyau du programme 2._
est un autre argument factice uniquement pour faire de la fonction anonyme finale une fonction au lieu d'une simple chaîne.x++q++[34,34]++x
concatène les pièces, y compris deux guillemets doubles avec le code ASCII 34.z=<<
construit le programme 1 en mappantz
sur la concaténation pour convertir des points de code en caractères.q[[40,...]]
est une fonction anonyme se combinantq
avec les données de quine.la source
Gelée ,
128 90 87 86 85 7916 + 32 = 48 octetsEssayez-le en ligne!
Essayez-le en ligne!
Le premier programme fait ce qui suit:
Cela laisse les chaînes
79,7806,8318,7885,7769,338,115
etỌṘ
les deux arguments de la chaîne et ils sont implicitement concaténés et imprimés à la fin.Le deuxième programme calcule le
chr
(Ọ
) de la liste des nombres qui revientOṾ⁾ọṙŒs
.Ṙ
imprime“OṾ⁾ọṙŒs”
(avec guillemets) et renvoie l'entrée, en laissant“OṾ⁾ọṙŒs”OṾ⁾ọṙŒs
la sortie complète.la source
Gol> <> ,
23 + 23 = 4622 + 22 = 4420 + 20 = 40 octetsEssayez-le en ligne!
Essayez-le en ligne!
Vérifiez-le en ligne!
Comment ils travaillent
Adapté de la réponse> <> de Jo King . Ayant beaucoup plus de commandes alternatives pour la sortie et la répétition, il n'y avait pas besoin de
g
oup
, et les deux corps principaux sont devenus beaucoup plus courts.Une autre différence principale est que je génère la citation de l'adversaire directement en haut de la pile. De cette façon, il était légèrement plus facile de garder l'invariant de
quote + my code + opponent code(reversed and shifted)
.la source