Rechercher des groupes de chiffres pertinents

14

Récemment, ma réputation était 25,121. J'ai remarqué que chaque groupe de chiffres (c'est-à-dire les nombres séparés par des virgules) était un carré parfait.

Votre défi est, étant donné un entier non négatif N et une fonction de boîte noire unaire booléenne f : Z *B , de produire une valeur véridique si chaque valeur de f appliquée aux groupes de chiffres de N est véridique, et Falsey sinon.

On peut trouver les groupes de chiffres en divisant le nombre en groupes de 3, en commençant par le côté droit. Le groupe le plus à gauche peut avoir 1, 2 ou 3 chiffres. Quelques exemples:

12398123  -> 12,398,123    (3 digit groupings)
10        -> 10            (1 digit grouping)
23045     -> 23,045        (2 digit groupings)
100000001 -> 100,000,001   (3 digit groupings)
1337      -> 1,337         (2 digit groupings)
0         -> 0             (1 digit grouping)

Règles supplémentaires

  • Cette fonction peut correspondre à des booléens (par exemple, trueet false), 1s et 0s, ou à toute valeur truey / falsey. Veuillez spécifier le ou les formats pris en charge par votre réponse.
  • Vous pouvez prendre un entier en entrée ou une chaîne entière (c'est-à-dire une chaîne composée de chiffres).
  • Vous pouvez écrire un programme ou une fonction.
  • Lorsque vous passez les groupes numériques à la fonction f , vous devez supprimer tous les zéros de tête inutiles. Par exemple, f , lorsqu'il est appliqué à N = 123 000, doit être exécuté comme f (123) et f (0).

Cas de test

La notation fonctionnelle est n -> f(n), par exemple, n -> n == 0. Tous les opérateurs supposent une arithmétique entière. (Par exemple, sqrt(3) == 1)

function f
integer N
boolean result

n -> n == n
1230192
true

n -> n != n
42
false

n -> n > 400
420000
false

n -> n > 0
0
false

n -> n -> 0
1
true

n -> sqrt(n) ** 2 == n
25121
true

n -> sqrt(n) ** 2 == n 
4101
false

n -> mod(n, 2) == 0
2902414
true

n -> n % 10 > max(digits(n / 10))
10239120
false

n -> n % 10 > max(digits(n / 10))
123456789
true
Conor O'Brien
la source
Si nous ne pouvons pas prendre les fonctions comme arguments, pouvons-nous supposer que la fonction est définie comme une variable et que nous référençons cela dans notre programme?
caird coinheringaahing
@cairdcoinheringaahing Veuillez lire la référence pour les fonctions de la boîte noire , en particulier les références à la fin de cet article. Pour résumer, oui, vous pouvez, même si votre langage est capable de prendre des fonctions comme arguments (afaict)
Conor O'Brien
L'entrée peut-elle être négative? Zéro? Vous parlez d'entiers, mais tous les exemples sont positifs. Je suggère également d'inclure des cas de test où un regroupement de 000 doit être géré.
xnor
1
@ ConorO'Brien Dans ce cas, vous devez ajouter ( n -> n > 0appliqué à 0) aux cas de test car la plupart des réponses échouent.
Asone Tuhid
1
@EriktheOutgolfer Ils le sont [0].
Conor O'Brien

Réponses:

4

Gelée , 5 octets

bȷÇ€Ạ

Essayez-le en ligne!

L'argument de la ligne de commande est le nombre. La ligne au-dessus de la ligne dans laquelle cette fonction réside est la ligne principale du reste du programme, c'est-à-dire le code qui est appelé pour chacun des groupes. Attention à ne pas se référer à la ligne qui bȷÇ€Ạest dedans! L'exemple utilisé ici est le 5ème cas de test.

Erik le Outgolfer
la source
Je suis presque sûr que c'est un échec lors de la candidature n -> n != 0à0
Asone Tuhid
@AsoneTuhid Ce n'est pas; Le nombre est0 , et sa liste de groupes de chiffres est [0], donc est mappé à chaque élément (le seul 0ici), transformant la liste en [1]et, puisque tous les éléments de cette liste sont véridiques, 1est retourné. Notez que si j'avais la liste des groupes de chiffres, []le résultat ne changerait pas, car tous les éléments de []sont véridiques (vérité vide). Cependant, le résultat peut être différent pour différents programmes, et les règles ne sont pas exactement claires à ce sujet ( OP demandé ).
Erik the Outgolfer
Désolée alors, je comprends à peine Jelly. Belle solution.
Asone Tuhid
7

Brachylog , 8 octets

ḃ₁₀₀₀↰₁ᵐ

Essayez-le en ligne!

La fonction blackbox va sur la deuxième ligne (ou le "Footer" sur TIO) et l'entier est lu depuis STDIN. Imprime true.ou en false.conséquence.

ḃ₁₀₀₀      Compute the base-1000 digits of the input.
     ↰₁ᵐ   Map the blackbox predicate over each digit. We don't care about the
           result of the map, but the predicate must succeed for each digit,
           otherwise the entire map fails.
Martin Ender
la source
5

APL (Dyalog) , 16 13 octets

3 octets enregistrés grâce à @ Adám

∧/⎕¨1e3⊥⍣¯1⊢⎕

Essayez-le en ligne!

Comment?

1e3⊥⍣¯1⊢⎕ - saisir le nombre et encoder en base 1000

⎕¨ - saisir la fonction et appliquer sur chacun

∧/ - réduire avec logique et

Uriel
la source
Économisez 3 octets en devenant explicite: essayez-le en ligne!
Adám
@ Adám merci! J'ai bien aimé l'alpha-alpha ...
Uriel
corrigez-moi si je me trompe mais je pense que c'est un échec
Asone Tuhid
3

JavaScript (ES6), 40 36 octets

f=>g=i=>f(i%1e3)&(i<1e3||g(i/1e3|0))

Prend la fonction et la valeur en curry et retourne 0 ou 1. Edit: 4 octets enregistrés grâce à @Shaggy.

Neil
la source
1000-> 1e3pour économiser quelques octets. Et pourriez-vous remplacer &&par &un autre octet?
Shaggy
@Shaggy Oui, je pense que c'est assez sûr. Il en va de même pour la réponse de Betseg?
Neil
échoue pour function_name(n=>n>0)(0)(retourne true)
Asone Tuhid
@AsoneTuhid Merci, corrigé.
Neil
2

Pyth , 9 octets

.AyMjQ^T3

Essayez-le en ligne!(utilise le troisième cas de test)

Suppose que la fonction de boîte noire est nommée y. Vous pouvez déclarer une telle fonction en utilisant L(argument:) b, comme indiqué sur TIO. Je mettrai en œuvre tous les cas de test plus tard, si j'ai le temps.

M. Xcoder
la source
2

Stax , 8 octets

Vk|Eym|A

Les programmes Stax n'ont pas d'appels de fonction ou d'arguments, donc nous stockons un bloc dans le Yregistre qui consomme et produit une seule valeur. Cela peut être fait avant le code du programme.

{...}Yd     store a block in the Y register that executes ...
Vk|E        get "digits" of input using base 1000
    ym      map "digits" to array using y as mapping function
      |A    all elements are truthy?

Voici un exemple utilisant la fonction carrée parfaite.

récursif
la source
2

Lisp commun , 73 72 octets

(defun g(x f)(and(funcall f(mod x 1000))(or(< x 1e3)(g(floor x 1e3)f))))

Essayez-le en ligne!

Dennis
la source
Ceci est ma première réponse Lisp, donc c'est probablement terrible.
Dennis
1

05AB1E , 8 octets

₄вεI.V}P

