Encuentra agrupaciones de dígitos relevantes

14

Recientemente, mi reputación fue 25,121. Noté que cada agrupación de dígitos (es decir, los números separados por comas) era un cuadrado perfecto.

Su desafío es, dado un número entero no negativo N y una función de caja negra booleana unaria f : Z *B , producir un valor de verdad si cada valor de f aplicado a las agrupaciones de dígitos de N es verdadero, y falsey de lo contrario.

Se pueden encontrar las agrupaciones de dígitos dividiendo el número en grupos de 3, comenzando por el lado derecho. El grupo más a la izquierda puede tener 1, 2 o 3 dígitos. Algunos ejemplos:

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)

Reglas adicionales

  • Esta función se puede asignar a booleanos (por ejemplo, truey false), 1sy 0s, o cualquier valor verdadero / falso. Especifique qué formato (s) son compatibles con su respuesta.
  • Puede tomar un entero como entrada o una cadena de enteros (es decir, una cadena compuesta de dígitos).
  • Puedes escribir un programa o una función.
  • Al pasar los grupos digitales a la función f , debe recortar todos los ceros iniciales innecesarios. Por ejemplo, f , cuando se aplica a N = 123,000 debe ejecutarse como f (123) yf (0).

Casos de prueba

Notación de función es n -> f(n), por ejemplo, n -> n == 0. Todos los operadores suponen aritmética de enteros. (Ej. 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
fuente
Si no podemos tomar las funciones como argumentos, ¿podemos suponer que la función está definida como una variable y la hacemos referencia en nuestro programa?
caird coinheringaahing
@cairdcoinheringaahing Lea la referencia para las funciones del recuadro negro , específicamente las referencias al final de esa publicación. Para resumir, sí, puede hacerlo, incluso si su lenguaje es capaz de tomar funciones como argumentos (afaict)
Conor O'Brien
¿Puede la entrada ser negativa? ¿Cero? Hablas de enteros, pero todos los ejemplos son positivos. También sugeriría incluir casos de prueba en los que sea necesario manejar una agrupación de 000.
xnor
1
@ ConorO'Brien En ese caso, debe agregar ( n -> n > 0aplicado 0) a los casos de prueba porque la mayoría de las respuestas fallan.
Asone Tuhid
1
@EriktheOutgolfer Lo son [0].
Conor O'Brien

Respuestas:

4

Jalea , 5 bytes

bȷÇ€Ạ

Pruébalo en línea!

El argumento de la línea de comando es el número. La línea sobre la línea en la que reside esta función es la línea principal del resto del programa, es decir, el código que se llama para cada uno de los grupos. ¡Tenga cuidado de no referirse a que la línea bȷÇ€Ạestá adentro! El ejemplo utilizado aquí es el quinto caso de prueba.

Erik el Outgolfer
fuente
Estoy bastante seguro de que esto es un fracaso cuando se aplica n -> n != 0a0
ASONE Tuhid
@AsoneTuhid No lo es; El número es 0, y su lista de grupos de dígitos es [0], entonces se asigna a cada elemento (el único 0aquí), convirtiendo la lista en [1]y, dado que todos los elementos de esta lista son verdaderos, 1se devuelve. Tenga en cuenta que si tuviera la lista de grupos de dígitos en su []lugar, el resultado no cambiaría, ya que todos los elementos de []son verdaderos (verdad vacía). Sin embargo, el resultado puede ser diferente para diferentes programas, y las reglas no son exactamente claras al respecto (se le preguntó a OP ).
Erik the Outgolfer
Lo siento, apenas entiendo a Jelly. Buena solución
Asone Tuhid
7

Brachylog , 8 bytes

ḃ₁₀₀₀↰₁ᵐ

Pruébalo en línea!

La función blackbox va en la segunda línea (o el "Pie de página" en TIO) y el entero se lee desde STDIN. Impresiones true.o en false.consecuencia.

ḃ₁₀₀₀      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
fuente
5

APL (Dyalog) , 16 13 bytes

3 bytes guardados gracias a @ Adám

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

Pruébalo en línea!

¿Cómo?

1e3⊥⍣¯1⊢⎕ - ingrese el número y codifique en la base 1000

⎕¨ - ingrese la función y aplique en cada

∧/ - reducir con lógica y

Uriel
fuente
Ahorre 3 bytes haciendo explícito: ¡ Pruébelo en línea!
Adám
@ Adám gracias! Aunque me gustó el alfa-alfa ...
Uriel
corregirme si estoy equivocado pero creo que esto es un fracaso
Asone Tuhid
3

JavaScript (ES6), 40 36 bytes

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

Toma la función y el valor al curry y devuelve 0 o 1. Editar: Guardado 4 bytes gracias a @Shaggy.

Neil
fuente
1000-> 1e3para guardar un par de bytes. Y podría reemplazar &&con &otro byte?
Shaggy
@ Shaggy Sí, creo que es lo suficientemente seguro. Lo mismo ocurre con la respuesta de Betseg?
Neil
falla para function_name(n=>n>0)(0)(regresa true)
Asone Tuhid
@AsoneTuhid Gracias, arreglado.
Neil
2

Pyth , 9 bytes

.AyMjQ^T3

Pruébalo en línea! (usa el tercer caso de prueba)

Asume que se nombra la función de recuadro negro y. Puede declarar dicha función utilizando L(argumento b:), como se muestra en TIO. Implementaré todos los casos de prueba más tarde, si tengo tiempo.

Sr. Xcoder
fuente
2

Stax , 8 bytes

Vk|Eym|A

Los programas Stax no tienen llamadas de función o argumentos, por lo que almacenamos un bloque en el Yregistro que consume y produce un solo valor. Esto se puede hacer antes del código del programa.

{...}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?

Aquí hay un ejemplo usando la función cuadrada perfecta.

recursivo
fuente
2

Lisp común , 73 72 bytes

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

Pruébalo en línea!

Dennis
fuente
Esta es mi primera respuesta de Lisp, por lo que probablemente sea terrible.
Dennis
1

05AB1E , 8 bytes

₄вεI.V}P

