Le défi
Pour ce défi, vous êtes censé déterminer si un nombre donné se trouve dans l'ensemble Cantor. Définissons donc d'abord l'ensemble Cantor.
Commencez d'abord par les nombres compris entre 0 et 1. Tout nombre en dehors de cette plage ne se trouve pas dans l'ensemble Cantor. Maintenant, divisons les nombres en trois parties égales: [0,1 / 3], [1 / 3,2 / 3], [2/3, 1]. Tous les nombres ne se trouvant pas dans les plages des première et dernière parties ne sont pas dans l'ensemble Cantor. Maintenant, vous répétez ce processus pour les segments [0,1 / 3] et [2/3, 1]. Ensuite, vous répétez ce qui reste. Vous continuez à faire ça pour toujours. En fin de compte, tous les numéros qui restent sont dans l'ensemble Cantor. Voici un diagramme des six premières itérations:
Contribution
Deux entiers x
et y
.
0 < y < 2^15
0 <= x <= y
Le plus grand dénominateur commun de x
et y
est 1, sauf x == 0
.
Production
Truthy if x/y
est dans l'ensemble Cantor.
Falsy si x/y
n'est pas dans l'ensemble Cantor.
Exemples
Voyons maintenant quelques exemples de nombres qui se trouvent dans l'ensemble Cantor.
1/3 -> true
Il se trouve sur une frontière et les frontières ne sont jamais supprimées.
1/4 -> true
1/4
n'est jamais dans le tiers médian d'un segment, bien qu'il ne soit jamais sur la frontière non plus. Si vous suivez son chemin, vous constaterez qu'il alterne entre le premier et le dernier tiers d'une section.
1/13 -> true
1/13
alterne entre les première, première et dernière sections.
1/5 -> false
1/5
tombe dans le premier bloc vide de la troisième ligne du diagramme ci-dessus, entre 1/9 et 2/9.
Autres cas de test:
0/4 -> true
3/10 -> true
3/4 -> true
10/13 -> true
1/1 -> true
12/19 -> false
5/17 -> false
3/5 -> false
1/7 -> false
1/2 -> false
Vous pouvez essayer d'autres numéros avec cet extrait:
Objectif
La personne avec le moins d'octets gagne.
la source
x == 0
Réponses:
Mathematica, 54 octets
Fonction sans nom prenant une fraction
x/y
en entrée, oùy > 0
et0 ≤ x ≤ y
, et renvoyantTrue
ouFalse
.Un nombre réel compris entre 0 et 1 est dans l'ensemble Cantor précisément quand aucun des chiffres de son expansion en base 3 n'est égal à 1; l'exception est qu'une fraction dont le dénominateur est une puissance de 3 (dont l'expansion en base 3 se termine donc) peut se terminer par un 1.
RealDigits[#,3][[1]]
donne tous les chiffres de l'expansion en base 3 de l'entrée fractionnelle#
, sous une forme comme{1, 0, 2, {0, 1, 0, 2}}
: la dernière liste est la partie périodique de l'expansion, tandis que les nombres entiers au préalable sont les chiffres avant le début de la périodicité. Si l'expansion de la base 3 est périodique immédiatement, la sortie est similaire{{0, 1, 0, 2}}
; si l'expansion en base 3 se termine, la forme est similaire{1, 0, 2}
.Nous voulons donc vérifier, en utilisant
~FreeQ~1
, si la liste est exempte de1
s ou non. Cependant, en raison de la fin de l'extension, nous voulons supprimer le dernier élément de la liste s'il est égal1
; c'est ce quiIf[Last@#===1,Most@#,#]
accomplit. (Le===
est nécessaire pour comparer une liste potentielle avec1
:==
seul reste non évalué dans cette situation.)la source
IsCantorNumber
mais ait une fonction pour déterminer si quelque chose est une chèvre .FreeQ[RealDigits[#,3][[1]]/.{{x___,1}}:>{x},1]&
1
s de fin dans la partie périodique, ce qui conduit à des réponses incorrectes. Par exemple, l'expansion en base 3 de 7/8 est .21212121 ...., ou{{2,1}}
; mais la règle suggérée changerait cela en{{2}}
, qui est exempt de1
s mais ne devrait pas l'être.#==0||FreeQ[RealDigits[#,3]/.{{x___,1},_}:>{x},1]&
? Si elle se termine et non nulleRealDigits[#,3]
sera de la forme{{__Integer},-1}
et si elle se répète, elle sera de la forme{{___Integer,{__Integer}},-1}
, non? Je suis sur mobile, donc c'est difficile à tester en ce moment. Si cela fonctionne, l'utilisation de la notation infixe pourRealDigits
pourrait également fonctionner.C (gcc) ,
615958 octetsExploite la symétrie de l'ensemble Cantor. Interrompt les
y
itérations pour éviter une boucle infinie.Essayez-le en ligne!
la source
Gelée ,
22171615 octetsImprime 3 pour la vérité, rien pour la fausse.
Essayez-le en ligne!
Contexte
Une propriété bien connue de l'ensemble Cantor est qu'il contient précisément les nombres entre 0 et 1 qui peuvent être écrits sans 1 dans leur expansion ternaire.
Notez que certains nombres - précisément les bords droits des intervalles fermés impliqués dans la construction de l'ensemble - peuvent être écrits soit avec un seul (fin) 1 soit avec une quantité infinie de 2 fin . Par exemple, 1 = 1 3 = 0,22222… 3 et 1/3 = 0,1 3 = 0,022222… 3 , tout comme 0,5 10 = 0,499999… 10 .
Pour éviter de placer un boîtier spécial sur les bords droits, nous pouvons vérifier que 1 est l'expansion décimale la plus courte à la fois dans x / y et 1 - x / y = (y - x) / y , où x / y est un bord droit ssi (y - x) / y est un bord gauche. Si au moins l'un d'entre eux ne contient aucun 1 , x / y appartient à l'ensemble Cantor.
Comment ça fonctionne
la source
3
est le vraitrue
+1.JavaScript (ES6), 65
67Modifier 2 octets enregistrés thx @Luke
Moins golfé
Tester
la source
n=n%d*3
parq=n/d|0
puis remplacerz[n]
parz[n=n%d*3]
JavaScript (ES6), 55 octets
À utiliser au curry dans le dénominateur en premier et le numérateur en second. Le formulaire standard est un octet plus long:
Explication
Si une fraction n'est pas dans l'ensemble Cantor, elle doit tomber dans l'une des sections centrales à un moment donné; par conséquent, sa représentation dans la base 3 doit contenir un 1 suivi à un moment donné d'un chiffre non nul. Voilà comment cela fonctionne:
z
garde une trace de si nous avons trouvé un 1.q
est le chiffre actuel de la base 3.!z|!q
est vrai siz
est faux (nous n'avons pas trouvé de 1) ouq
est faux (le chiffre actuel est 0).Si
n
descend jusqu'à zéro avant de trouver un chiffre différent de zéro quelque part après un 1, la fraction est dans l'ensemble de Cantor et nous revenons1
.la source
Utilitaires Bash + GNU, 62 octets
Essayez-le en ligne!
Passez-lui deux arguments entiers avec arg1 <= arg2 et 0 <arg2.
La sortie est retournée dans le code de sortie (0 pour la fausse, 1 pour la vérité), comme autorisé par les méthodes d'E / S PPCG .
Je soupçonne que l'expression régulière peut être jouée plus loin, peut-être même en éliminant la commande tr en faveur de l'utilisation de grep -z, mais c'est la plus courte que j'ai pu trouver. (Malheureusement, grep -z n'est pas compatible avec grep -P, et l'option -P pour obtenir des expressions rationnelles de style perl est requise pour la syntaxe?!).
Programme et sortie du banc d'essai:
Explication
partie dc (les arguments sont x et y):
partie tr et grep:
Un problème mineur est que, bien que dc gère des entiers arbitrairement grands, lorsque dc imprime un grand nombre, il le décompose en lignes de 69 caractères, chaque ligne sauf la dernière se terminant par une barre oblique inverse et une nouvelle ligne après chaque ligne.
La commande tr supprime toutes les barres obliques inverses et les sauts de ligne. Cela ne laisse qu'une seule ligne.
La commande grep utilise ensuite une expression régulière de style perl (option -P, qui est une extension GNU). La regex correspond si la ligne contient un 1 non suivi d'au moins y 0 ou au moins y 2 qui terminent ensuite la chaîne.
C'est exactement ce qui est nécessaire pour identifier x / y comme n'étant pas dans l'ensemble de Cantor, car la partie répétitive de la représentation en base 3 du nombre rationnel x / y peut être considérée comme commençant au chiffre # y + 1 après le point ternaire et comporte au plus y chiffres.
la source
CJam (19 octets)
Suite de tests en ligne
Il s'agit d'un bloc (fonction) anonyme qui prend deux arguments sur la pile et quitte
0
ou1
sur la pile. Il fonctionne par la base convertissant la fractionx/y
eny
base de3
chiffres et de retourner vrai ssi ils ne contiennent pas1
ou le seul1
fait partie d'un suffixe1 0 0 0 ...
.la source
Pyth , 14 octets
Basé sur ma solution C.
y
sur la première ligne d'entrée,x
sur la seconde.Si se
x/y
trouve dans l'ensemble Cantor,x
reste entre0
ety
. Sinon,x
devient plus grand qu'ày
un moment donné, puis diverge vers l'infini négatif dans les itérations restantes.Essayez-le en ligne!
la source
Lot, 91 octets
Teste les
y-1
3 premiers chiffres de la basex/y
.i
est le nombre de chiffres testés.n
est la prochaine valeur dex
.j
est vrai sin
atteint zéro (car l'expansion se termine) ou si nous avons testé desy-1
chiffres sans trouver a1
.f
est vrai sij
est vrai ou si le chiffre suivant est un1
, auquel point nous arrêtons la boucle et la sortiej
.la source