Encontre agrupamentos de dígitos relevantes

14

Recentemente, minha reputação era 25,121. Notei que cada agrupamento de dígitos (ou seja, os números separados por vírgulas) era um quadrado perfeito.

Seu desafio é que, dado um número inteiro não negativo N e uma função booleana binária unária f : Z *B , produza um valor verdadeiro se cada valor de f aplicado aos agrupamentos de dígitos de N for verdadeiro e, se não, falsey.

Pode-se encontrar os agrupamentos de dígitos dividindo o número em grupos de 3, começando do lado direito. O grupo mais à esquerda pode ter 1, 2 ou 3 dígitos. Alguns exemplos:

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)

Regras adicionais

  • Esta função pode mapear para qualquer booleanos (por exemplo, truee false), 1S e 0S, ou qualquer valor truthy / Falsey. Especifique quais formatos são suportados pela sua resposta.
  • Você pode usar um número inteiro como entrada ou uma sequência inteira (ou seja, uma sequência composta de dígitos).
  • Você pode escrever um programa ou uma função.
  • Ao passar os grupos digitais para a função f , você deve cortar todos os zeros iniciais desnecessários. Por exemplo, f , quando aplicado a N = 123.000, deve ser executado como f (123) ef (0).

Casos de teste

A notação de função é n -> f(n), por exemplo n -> n == 0,. Todos os operadores assumem aritmética inteira. (Por exemplo, 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
fonte
Se não formos capazes de aceitar funções como argumentos, podemos assumir que a função é definida como uma variável e a referenciamos em nosso programa?
caird coinheringaahing
@cairdcoinheringaahing Por favor, leia a referência para as funções da caixa preta , especificamente as referências no final desse post. Para resumir, sim, você pode, mesmo se o seu idioma é capaz de tomar funções como argumentos (AFAICT)
Conor O'Brien
A entrada pode ser negativa? Zero? Você fala sobre números inteiros, mas todos os exemplos são positivos. Eu também sugeriria incluir casos de teste em que um agrupamento de 000 precise ser tratado.
Xnor
1
@ ConorO'Brien Nesse caso, você deve adicionar ( n -> n > 0aplicado a 0) aos casos de teste porque a maioria das respostas falha nele.
Asone Tuhid
1
@EriktheOutgolfer They are [0].
Conor O'Brien

Respostas:

4

Gelatina , 5 bytes

bȷÇ€Ạ

Experimente online!

O argumento da linha de comandos é o número. A linha acima da linha em que essa função reside é a linha principal do restante do programa, ou seja, o código que é chamado para cada um dos grupos. Cuidado para não se referir à linha bȷÇ€Ạem que está! O exemplo usado aqui é o quinto caso de teste.

Erik, o Outgolfer
fonte
Tenho certeza de que este é um fracasso quando se aplica n -> n != 0a0
asone Tuhid
@AsoneTuhid Não é; O número é 0e sua lista de grupos de dígitos é [0], portanto, é mapeada para cada elemento (o único 0aqui), transformando a lista em [1]e, como todos os elementos desta lista são verdadeiros, 1é retornado. Observe que, se eu tivesse a lista do grupo de dígitos, []o resultado não mudaria, pois todos os elementos de []são verdadeiros (verdade vazia). No entanto, o resultado pode ser diferente para diferentes programas, e as regras não são exatamente claras sobre isso ( OP solicitado ).
Erik the Outgolfer
Desculpe então, eu mal entendo Jelly. Ótima solução.
asone Tuhid
7

Braquilog , 8 bytes

ḃ₁₀₀₀↰₁ᵐ

Experimente online!

A função de caixa preta fica na segunda linha (ou no "Rodapé" no TIO) e o número inteiro é lido em STDIN. Imprime true.ou de false.acordo.

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

APL (Dyalog) , 16 13 bytes

3 bytes salvos graças a @ Adám

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

Experimente online!

Quão?

1e3⊥⍣¯1⊢⎕ - insira o número e codifique na base 1000

⎕¨ - insira a função e aplique em cada

∧/ - reduzir com lógica e

Uriel
fonte
Economize 3 bytes explicitando: Experimente online!
Adám 6/03/19
@ Adám obrigado! Eu gostei do alfa-alpha embora ...
Uriel
me corrija se eu estiver errado, mas eu acho que este é um fracasso
asone Tuhid
4

Python 2 , 46 bytes

g=lambda f,n,k=1000:f(n%k)and(n<k or g(f,n/k))

Experimente online!

Chas Brown
fonte
44 bytes usando *no lugar de and.
Bubbler
3

JavaScript (ES6), 40 36 bytes

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

Pega a função e o valor currying e retorna 0 ou 1. Edit: Salvo 4 bytes graças ao @Shaggy.

Neil
fonte
1000-> 1e3para salvar alguns bytes. E você poderia substituir &&com &um outro byte?
Shaggy
@ Shagy Sim, acho que é seguro o suficiente. O mesmo vale para a resposta da betseg?
305 Neil
falha para function_name(n=>n>0)(0)(retorna true)
Asone Tuhid
@AsoneTuhid Obrigado, corrigido.
911 Neil
2

Pitão , 9 bytes

.AyMjQ^T3

Experimente online! (usa o terceiro caso de teste)

Assume que a função de caixa preta é nomeada y. Você pode declarar essa função usando L(argumento b:), conforme mostrado no TIO. Implementarei todos os casos de teste posteriormente, se tiver tempo.

Mr. Xcoder
fonte
2

Stax , 8 bytes

Vk|Eym|A

Os programas Stax não possuem chamadas ou argumentos de função; portanto, armazenamos um bloco no Yregistro que consome e produz um único valor. Isso pode ser feito antes do código do 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?

Aqui está um exemplo usando a função quadrada perfeita.

recursivo
fonte
2

Lisp comum , 73 72 bytes

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

Experimente online!

Dennis
fonte
Esta é a minha primeira resposta Lisp, então provavelmente é terrível.
Dennis
1

Excel VBA, 79 bytes

Uma função de janela imediata anônima do VBE que recebe entrada, ncomo o número inteiro do intervalo [A1]e o nome de uma função VBA definida publicamente do intervalo[B1] .

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

Exemplo de uso

Em um módulo público, a função de entrada, neste caso, f()é definida.

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

As variáveis ​​de entrada estão definidas.

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

A função imediata da janela é chamada.

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

Ruby , 37 bytes

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

Experimente online!

Um lambda recursivo, tendo função e número inteiro e retornando booleano.

36 bytes (apenas n positivo)

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

Esta versão retorna 1para verdade, falsepara falsey. Infelizmente, pode falhar quandon = 0

Experimente online!

benj2240
fonte
Eu acho que você tem que contar g=se é recursiva
asone Tuhid
@AsoneTuhid Oh, isso faz sentido. Vou adicioná-lo.
benj2240
Além disso, tente isso (-1 byte), ele retorna 1como o valor
verdadeiro
Isso enrugou meu cérebro um pouco ... Eu tive que mexer um pouco para me convencer de que funcionava em todos os casos. Obrigado!
benj2240
Eu estava errado, esta versão não funciona para g[->n{n>0},0](retorna true). Ele só não se a entrada for 0mas a questão diz "não negativo" para que você deveria voltar para 37. desculpe
asone Tuhid
1

Appleseed , 51 bytes

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

Função lambda anônima que pega um número e uma função e retorna um valor booleano.

Experimente online!

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

Adicionar ++ , 15 bytes

L,1000$bbbUª{f}

Experimente online!

Requer uma função f seja declarada no cabeçalho TIO.

Como 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
fonte
0

05AB1E , 8 bytes

₄вεI.V}P

Experimente online!

Explicação

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

Pega o número como a primeira linha de entrada e a função como a segunda.
Saídas 1 para verdade e 0 para falsidade.

Emigna
fonte
Isso não executa o código em cada elemento, mas em toda a lista.
Erik the Outgolfer
@EriktheOutgolfer: Com a vetorização automática do 05AB1E, na maioria dos casos. Acabei de perceber que não vai funcionar para Qe, no Êentanto. Voltarei à versão de 8 bytes.
Emigna
Ainda assim, não é isso .Vque vectoriza, nem sequer leva a lista como argumento em si para começar.
Erik the Outgolfer
@ EriktheOutgolfer: Eu nunca disse que .Vvetoriza. No exemplo no meu link é È.
Emigna
Na verdade, Qe Êfuncionaria com a vetorização ao contrário do que afirmei anteriormente, mas o uso da vetorização automática faria com que esses comandos fossem mapeados em toda a lista, o que parece estar fora do espírito do desafio, por isso precisamos ε.
Emigna