Pruébalo en línea!

Explicación

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

Toma el número como la primera línea de entrada y la función como la segunda.
Salidas 1 para verdad y 0 para falsedad.

Emigna
fuente
Esto no ejecuta el código en cada elemento, sino en toda la lista.
Erik the Outgolfer
@EriktheOutgolfer: con la vectorización automática de 05AB1E lo hará en la mayoría de los casos. Me acabo de dar cuenta de que no funcionará Qy Êsin embargo. Volveré a la versión de 8 bytes.
Emigna
Aún así, no es .Vque se vectorice, ni siquiera toma la lista como un argumento en sí mismo para comenzar.
Erik the Outgolfer
@EriktheOutgolfer: Nunca dije que eso .Vvectorizara. En el ejemplo en mi enlace es È.
Emigna
En realidad QyÊ trabajaría con vectorización a diferencia de lo dicho anteriormente, pero utilizando vectorización automática haría que estos comandos mapa en toda la lista que se siente fuera del espíritu del reto por lo que necesitamos ε.
Emigna
1

Excel VBA, 79 bytes

Una función de ventana inmediata anónima de VBE que toma entrada, ncomo tipo entero de rango [A1], y el nombre de una función VBA definida públicamente de rango [B1].

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

Ejemplo de uso

En un módulo público, la función de entrada, en este caso, f()está definida.

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

Las variables de entrada están establecidas.

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

Entonces se llama a la función de ventana inmediata.

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
fuente
1

Rubí , 37 bytes

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

Pruébalo en línea!

Una lambda recursiva, que toma función y número entero y devuelve booleano

36 bytes (solo positivo n)

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

Esta versión vuelve 1para la verdad, falsepara Falsey. Lamentablemente puede fallar cuandon = 0

Pruébalo en línea!

benj2240
fuente
Creo que tienes que contar g=si es recursivo
Asone Tuhid
@AsoneTuhid Oh, eso tiene sentido. Lo
agregaré
Además, intente esto (-1 byte), regresa 1como el valor de
verdad
Eso arrugó un poco mi cerebro ... Tuve que pensar un poco para convencerme de que funcionó en todos los casos. ¡Gracias!
benj2240
Me equivoqué, esta versión no funciona para g[->n{n>0},0](devoluciones true). Solo falla si la entrada es 0pero la pregunta dice "no negativo", por lo que debería volver al 37. lo siento
Asone Tuhid
1

Manzana , 51 bytes

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

Función lambda anónima que toma un número y una función y devuelve un valor booleano.

Pruébalo en línea!

(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
fuente
1

Añadir ++ , 15 bytes

L,1000$bbbUª{f}

Pruébalo en línea!

Requiere fque se declare una función en el encabezado TIO.

Cómo funciona

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
fuente