Les automates cellulaires sont vraiment fascinants. Ceux dont on parle habituellement sont les binaires, c'est-à-dire ceux représentables par un nombre. Cependant, ceux-ci, à mon avis, ont été tués à mort. Les AC ternaires sont plus intéressants, mais nous avons tous à considérer ASCII! Quel plaisir cela pourrait-il être!
Au lieu de décider d'un ensemble de règles pour chaque personnage, j'utiliserai une règle de décision simple dont je parlerai bientôt. Pour décider de la prochaine génération, nous examinons les trois cellules "supérieures", un peu comme les automates cellulaires. Observez un exemple:
QWERTY
X Y Z
Le "haut" de Y
est WER
, étant les cellules au-dessus et à droite, au-dessus et au-dessus et à gauche. Y sera le résultat de la fonction que je m'apprête à définir, qui est une fonction sur des chaînes de trois caractères. Le "haut" de X
est QW
, ou un espace remplissant la cellule inexistante / manquante .
Maintenant, pour la fonction amusante ! J'appelle cette séquence la séquence XOROR pour une raison. Soit A
le code de cellule en haut à gauche, B
le code de cellule ci-dessus et le code de cellule en C
haut à droite. Ensuite, la cellule résultante est le caractère dont le code de caractère est (A XOR B) OR C
, c'est-à-dire (A^B)|C
. (Si une valeur résultante est supérieure à 126, elle est alors définie sur (CHARCODE % 127) + 32
. Rien n'est fait si une valeur est inférieure à 32.) Voici un exemple de la graine Hello, World!
:
S: Hello, World!
0: mmmo/c_ z}~)e
m = ( )^(H)|(e) = (32^72)|101 = 104|101 = 109 (m)
m = (H)^(e)|(l) = (72^101)|108 = 45|108 = 109 (m)
etc.
1: mmo/c_< +wl
2: mo/c_<c< + |;
3: o/c_<c ?+ g
4: oc_<c c??4+gg
5: 0_<c c 4+ o
6: _<c ccc4??ooo
7: c ccc4 ?o o
8: ccccc4w? pooo
9: cccc4w h o
A: ccc4wc hh ooo
B: cc4wc4kh ooo
C: c4wc4 #ooo o
D: wwc4w4#ooo oo
E: wc4wwc oo oo
F: w4wwc4oo oo o
G: wwwc4 oo oo
H: wwc4w4 oo oo
I: w4wwc4oooo oo
J: wwwc4 oo oo
K: wwc4w4oo oo o
L: wc4wwo oo oo
M: w4wwo8ooo oo
N: wwwo8 o oo o
O: wwo8w8oooo oo
Et nous pouvons continuer un peu plus tard. Cette modification de la chaîne est appelée séquence XOROR.
Objectif Vous devez écrire un programme ou une fonction qui effectue l'une des tâches suivantes:
- Étant donné une chaîne
s
et un nombren >= 0
,n
sortez la e chaîne sur la séquence XOROR avec seeds
, avecn = 0
comme première transformation de la chaîne. - Étant donné une chaîne
s
, produire (pour les programmes) ou générer (pour les fonctions / générateurs) un flux infini de la séquence XOROR avec seeds
. Vous pouvez choisir d'arrêter si la séquence se répète, mais ce n'est pas nécessaire.
s
sera toujours uniquement composé de caractères ASCII imprimables, de l'espace aux onglets tilde plus (pas de nouvelle ligne.)
Il s'agit d'un code-golf , donc le programme le plus court en octets l'emporte.
la source
o
s font ressembler à une ruée vers les zergs .127%127+32==32
.n=0
la chaîne d'origine n'est-elle pas?(d^!)|(space)
. Quant à votre deuxième question, vous effectuez(CHAR%127)+32
après l'exécution du XOROR.Réponses:
MATL ,
3331 octetsCela fonctionne dans la version 13.1.0 du langage / compilateur, qui est antérieure au défi.
La première entrée est le nombre, la seconde est la chaîne.
Essayez-le en ligne!
la source
Mathematica, 133 octets
Ce serait bien de faire fonctionner une
CellularAutomaton[]
solution, mais je suis resté court. N'importe qui?Edit: quelques jolies photos (cliquez pour agrandir)
plotCA["Hello, World!", 60]
:plotCA[bXORnotb, 100]
:plotCA[raven, 100]
:la source
CellularAutomaton
votre fonction de mise à jour? (Le numéro de règle réel avec 127 états valides serait fou.)Java,
193185 octetsParce que Java.
-8 octets en passant en boucle plutôt qu'en récursif pour en faire une fonction anonyme
Renvoie la nième itération de XOROR sur s.
Version lisible:
Presque une implémentation littérale de la spécification, avec une boucle récursive pour appliquer l'opération n fois. Certains octets ont été enregistrés, cependant, avec mon observation que la clause CHARCODE> 126 ne se produira jamais qu'avec CHARCODE == 127, ce qui entraîne une sauvegarde
SPACE
au lieu deDEL
.J'ai exécuté mon code sur quelques chaînes choisies arbitrairement et j'ai trouvé ce merveilleux cycle:
la source
ok
!CJam, 38 octets
Testez-le ici.
Explication
la source
lri){2S*\*3ew{)\:^|}%127c' er}*
car l'opération de pré-modulo de caractères ne dépasse jamais 127Haskell, 123 octets
Cela renvoie un flux infini de la séquence XOROR. Exemple d'utilisation (imprimez les 5 premiers éléments de la graine
"Hello, World!"
):Comment ça marche:
la source
PHP, 186 octets (avec n) | 177 octets (infini)
Il s'est avéré que l'impression infinie est plus courte ...
Non golfé avec n:
Infini non golfé:
la source
function i($s){for(;;$i=0,print$s=$r)for($r='';$i<strlen($s);$r.=chr($t>126?32:$t))$t=((ord($s[$i-1])?:32)^ord($s[$i]))|(ord($s[++$i])?:32);}
est de 141 octets de long (-36 octets).C ++
Nième séquence (212)
Non-golfé
Nième séquence utilisant la syntaxe du pointeur au lieu de la syntaxe du tableau pour rendre cela encore plus déroutant: (231)
Non-golfé
Fonction de débogage (pour le plaisir)
la source
JAVA 240/280 octets
La version Java populaire au moment où j'ai écrit cela prétendait être de 185 octets, mais il y a deux points de fudge importants. Premièrement, la mesure est vraisemblablement uniquement pour la fonction, pas pour la source de travail complète. Peut-être pas un tel problème. Deuxièmement, il utilise BiFunction sans importation ni nom complet. L'ajout des bits requis pour l'exécuter tel quel (puis le minimiser, équitablement) l'a porté à 348 octets. L'ajout uniquement du nom complet de la classe BiFunction l'amène à 248 octets.
En revanche, je crois que le mien est de 240 octets lorsque vous jouez selon les mêmes règles (pas de classe, pas de sortie réelle, juste la viande). La classe exécutable complète est de 280 octets, et ressemble à ceci (non minimisé):
Ou, minifié:
la source
Perl, 47 octets
Comprend +2 pour
-lp
Exécuter avec l'entrée sur STDIN, par exemple
perl -lp xoror.pl <<< "Hello, World!" | head -26
xoror.pl
:Cela fonctionne tel quel, mais remplacez le
\x7f
par la valeur binaire correspondante pour obtenir le score donnéla source
Swift: 273 personnages
Wow, Swift est pire que Java! (Toutes ces API avec des noms longs!: P)
Non golfé:
Merci à @ CAD97 avoir mentionné que (A ^ B) | C ne peut être supérieur à 126 que lorsqu'il est 127.
J'ai également réalisé que vous n'avez pas besoin de parenthèses autour de A ^ B | C car XORing est fait avant ORing, ce qui m'a fait économiser quelques octets.
la source