Contexte
Adler-32 est une somme de contrôle 32 bits inventée par Mark Adler en 1995 qui fait partie de la bibliothèque zlib largement utilisée (également développée par Adler). Adler-32 n'est pas aussi fiable qu'un contrôle de redondance cyclique 32 bits , mais - au moins dans le logiciel - il est beaucoup plus rapide et plus facile à mettre en œuvre.
Définition
Soit B = [b 1 , ⋯, b n ] un tableau d'octets.
La somme de contrôle Adler-32 de B est définie comme le résultat de bas + 65536 × haut , où:
bas: = ((1 + b 1 + ⋯ + b n ) mod 65521)
haut: = (((1 + b 1 ) + (1 + b 1 + b 2 ) + ⋯ (1 + b 1 + ⋯ + b n )) mod 65521)
Tâche
Étant donné un tableau d'octets en entrée, calculez et renvoyez sa somme de contrôle Adler-32, en respectant ce qui suit.
Vous pouvez prendre l'entrée comme un tableau d'octets ou d'entiers, ou comme une chaîne.
Dans les deux cas, seuls les octets correspondant aux caractères ASCII imprimables apparaîtront dans l'entrée.
Vous pouvez supposer que la longueur de l'entrée satisfera 0 <longueur ≤ 4096 .
Si vous choisissez d'imprimer la sortie, vous pouvez utiliser n'importe quelle base positive jusqu'à 256 inclus.
Si vous choisissez unaire, assurez-vous que l'interpréteur peut gérer jusqu'à 2 32 - 983056 octets de sortie sur une machine avec 16 Gio de RAM.
Les éléments intégrés qui calculent la somme de contrôle Adler-32 sont interdits.
Les règles de code-golf standard s'appliquent.
Cas de test
String: "Eagles are great!"
Byte array: [69, 97, 103, 108, 101, 115, 32, 97, 114, 101, 32, 103, 114, 101, 97, 116, 33]
Checksum: 918816254
String: "Programming Puzzles & Code Golf"
Byte array: [80, 114, 111, 103, 114, 97, 109, 109, 105, 110, 103, 32, 80, 117, 122, 122, 108, 101, 115, 32, 38, 32, 67, 111, 100, 101, 32, 71, 111, 108, 102]
Checksum: 3133147946
String: "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
Byte array: [126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126]
Checksum: 68095937
String: <1040 question marks>
Byte array: <1040 copies of 63>
Checksum: 2181038080
la source
Réponses:
Gelée,
1917 octetsEssayez-le en ligne!
la source
⁹²¤
Mathematica, 46 octets
Une fonction anonyme qui prend un tableau entier et renvoie l'Adler-32, avec quelques améliorations de miles et Martin (voir commentaires).
miles 'est également de 46 octets , mais plus rapide:
la source
Julia,
7346 octetsIl s'agit d'une fonction anonyme qui accepte un tableau et renvoie un entier. Pour l'appeler, assignez-le à une variable.
Nous combinons
sum(x) + 1
etsum(cumsum(x) + 1)
dans un tableau, oùx
est le tableau d'entrée, et prenons chaque module 65521. Nous calculons ensuite le produit scalaire avec 1 et 4 8 , ce qui nous donne(sum(x) + 1) + 4^8 * sum(cumsum(x) + 1)
, qui est exactement la formule Adler-32.Essayez-le en ligne! (Comprend tous les cas de test)
Enregistré 27 octets grâce à Sp3000 et Dennis!
la source
Fonction de code machine x86-64:
3332 octets (ou3130 octets avec uneint[]
entrée au lieu dechar[]
)Fonction de code machine x86-32: 31 octets
En tant que fragment de code asm en ligne GNU C: enregistre
2B1B (juste l'ret
insn).Source commentée et pilote de test sur github
La version 64 bits peut être appelée directement à partir de C avec le System V x86-64 ABI standard (en utilisant 2 arguments factices pour obtenir des arguments dans les paramètres que je veux). Les conventions d'appel personnalisées ne sont pas rares pour le code asm, c'est donc une fonctionnalité bonus.
Le code machine 32 bits enregistre 1B, car la fusion des moitiés haute et basse
push16/push16 => pop32
ne fonctionne qu'en mode 32 bits. Une fonction 32 bits aurait besoin d'une convention d'appel personnalisée. Nous ne devrions pas lui en vouloir, mais appeler à partir de C nécessite une fonction wrapper.Après le traitement de 4096
~
(ASCII 126) octets,high = 0x3f040000, low = 0x7e001
. Donc ,high
n'est pas encore défini de » bit le plus significatif. Mon code en profite, se prolongeanteax
dansedx:eax
aveccdq
comme moyen de mise à zéroedx
.0x40 - 0x20
= 32 octets.Source NASM commentée:
des trucs:
xchg eax, r32
est un octet; moins cher que mov. 8086 avait besoin de données dans ax pour beaucoup plus de choses que> = 386, alors ils ont décidé de dépenser beaucoup d'espace opcode sur le désormais rarement utiliséxchg ax, r16
.Le mélange de push64 et push16 pour fusionner haut et bas dans un seul registre enregistre les instructions de mouvement des données reg-reg autour de deux
div
s. La version 32 bits de cette astuce fonctionne encore mieux:push16 / push16 / pop32
n'est que de 5 milliards au total, pas de 6.Puisque nous poussons / pop, ce n'est pas sûr pour asm en ligne dans le SysV amd64 ABI (avec une zone rouge) .
J'ai également envisagé d'utiliser
rcx
comme index de tableau, au lieu d'avoir deux compteurs de boucle, mais adler32 (s)! = Adler32 (reverse (s)). Nous ne pouvions donc pas utiliserloop
. Compter de -len vers zéro et utilisermovzx r32, [rsi+rcx]
utilise simplement trop d'octets.Si nous voulons envisager d'incrémenter le pointeur nous-mêmes, le code 32 bits est probablement le chemin à parcourir. Même l'ABI x32 (pointeurs 32 bits) n'est pas suffisant, car il
inc esi
s'agit de 2B sur amd64, mais de 1B sur i386. Il semble difficile de battrexor eax,eax
/lodsb
/loop
: 4B au total pour que chaque élément à son tour soit étendu à zéro en eax.inc esi
/movzx r32, byte [esi]
/loop
est 5B.scas
est une autre option pour incrémenter un pointeur avec une instruction 1B en mode 64 bits. (rdi
/edi
au lieu dersi
, nous prenons donc l'argument du pointeurrdi
).scas
Cependant, nous ne pouvons pas utiliser le résultat de l'indicateur comme une condition de boucle, car nous ne voulons pas conserver la mise à zéro de l'eax. Une allocation de registre différente pourrait peut-être enregistrer un octet après la boucle.int[]
contributionLa prise de fonction complète
uint8_t[]
est la réponse «principale», car c'est un défi plus intéressant. Décompresserint[]
est une chose déraisonnable de demander à notre appelant de le faire dans cette langue, mais cela économise 2B.Si nous prenons notre entrée comme un tableau décompressé d'entiers 32 bits, nous pouvons enregistrer facilement un octet (utiliser
lodsd
et remplacerxor eax,eax / cdq
par justexor edx,edx
).Nous pouvons enregistrer un autre octet en mettant à zéro edx avec
lodsd
/cdq
et en réorganisant la boucle afin qu'elle charge l'élément de terminaison 0 avant de quitter. (Nous supposons toujours qu'il existe, même s'il s'agit d'un tableau deint
, pas d'une chaîne).J'ai également fait une version non testée qui utilise
scasd
(version 1B deadd edi,4
) etadd eax, [rdi]
au lieu delodsd
, mais c'est aussi 30 octets. Les économieshigh
résultant de la présence d'EAX à la fin de la boucle sont compensées par un code plus large ailleurs. Il a l'avantage de ne pas dépendre d'un0
élément de terminaison dans l'entrée, ce qui est peut-être déraisonnable pour un tableau décompressé où la longueur nous est également donnée explicitement.Pilote de test C ++ 11
Voir le lien github. Cette réponse devenait trop importante, et le pilote de test a obtenu plus de fonctionnalités avec un code plus gros.
la source
int[]
si cela était nécessaire, ou si vous avez enregistré plus de 4 octets de code ou quelque chose. Je n'ai aucun problème à présenter une solution auadler32(int[])
problème, mais je pense que leadler32(char[])
problème est plus intéressant, car c'est la vraie fonction adler32. C'est ce que je veux vraiment jouer au golf en asm. (Et j'aimerais beaucoup économiser un octet de plus, car dans la vraie vie, 33 octets = 48 octets si la fonction suivante utiliseALIGN 16
). Je suppose que je continuerai à jouer au golf à la fois.do{}while(--len)
style de boucle au lieu d'unwhile(len--){}
.MATL , 22 octets
L'entrée peut être un tableau de nombres ou la chaîne ASCII correspondante.
Essayez-le en ligne!
Explication
la source
En fait, 36 octets
Essayez-le en ligne!
Explication:
la source
Java, 84 octets
Si les solutions Java sont toujours censées être du code compilable complet, faites-le moi savoir.
Ungolfed
Remarque
Vous devrez convertir l'entrée
String
enint[]
(int[]
est un octet plus court quebyte[]
ouchar[]
).Sortie
la source
Piet, 120 Codels
Avec codelsize 20:
Notes / Comment ça marche?
Puisqu'il n'est pas possible d'utiliser un tableau ou une chaîne en entrée, ce programme fonctionne en prenant une série d'entiers (représentant des caractères ascii) en entrée. J'ai pensé à utiliser des entrées de caractères au début, mais j'ai eu du mal à trouver une bonne solution pour la terminaison, alors maintenant il se termine quand un nombre inférieur à 1 est entré. Ce n'était à l'origine que des valeurs négatives pour la terminaison, mais j'ai dû changer l'initialisation après avoir écrit le programme, donc maintenant je ne peux pas ajuster la valeur requise
2
, seulement un1
(26/45 sur l'image de trace). Cela n'a pas d'importance, car selon les règles du défi, seuls les caractères ascii imprimables sont autorisés.J'ai longtemps lutté pour rentrer dans la boucle, même si j'ai finalement trouvé la solution la plus élégante. Non
pointer
ouswitch
opérations, seul l'interprète se heurte aux murs jusqu'à ce qu'il revienne dans le codel vert pour lire l'entrée (43-> 44 sur les images de trace).La terminaison de boucle est obtenue en dupliquant d'abord l'entrée, en ajoutant 1 puis en vérifiant si elle est supérieure à 1. Si c'est le cas, le sélecteur de codel est déclenché et l'exécution se poursuit sur le chemin inférieur. Si ce n'est pas le cas, le programme continue à gauche (codels jaune vif, 31/50 sur les images traces).
La taille d'entrée prise en charge dépend de la mise en œuvre de l'interpréteur, bien qu'il soit possible de prendre en charge une entrée arbitrairement grande avec le bon interprète (par exemple, un interpréteur Java qui utilise
BigInteger
comme valeurs internes)Je viens de voir que la configuration comprend un inutile
DUP
etCC
(7-> 8-> 9 dans les images de trace). Je ne sais pas comment cela s'est produit. C'est effectivement un noop cependant, il bascule le sélecteur de codel 16 fois, ce qui n'entraîne aucun changement.Images de trace Npiet
Configuration et première boucle:
Terminaison, sortie et sortie de boucle:
Les sorties
Pardonnez-moi si je n'inclus qu'une seule sortie, cela prend juste beaucoup de temps pour entrer: ^)
Trace Npiet pour [65, -1]
la source
C89, 70 octets
Pour tester (compiler avec
gcc -std=c89 -lm golf.c
):la source
zlib
ressemble la source? Hm ...for
au lieu dewhile
:for(h=0,l=1;*B;)h+=l+=*B++;
Labyrinthe ,
37363231 octetsEssayez-le en ligne!
Entrée sous forme de liste d'entiers. Le programme se termine avec une erreur (dont le message d'erreur va à STDERR).
Explication
Primaire labyrinthe:
_
.Bien que le code commence par une "pièce" 4x2, il s'agit en fait de deux boucles deux par deux séparées serrées ensemble. Il se trouve que l'IP se limite à une boucle à la fois en raison des valeurs de la pile.
Le code commence donc par une boucle 2x2 (dans le sens des aiguilles d'une montre) qui lit l'entrée lors du calcul des sommes de préfixe:
Maintenant, nous avons toutes les sommes de préfixe sur la pile aux , ainsi qu'une copie de la somme sur toutes les valeurs et de l'
0
EOF sur la main . Avec cela, nous entrons dans une autre boucle 2x2 (dans le sens des aiguilles d'une montre) qui additionne toutes les sommes de préfixe à calculerHIGH
.La pile principale a maintenant
LOW - 1
etHIGH
et zéro, sauf que nous n'avons pas encore pris le modulo. Le reste du code est complètement linéaire:L'IP atteint désormais une impasse et se retourne. Le
+
et*
sont essentiellement sans opération, en raison des zéros au bas de la pile. Le36
transforme maintenant le haut du principal en63
, mais les deux{{
tirent deux zéros de aux sur le dessus.%
Essaie ensuite de diviser par zéro, ce qui met fin au programme.Notez que Labyrinth utilise des entiers de précision arbitraire, donc le report du modulo jusqu'à la fin de la somme ne causera pas de problèmes de dépassement d'entier.
la source
Python 2,
6058 octetsUne approche assez simple. Il s'agit d'un programme complet qui prend une liste d'entiers via STDIN, par exemple
[72, 105, 33]
.(Merci à @xnor pour l'incroyable astuce d'aliasing / initialisation)
la source
H=h=65521
pour initialiserh
en créant un alias 65521.J, 30 octets
Cela pourrait probablement être condensé davantage avec un train différent.
Usage
Ici
x $ y
crée une liste avec desx
copies dey
.Explication
la source
Octave,
5250 octetsSauvegardé 2 octets grâce à @LuisMendo
Prend un tableau d'entiers en entrée.
bas est tiré du dernier élément de haut (avant sommation) plutôt que de calculer la somme explicitement, économisant un grand total de ... 1 octet !
Exemple de run sur ideone .
la source
+B
. Je suppose que la spécification d'entrée indique que vous pouvez prendre des entiers, alors je vais peut-être le faire.CJam,
3029 octetsEntrée sous forme de liste d'entiers.
Testez-le ici.
Explication
la source
Perl 6 , 60 octets
Explication:
Tester:
la source
Python 3 (79 octets)
Basé sur la solution de R. Kap.
J'ai remplacé la multiplication par un décalage et retiré une paire de supports.
Parce que je ne peux pas poster de commentaires, j'ai fait une nouvelle réponse.
la source
Schéma, 195 octets
S'il n'y avait pas toutes ces parenthèses ...
la source
Haskell,
5450 octetsExemple d'utilisation:
g [69,97,103,108,101,115,32,97,114,101,32,103,114,101,97,116,33]
->918816254
.scanl
inclut la valeur de départ (->1
) dans la liste (->[1,1+b1,1+b1+b2,..]
), donc lesum
est désactivé par1
, qui est fixé en ajoutant-1
à la liste avant la sommation.Edit: Merci @xnor pour 4 octets.
la source
m
:m=(`mod`65521).sum g x=m(-1:scanl(+)1x)*4^8+m(1:x)
. Il y a probablement une meilleure façon de fixer les sommes que de payer par anticipation.JavaScript (ES7),
5250 octetsES6 prend 51 octets (remplacez 4 ** 8 par 65536). Si vous voulez une version chaîne, alors pour 69 octets:
Edit: sauvé 2 octets grâce à @ user81655.
la source
Fonction ARM Thumb-2 acceptant
uint8_t[]
: 40 octets (36B pour ABI non standard etint[]
)Caractéristiques: modulo non différé, donc les entrées de taille arbitraire conviennent. N'utilise pas réellement l'instruction de division, donc ce n'est pas lent. (euh, du moins pas pour cette raison: P)
Économies grâce aux règles moins strictes suivantes:
uint32_t[]
tableau.Donc, le meilleur cas est 36B.
0x28 = 40 octets
Remarques:
Au lieu de
log%m
la fin, nous faisonsif(low>=m) low-=m
à l'intérieur de la boucle. Si nous faisons bas avant haut, nous savons que ni l'un ni l'autre ne peut dépasser2*m
, donc le modulo est juste une question de soustraction ou non. Acmp
etsub
prédéfini n'est que 6B en mode Thumb2. L'idiome standard pour%
est 8B en mode Thumb2:La
adler(char *)
version de longueur implicite a la même taille de code que la longueur expliciteadler(uint8_t[], uint32_t len)
. Nous pouvons définir des indicateurs pour la condition de sortie de boucle avec une seule instruction 2B dans les deux cas.La version de longueur implicite a l'avantage de fonctionner correctement avec la chaîne vide, au lieu d'essayer de boucler 2 ^ 32 fois.
assembler / compiler avec:
ou
Sans
-static
, le processus exécuté sousqemu-arm
n'a pas trouvé son éditeur de liens dynamique. (Et oui, j'installe un ARM configuration inter-devel juste pour cette réponse, parce que je pensais que mon idée était fondée-Soustraire propre.) Sur amd64 Ubuntu, installergcc-arm-linux-gnueabi
,g++-arm-linux-gnueabi
. J'ai trouvé unegdb-arm-none-eabi
sorte de connexion à peine travailléeqemu-arm -g port
.Source commentée:
test-adler32.cpp
a les mêmes cas de test etmain()
que pour ma réponse x86-64, mais commence de cette façon:la source
Fonction de code machine x86 16 bits: 32 octets à l'aide d'une convention d'appel personnalisée
Args dans les registres et ne préservant pas les regs autres que bp (et sp).
En code 16 bits, nous renvoyons une valeur 32 bits dans la
dx:ax
paire de registres. Cela signifie que nous ne doivent pas passer des instructions de fusionhigh
etlow
eneax
. (Cela permettrait également d'économiser des octets en code 32 et 64 bits, mais nous ne pouvons justifier le déchargement de ce travail vers l'appelant qu'en code 16 bits.)Source commentée et pilote de test sur github (pour x86 16, 32 et 64 bits et ARM).
0x120 - 0x100 = 32 octets
Testé en assemblant le même code pour le mode 32 bits, donc je peux l'appeler (avec une fonction wrapper) à partir de C compilé avec
-m32
. Pour moi, le mode 16 bits est quelque peu intéressant, les appels système DOS ne le sont pas. Toutes les instructions ont des opérandes explicites, saufloop
etlodsb
, donc l'assemblage pour le mode 32 bits utilise des préfixes de taille d'opérande. Même instruction, encodage différent. Maislodsb
en mode 32 bits, il sera utilisé[esi]
, donc cette version de test fonctionne avec des pointeurs 32 bits (car nous ne faisons pas de calcul d'adresse ou d'incrémentation / comparaison de pointeur).Aucun décalage. Mon harnais de test imprime un message en cas de non-concordance.
Avec les registres 16 bits, nous ne pouvons reporter la réduction du module qu'après la boucle. Il y a une différence intéressante entre 16 bits et les autres tailles d'opérande:
m = 65521
(0xFFF1
) est plus de la moitié de 65536. La soustractionm
au report conserve la valeur en dessous de 2 * m, même sihigh=0xFFF0 + 0xFFF0
. Après la boucle, une comparaison et une soustraction feront l'affaire, au lieu de adiv
.J'ai trouvé une nouvelle technique pour réduire un registre modulo après un ajout qui peut produire un report . Au lieu de mettre à zéro la moitié supérieure de l'entrée pour
div
, utilisezsetc dl
pour créer un dividende de 32 bits contenant le résultat de l'addition non tronqué (dh
est déjà mis à zéro). (div
32b / 16b => division 16 bits.)setcc
(3 octets) a été introduit avec 386. Pour exécuter ceci sur 286 ou plus tôt, le meilleur que j'ai trouvé utilise l' instruction non documentéesalc
(set AL from carry) . C'est un opcode à un octet poursbb al,al
, donc nous pourrions utilisersalc
/neg al
avant de faire lexchg ax, dx
(dont nous avons besoin de toute façon). Sanssalc
, il y a une séquence 4B:sbb dx,dx
/neg dx
. Nous ne pouvons pas utiliser 3Bsbb dx,dx
/inc dx
, car cela émuleraitsetnc
plutôt quesetc
.J'ai essayé d' utiliser une taille d'opérande de 32 bits au lieu de gérer le report, mais ce ne sont pas seulement les
add
instructions qui nécessitent un préfixe de taille d'opérande. Les instructions de configuration des constantes et ainsi de suite ont également besoin de préfixes de taille d'opérande, donc ce n'est pas le plus petit.la source
Pyth,
252423 octets1 octet grâce à @Jakube .
1 octet de plus grâce à @Jakube .
Essayez-le en ligne!
Traduction de ma réponse en gelée .
la source
Perl 5, 43 octets
42 octets, plus 1 pour
-aE
au lieu de-e
L'entrée est sous forme d'entiers décimaux, séparés par des espaces.
Un petit coup de chapeau à Sp3000 , de qui j'ai pris des idées pour cette réponse.
Comment ça marche:
-a
,$.
commence à 1 et@F
est le tableau d'entrée.$h
commence à 0.$_
est utilisé parmap
comme espace réservé pour chaque élément d'un tableau.map$h+=$.+=$_,@F
signifie que pour chaque élément,@F
nous ajoutons cet élément à$.
puis ajoutons$.
à$h
.$.%65521+$h%65521*4**8
(c'est-à-dire($. % 65521) + ( ($h % 65521) * (4**8) )
etsay
(imprimons) le résultat.la source
Facteur,
112109103 octetsMaintenant , c'est une traduction littérale de l'algorithme dans la question ... maintenant que je l'ai fait, vous savez, correct.
Ungolfed:
Attend n'importe quelle séquence de nombres ou une chaîne (pas beaucoup de différence, bien qu'ils ne soient pas techniquement les mêmes).
Je ne sais pas comment cela fonctionnera pour la limite donnée sur une version de Factor compilée avec une taille de mot de 32 bits, mais sur ma machine 6 Go 64 bits 2,2 GHz:
la source
Rubis, 91 octets
la source
Clojure, 109 octets
Basé sur la solution de @Mark Adler .
Ungolfed
Usage
la source
Javascript (130 personnages joués)
Ungolfed
Golfé
Collez dans Developers Console, puis donnez-lui un tableau d'octets EG:
Et il retournera la somme de contrôle à la console
la source
TMP, 55 octets
3a1.3b0.1;4+a>T8%a>xFFF14+b>a8%b>xFFF11~5<b>164|b>a2$b$
L'implémentation dans Lua peut être trouvée ici: http://preview.ccode.gq/projects/TMP.lua
la source
Python 3.5, 82 octets:
( -1 octet grâce à Neil ! )
( -1 octet grâce à mathmandan ! )
( -4 octets grâce à Dennis ! )
Une
lambda
fonction anonyme . Accepte un tableau d'octets, applique l'intégralité de l'algorithme au tableau et génère le résultat. A travaillé avec succès pour tous les cas de test. Vous appelez cela en lui affectant une variable, puis en appelant cette variable comme vous appelleriez une fonction normale. Si vous utilisez le shell, cela devrait sortir sans fonction d'impression. Cependant, si vous ne l'êtes pas, vous devez encapsuler l'appel de fonction dans laprint()
fonction pour voir réellement la sortie.Essayez-le en ligne! (Idéone)
la source
(E+15)
est en fait un octet plus long que65536
.4**8
est un octet plus court que65536
.Fission , 324 octets
Juste avertissement, la seule implémentation sur laquelle j'ai testé ceci est mon propre portage du langage vers F #. Ce n'est pas du golf, principalement parce que j'ai trouvé plus facile de faire de longues courses pendant que ma constante principale refroidissait le long du fond, donc je peux revenir et la peaufiner.
Comment ça marche?
R'~++Y++~'L
bloc fusionne une constante 256 et le lance vers le bas, en plaçant le multiplicateur de masse du réacteur directement en dessous.R'~++A++~'A
bloc en fusionne 256 autres et le lance vers le réacteur au-dessus, qui fissionne la particule en deux multiples de masse de65536
masse masse chacun, les lançant à gauche et à droite (où la particule droite est immédiatement détruite par le terminateur).65521
(notre grand nombre premier).Z
) à la fin de l'analyse fait en sorte que la particule duplique l'amorce, en renvoyant une vers la droite où elle définit finalement la masse stockée du réacteur à fission (^
). C'est ainsi que nous appliquerons l'opérateur de module au bloc H.<
) que nous utiliserons pour le bloc L.|S
"tour de refroidissement".\Y/
fusionne le bloc L (qui entre par le canal gauche) et le bloc H (qui arrive par le canal droit), puis les claque dans un terminateur qui définit le code de sortie sur la masse fusionnée.la source
*
, c'est ainsi que je renvoie la sortie. Je vais voir si je peux trouver un autre interprète pour vérifier la sortie demain.