Un entier positif k
est un nombre de Loeschian si
k
peut être exprimé commei*i + j*j + i*j
pouri
,j
entier.
Par exemple, les premiers nombres loeschiens positifs sont: 1
( i=1
, j=0
); 3
( i=j=1
); 4
( i=2
, j=0
); 7
( i=2
, j=1
); 9
( i=-3
, j=3
); ... Notez que i
, j
pour une donnée, k
ne sont pas uniques. Par exemple, 9
peut également être généré avec i=3
, j=0
.
Les autres caractérisations équivalentes de ces nombres sont:
k
peuvent être exprimés sous formei*i + j*j + i*j
dei
,j
entiers non négatifs. (Pour chaque paire d'entiersi
,j
il y a une paire d'entiers non négatifs qui donne le mêmek
)Il y a un ensemble d'
k
hexagones contigus qui forment une tesselation sur une grille hexagonale (voir les illustrations pourk = 4
et pourk = 7
). (En raison de cette propriété, ces numéros trouvent une application dans les réseaux de communication cellulaires mobiles .)Voir plus de caractérisations dans la page OEIS de la séquence.
Le défi
Étant donné un nombre entier positif , la sortie d' un résultat truthy si elle est un nombre Loeschian , ou un résultat falsy autrement.
Le programme ou la fonction doit gérer (par exemple en moins d’une minute) les entrées jusqu’à 1000
ou jusqu’à des limites de types de données.
Code de golf. Le plus court gagne.
Cas de test
Les nombres suivants devraient donner un résultat vrai:
1, 4, 7, 12, 13, 108, 109, 192, 516, 999
Les nombres suivants devraient donner un résultat faux:
2, 5, 10, 42, 101, 102, 128, 150, 501, 1000
la source
i, j non-negative integers
ou9 (i=-3, j=3)
- lequel est-ce?Réponses:
Gelée ,
11 à9 octetsEssayez-le en ligne! ou vérifier tous les cas de test .
Contexte
Dans Résultats élémentaires sur la forme quadratique binaire a² + ab + b² , l'auteur prouve le théorème suivant sur les nombres löschiens.
Comme indiqué sur la page OEIS correspondante , tous les entiers étant congruents à 0 , 1 ou 2 modulo 3 , le nombre 3 est le seul nombre premier congru à 0 et tous les nombres de la forme (6k + 1) sont congruents. 1 , le théorème peut être énoncé alternativement comme suit.
Un entier non négatif n est un nombre de Löschian si et seulement si tous les facteurs premiers de n congruants à 2 modulo 3 ont même des exposants.
Comment ça marche
la source
Retina ,
6663454336 octetsMalgré le titre disant Retina, il s’agit simplement d’une expression rationnelle .NET qui accepte les représentations unaires des nombres de Loeschian.
Les entrées 999 et 1000 prennent bien moins d'une seconde.
Essayez-le en ligne! (La première ligne active une suite de tests séparée par des sauts de ligne et les deux suivantes traitent de la conversion en unaire pour des raisons de commodité.)
Explication
La solution est basée sur la classification selon laquelle l'entrée peut être écrite de manière
i*i + j*(i + j)
positivei
et non négativej
(puisque nous n'avons pas à gérer l'entrée0
), et c'estn*n
simplement la somme des premiersn
entiers impairs. Le golf était un exercice intéressant dans les références en avant.Une "référence en aval" est une référence en arrière dans le groupe auquel elle fait référence. Bien sûr, cela ne fonctionne pas lorsque le groupe est utilisé pour la première fois, car il n’ya pas encore de référence en retour, mais si vous mettez cela dans une boucle, la référence en arrière obtient à chaque fois la capture de l’itération précédente. Cela vous permet d’accumuler une capture plus grande à chaque itération. Ceci peut être utilisé pour créer des motifs très compacts pour des choses comme des nombres triangulaires, des carrés et des nombres de Fibonacci.
Par exemple, en utilisant le fait que les carrés ne sont que la somme des premiers
n
entiers impairs, nous pouvons faire correspondre une entrée carrée comme celle-ci:À la première itération,
..\1
ne peut pas fonctionner car il\1
n'a pas encore de valeur. Nous commençons donc par^.
capturer un seul personnage dans un groupe1
. Lors des itérations suivantes,^.
ne correspond plus en raison de l'ancre, mais..\1
est maintenant valide. Il correspond à deux caractères de plus que l'itération précédente et met à jour la capture. De cette façon, nous faisons correspondre des nombres impairs croissants, en obtenant un carré après chaque itération.Malheureusement, nous ne pouvons pas utiliser cette technique telle quelle. Après l’appariement
i*i
, nous devonsi
aussi obtenir le résultat pour pouvoir le multiplier parj
. Un moyen simple (mais long) de faire cela consiste à utiliser le fait que l'appariementi*i
prend desi
itérations, de sorte que nous avons capturé desi
éléments en groupe1
. Nous pourrions maintenant utiliser des groupes d'équilibrage pour extraire celai
, mais comme je l'ai dit, cela coûte cher.Au lieu de cela, j'ai imaginé une manière différente d'écrire cette "somme d'entiers impairs consécutifs" qui aboutit également
i
à un groupe de capture à la fin. Bien sûr, lei
troisième chiffre est juste2i-1
. Cela nous donne un moyen d'incrémenter la référence en avant uniquement de 1 à chaque itération. C'est cette partie:Cela
()
pousse simplement une capture vide sur le groupe1
(initialisationi
à0
). Ceci est à peu près équivalent à la^.|
solution simple ci-dessus, mais l’utilisation|
dans ce cas serait un peu plus délicate.Ensuite, nous avons la boucle principale
(\1(?<1>.\1))
.\1
correspond au précédenti
,(?<1>.\1)
puis met à jour le groupe1
aveci+1
. En termes de nouveautéi
, nous venons d'associer des2i-1
personnages. Exactement ce dont nous avons besoin.Lorsque nous avons terminé, nous avons identifié un carré
i*i
et le groupe1
contient toujours desi
personnages.La deuxième partie est plus proche de la simple correspondance carrée que j'ai montrée ci-dessus. Ignorons la référence arrière
1
pour l'instant:C'est fondamentalement la même chose
(^.|..\4)*
, sauf que nous ne pouvons pas utiliser^
car nous ne sommes pas au début de la chaîne. Au lieu de cela, nous utilisons un conditionnel, pour faire correspondre le complément.\1
uniquement lorsque nous avons déjà utilisé le groupe4
. Mais en réalité, c'est exactement la même chose. Cela nous donnej*j
.La seule chose qui manque, c'est le
j*i
terme. Nous combinons cela avec lej*j
en utilisant le fait que lej*j
calcul prend encore desj
itérations. Donc, pour chaque itération, nous faisons également avancer le curseuri
avec\1
. Nous devons simplement nous assurer de ne pas écrire cela dans le groupe4
, car cela gâcherait la correspondance de nombres impairs consécutifs. C'est comme ça qu'on arrive au:la source
CJam (
1615 octets)Démo en ligne
C'est un bloc (une "fonction anonyme") qui prend des entrées sur la pile et qui part
0
ou1
sur la pile. Il utilise la caractérisation qu'un nombre est Loeschian ssi il n'a pas de facteur premier égal à 2 mod 3 avec une multiplicité impaire.Merci à Dennis pour une économie d'un octet.
la source
Python 2, 56 octets
la source
Haskell, 42 octets
Exemple d'utilisation:
f 501
->False
.Essaye toutes les combinaisons de
i
partir0
àk
etj
de0
ài
.or
retourneTrue
si l'égaliték==i*i+j*j+i*j
est valable pour au moins une des combinaisons.@flawr a trouvé une version légèrement différente avec le même nombre d'octets:
la source
or
, cool =) Peut - être que vous avez une idée comment jouer au golf ce phrasé alternatif:f k|v<-[0..k]=or[(i+j)^2==k+i*j|i<-v,j<-v]
?Java 8, 81 octets
mise en œuvre simple et naïve. coïncidence même code que C # mais utilise
->
plutôt que=>
.la source
;
. ZUT!i
ou négatifj
.Python, 67 octets
https://repl.it/Cj6x
la source
Jelly ,
15141312 octets1 octet grâce aux miles.
Essayez-le en ligne!
Vérifiez les plus petits cas de test .
Un conseil lorsque vous testez de grands nombres (plus de 50): ne le faites pas.
La vérité est un nombre positif. Falsey est zéro.
Explication
la source
Méduse ,
5643412928 octets2 octets grâce à Zgarb
Essayez-le en ligne!
Une fourchette de ma gelée répond .
la source
MATL ,
14 à13 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test .
Sorties
1
ou0
.Explication
la source
Python, 49 octets
Utilise la forme quadratique équivalente donnée sur OEIS de
n == 3*i*i+j*j
. Vérifiez sin-3*i*i
est un carré parfait pour touti
en prenant sa racine carrée et en vérifiant s'il s'agit d'un entier, c'est-à-dire égal à 0 modulo 1. Notez que Python calcule les racines carrées de carrés parfaits exactement, sans erreur de virgule flottante. Le+0j
rend un nombre complexe pour éviter une erreur sur la racine carrée d'un négatif.la source
C (gcc),
7169 octetsla source
i,j,r;f(n){for(r=i=n+1;i--;)for(j=n;j--;)r*=n!=i*i+j*j+i*j;return!r;}
.i
ou négatifj
.i
etj
.k
, mais pasi
etj
. Regardez de plus près les exemples.k
peut être exprimé commei*i + j*j + i*j
pouri, j
des entiers non négatifs ." Vous regardez de plus près.C #,
848281 octetsUne solution naïve. 1 = vrai, 0 = faux
la source
VBA,
6867 octetsRecherche naïve, commençant à ralentir légèrement pour n = 1000. Excel reconnaît le retour nul comme étant une fausseté, tous les autres comme une vérité.
Notez que l'investigation des valeurs négatives i et j n'est pas nécessaire, étant donné que i> j> = 0 :
(le même résultat que pour i et j )
(si on est négatif, peu importe lequel), puis
Et puisque les deux (ij) et j sont non négatifs, toute génération de nombres de Loeschian comportant un nombre négatif peut être obtenue à l’aide de nombres non négatifs.
Enregistré un octet,
Next:Next
->Next b,a
grâce à Taylor Scott.la source
i
ou négatifj
.Next:Next
àNext b,a
:End Function
à la fin de votre solutionJavascript (en utilisant une bibliothèque externe - Enumerable) (63 octets)
Lien vers la bibliothèque: https://github.com/mvegh1/Enumerable Explication de code: créez une plage d'entiers de 0 à k (appelez-la la plage "i") et testez si un quelconque "i" satisfait un prédicat donné. Ce prédicat crée une plage de 0 à k (appelez la plage "j") et teste si un "j" satisfait à un prédicat donné. Ce prédicat est la formule loeschienne
la source
Perl 6 ,
52 5150 octetsExplication:
Tester:
la source
i
ou négatifj
.(0..$_ X 0..$_)
produit une liste vide si$_
est inférieur à0
, il n’est donc pas nécessaire de rechercher les éléments négatifsi
,j
car ils ne le seront jamais. Puisqu'il est uniquement censé produireTrue
pour un nombre positif de Loeschian, je n'ai rien à faire de spécial pour le cas négatif.9 = (3*3)+(-3*-3)+(3*-3)
est un Loeschian positif aveci=3, j=-3
; MAIS j'ai surpassé que chaque nombre Loeschian a non négatifi
etj
. Il n'est donc pas nécessaire de rechercher des nombres négatifs. Donc, en réalité, nous pourrions supprimer ces commentaires. Désolé pour bugging; ma faute.{grep ->(\i,\j){$_==i*i+j*j+i*j},(-$_..$_ X -$_..$_)}(9)
résultats((-3,0),(-3,3),(0,-3),(0,3),(3,-3),(3,0))
. Honnêtement, je viens probablement de l'adapter à partir d'autres réponses.PowerShell v2 +,
635655 octetsPrend entrée
$k
, boucle deux fois vers le haut (boucle extérieure, boucle$i = 0 to $k
intérieure$j = 0 to $i
), chaque itération génère le résultat dei*i + j*j + i*j
(raccourci ài*(i+j) + j*j
). Ces résultats sont encapsulés dans des parenthèses et transmis sous forme de tableau à-eq$k
. Cela agit comme un filtre pour ne sélectionner que les éléments qui sont égaux à l'entrée. Renvoie une valeur non nulle (le numéro précédent) pour la vérité ou rien (vide) pour Falsey. Traite1000
en 15 secondes environ sur ma machine.Cas de test
la source
Perl, 54 + 1 (
-n
drapeau) = 55 octetsBesoins
-n
et-M5.010
drapeaux à exécuter:Affiche des données si le nombre est un nombre loeschien et rien sinon.
Cette implémentation est assez ennuyeuse, donc en voici une autre, pour 87 octets, basée sur regex, juste pour les yeux:
Faites attention à celui-ci, car le retour en arrière consomme beaucoup de mémoire, alors n'essayez pas de tester des nombres trop gros! (surtout les nombres qui ne sont pas Loeschians)
la source
Dyalog APL , 19 octets
Vérifie si k ∊ ( i + j ) ² - ij , pour tout 0 ≤ i , j ≤ k .
⊢
k est∊
un membre de∘.
toutes les combinaisons de×
i fois j-⍨
soustrait du2*⍨
carré de+
i plus j⍨
pour tout i et j en0,
zéro précédé⍳
des nombres entiers de 1 à k1000 prend 3,3 secondes sur mon M540 et encore moins sur TryAPL .
la source
Matlab,
5352 octetsRecherche simple sur toutes les possibilités.
Affiche un tableau vide en tant que falsy et un vecteur non vide en tant que valeur de vérité.
Considérant que la matrice tout-zéros est falsy et la matrice non-tout-zéros comme une vérité, nous pouvons nous débarrasser de la
find
fonction, ce qui donne une solution de47 à46 octets :Un octet enregistré grâce à @flawr
la source
(a+b).^2-a.*b==n
est plus courte.C, 66 octets
Appelez
f()
avec le numéro à tester. La fonction renvoie le nombre de solutions trouvées.Essayez sur ideone .
la source
Mathematica, 44 octets
Fonction sans nom prenant un entier en entrée et renvoyant
True
ouFalse
. La commande0~Range~#~Tuples~2
crée toutes les paires ordonnées d'entiers entre0
l'entrée et l'entrée#
. La fonction(+##)^2-##&
calcule le carré de la somme de ses arguments moins le produit de ses arguments; lorsqu'il est appelé sur deux argumentsi
etj
, c'est exactementi^2+j^2+ij
comme souhaité. Donc, cette fonction est appelée sur tous les n-uplets, puisMemberQ[...,#]
vérifie si l'entrée est l'une des valeurs résultantes.la source
ASP, 39 + 4 = 43 octets
Résultat: le problème est satisfaisable si et seulement si k est loeschien.
Answer Set Programming est un langage logique, similaire au prologue. J'utilise ici l' implémentation Potassco , Clingo .
L'entrée est prise à partir de paramètres (
-ck=
4 octets de long). Exemple d'appel:Échantillon de sortie:
Essayé avec 1000:
Échantillon de sortie:
Vous pouvez l'essayer dans votre navigateur . Malheureusement, cette méthode ne gère pas les indicateurs d'appel, vous devez donc ajouter la ligne
#const k=999
pour que cela fonctionne.Ungolfed & code expliqué:
la source
PHP, 70 octets
prend en charge l'argument de la ligne de commande sorties avec
1
pour numéro Loeschian, avec0
else.Courez avec
-nr
.panne
la source