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

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.



@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.






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.


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.


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.





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)

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!


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
   ))))

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]

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.