Essayez-le en ligne!

Explication

₄в         # convert first input to base-1000
  ε   }    # apply to each element
   I.V     # execute second input as code
       P   # product of the resulting list

Prend le nombre comme première ligne d'entrée et la fonction comme seconde.
Sorties 1 pour vérité et 0 pour fausse.

Emigna
la source
Cela n'exécute pas le code sur chaque élément, mais sur toute la liste.
Erik the Outgolfer
@EriktheOutgolfer: Avec la vectorisation automatique de 05AB1E, ce sera dans la plupart des cas. Je viens de réaliser que cela ne fonctionnera pas Qet Êpourtant. Je reviens à la version 8 octets.
Emigna
Pourtant, ce n'est pas .Vque vectorise, il ne prend même pas la liste comme argument lui-même pour commencer.
Erik the Outgolfer
@EriktheOutgolfer: Je n'ai jamais dit que .Vvectorise. Dans l'exemple de mon lien, c'est È.
Emigna
En fait Q, Êcela fonctionnerait avec la vectorisation contrairement à ce que j'ai dit précédemment, mais l'utilisation de la vectorisation automatique ferait transposer ces commandes sur toute la liste, ce qui semble en dehors de l'esprit du défi dont nous avons besoin ε.
Emigna
1

Excel VBA, 79 octets

