Soustraction d'église
Le calcul lambda a toujours été une fascination pour moi et les comportements émergents de passage de fonctions les uns dans les autres sont délicieusement complexes. Les chiffres d'église sont des représentations de nombres naturels obtenus à partir de l'application répétée d'une fonction (normalement l'addition unaire d'une constante). Par exemple, le nombre zéro renvoie x et "ignore" la fonction d'entrée, un est f(x)
, deux est f(f(x))
et ainsi de suite:
ident = lambda x: x
zero = lambda f: ident
succ = lambda n: lambda f: lambda x: f(n(f)(x))
one = succ(zero)
add1 = lambda x: x + 1
to_int = lambda f: f(add1)(0)
print(to_int(one))
>>> 1
De cela, nous pouvons facilement voir que l'addition est accomplie en appliquant la première fonction à x puis en appliquant la deuxième fonction à x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
L'addition est relativement facile à comprendre. Cependant, pour un nouveau venu, il pourrait être inconcevable de penser à quoi ressemble la soustraction dans un système numérique codé par l'Église. Qu'est-ce que cela pourrait signifier de ne pas appliquer une fonction?
Défi
Implémentez la fonction de soustraction dans un système numérique encodé par Church. Où la soustraction effectue l' opération monus et désapplique une fonction n
fois si le résultat sera supérieur à zéro ou zéro sinon. C'est le code-golf donc le code le plus court gagne.
Contribution
Deux chiffres d'église qui ont été encodés dans votre choix de langue. L'entrée peut être positionnelle ou curry. Pour prouver ces éléments sont vrais chiffres de l' Église , ils doivent prendre en toute fonction et les appliquer à plusieurs reprises ( add1
est donné dans les exemples , mais il pourrait être add25
, mult7
ou toute autre fonction unaire.)
Production
Un chiffre d'église. Il convient de noter que si m < n
alors m - n
est toujours la même que la fonction d'identité.
Exemples:
minus(two)(one) = one
minus(one)(two) = zero
...
également acceptable:
minus(two, one) = one
minus(one, two) = zero
Crédit:
Ce github est essentiel pour m'avoir donné une implémentation en python des chiffres de l'église.
la source
exp(m, n)
calculem^n
bien sûr.)lambda m,n,f:apply f m-n times
(ou mêmelambda m,n,f,x:apply f m-n times to x
) au lieu delambda m,n:lambda f:...
? Ou cela s'applique-t-il uniquement aux deux entréesm
etn
?m
etn
dans l'autre ordre? Cela aiderait au curry.Réponses:
Haskell , 35 octets
Essayez-le en ligne!
Dites cela
r
et ces
sont les encodages d'église dem
etn
. Nous voulonsr%s
appliquer desf
m-n
temps à une valeur initialex
. Nous générons d'abord la liste infiniepuis utilisez
s(x:)
pour ajouter desn
copies dex
, c'est-à-dire déplacer chaquen
indice de valeur vers la droite:Nous calculons ensuite
m
directement en tant quer(+1)0
, et prenons lem
'e élément de cette liste comme!!r(+1)0
. Une solution sans indexation pourrait le fairehead$r tail$...
, c'est-à-dire supprimer les premiersm
temps d' élément et ensuite prendre le premier élément, mais la syntaxe d'indexation est beaucoup plus courte.Notez que la solution classique ne fonctionne pas dans Haskell sans extensions car son typage fort ne peut pas représenter l'opération précédente.
la source
Python 2 ,
8280 octetsEssayez-le en ligne!
Merci à Nick Kennedy de noter une paire de parens inutiles.
Fonction anonyme qui implémente moins.
Généralement, cela ne fait que compresser la définition trouvée sur la page Wikipedia; pas comme si je comprenais vraiment encore le code. Mais intéressant!
la source
!u:!v:v(!n:!f:!x:n(!g:!h:h(g(f)))(!y:x)(!x:x))(u)
semble économiser 2 octets, mais je ne comprends pas vraiment le code!Python 2 , 77 octets
Essayez-le en ligne!
Nous décrémentons l'Église en suivant la valeur précédente pour chaque itération et en la sortant à la fin. 39% de la longueur du code est
"lambda"
...la source
C ++ (clang) , 112 octets
Essayez-le en ligne!
C'est de loin le code C ++ le plus incompréhensible que j'aie jamais écrit. Cela dit, je pense que le non-golf de ce code ne fera qu'empirer les choses.
la source
Sous-charge , 37 octets
Essayez-le en ligne!
L'intérieur
(((!())~):*^(~!:(:)~*(*)*)~^^!)
est lapred
fonction, implémentée via des paires:la source
R , 86 octets
Essayez-le en ligne!
Port R de la réponse Python de @ ChasBrown, alors assurez-vous de voter aussi.
la source
JavaScript (Node.js) ,
8785817674 octetsEssayez-le en ligne! Je ne gagnerai aucun prix, mais j'ai pensé que j'essaierais une approche différente.
a=>[h,a]
est une étape qui s'appliqueh
, tandis quea=>[x=>x,a]
est une étape qui ne s'applique pash
. Nous appliquons les premiersf
temps de fonction et les secondsg
temps de fonction . Nous appliquons ensuite les([f,[g,a]])=>[g(x),a]
f
temps de fonction inverses . Cela saute lesg
deuxièmes étapes et exécute lesf-g
premières étapes comme souhaité. Il reste alors à extraire la valeur finale.Les tuples peuvent bien sûr être convertis en fonctions lambda, ce qui donne l'expression suivante:
la source
J , 56 octets
Essayez-le en ligne!
Remarque: -3 octets sur le compte TIO pour
m=.
Les fonctions d'ordre supérieur dans J sont obtenues à l'aide d'adverbes et de conjonctions. Ici, un chiffre d'église est la forme gérondive de l'adverbe formé en combinant la conjonction «puissance de» (qui applique à plusieurs reprises un verbe) et un entier. Le verbe suivant
c
(pour "créer") utilise la représentation atomique de J pour transformer un entier en un tel gérondif:Notre opérateur «moins» (qui est une conjonction) soustrait le chiffre de l'église gérondine droite de la gauche. Il ne suppose cependant aucune implémentation particulière des chiffres de l'église, y compris celle de notre
c
verbe. Au lieu de cela, il s'appuie sur la définition générale et transforme chaque chiffre d'église gerond en un adverbe en l'inversant avec5!:0
, puis en appliquant cet adverbe au verbe d'incrémentation>:
, puis en appliquant cela à 0.Il soustrait ensuite et prend le maximum avec 0, et s'applique
c
pour obtenir le résultat final: un nouveau chiffre d'église gérondif.la source
Wolfram Language (Mathematica) ,
55484739 octets (33 caractères)Essayez-le en ligne!
Le symbole est 0xF4A1, un point de code Mathematica spécial qui désigne une flèche vers la droite pour
\[Function]
. Voir ici pour plus d'explications. Voici à quoi ressemble le code dans le frontal de Mathematica:Nous pouvons le faire en 40 octets / 32 caractères , ce qui peut être plus court selon le schéma de mesure:
#2[n⟼f⟼x⟼n[g⟼#@g@f&][x&][#&]]@#&
La version non-golfée est une traduction littérale de la définition classique de pred :
qui ressemble à ceci dans le frontal de Mathematica:
Cette fonction de soustraction fonctionne avec les chiffres de l'Église définis avec
(non golfed:
c[0] = Identity &; c[n_] = Function[a, a@*c[n-1][a]]
)pour que nous ayons
et
la source