Une fonction de fenêtre immédiate VBE anonyme qui prend en entrée, ncomme type entier de la plage [A1]et le nom d'une fonction VBA définie publiquement de la plage [B1].

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t

Exemple d'utilisation

Dans un module public, la fonction d'entrée, dans ce cas, f()est définie.

Public Function f(ByVal n As Integer) As Boolean
    Let f = (n Mod 2 = 0)
End Function

Les variables d'entrée sont définies.

[A1]=2902414    ''  Input Integer
[B1]="f"        ''  input function

La fonction de fenêtre immédiate est alors appelée.

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t
 1              ''  Function output (truthy)
Taylor Scott
la source
1

Rubis , 37 octets

g=->f,n{f[n%x=1000]&&(n<x||g[f,n/x])}

Essayez-le en ligne!

Un lambda récursif, prenant la fonction et l'entier et renvoyant un booléen.

36 octets (seulement positif n)

g=->f,n{n>0?f[n%k=1000]&&g[f,n/k]:1}

Cette version revient 1pour vérité, falsepour falsey. Malheureusement, il peut échouer lorsquen = 0

Essayez-le en ligne!

benj2240
la source
I think you have to count g= if it's recursive
Asone Tuhid
@AsoneTuhid Oh, that makes sense. I'll add it in.
benj2240
Also, try this (-1 byte), it returns 1 as the truthy value
Asone Tuhid
That wrinkled my brain a little... I had to tinker around a bit to convince myself it worked in all cases. Thanks!
benj2240
J'avais tort, cette version ne fonctionne pas pour g[->n{n>0},0](retourne true). Il échoue uniquement si l'entrée est 0mais la question dit "non négatif", vous devriez donc revenir à 37. désolé
Asone Tuhid
1

Appleseed, 51 bytes

(lambda(n f)(all(map f(or(to-base 1000 n)(q(0))))))

Anonymous lambda function that takes a number and a function and returns a boolean value.

Essayez-le en ligne!

(lambda (n f)         ; Function with parameters n and f
 (all                 ; Return true if all elements of this list are truthy:
  (map f              ; Map the function f to each element of
   (or                ; This list if it is nonempty:
    (to-base 1000 n)  ; Convert n to a list of "digits" in base 1000
    (q (0))           ; Or if that list is empty (when n=0), then use the list (0) instead
   ))))
DLosc
la source
1

Ajouter ++, 15 bytes

L,1000$bbbUª{f}

Try it online!

Nécessite une fonction f to be declared in the TIO header.

Comment ça fonctionne

D,f,@,0.5^i2^A=	; Declares a function 'f' to check if a perfect square
		; E.g. 25 -> 1; 26 -> 0

L,		; Declare the main lambda function
		; Example argument: 		[25121]
	1000$bb	; Convert to base 1000	STACK = [[25 121]]
	bUª{f}	; Is 'f' true for all?	STACK = [1]
caird coinheringaahing
la source