Trova raggruppamenti di cifre pertinenti


14

Di recente, la mia reputazione è stata 25,121. Ho notato che ogni raggruppamento di cifre (ovvero i numeri separati da virgole) era un quadrato perfetto.

La tua sfida è, dato un numero intero non negativo N e una funzione black box unaria booleana f : Z *B , produce un valore di verità se ogni valore di f applicato ai gruppi di cifre di N è vero, e falso altrimenti.

Si possono trovare i raggruppamenti delle cifre suddividendo il numero in gruppi di 3, iniziando dal lato destro. Il gruppo più a sinistra può contenere 1, 2 o 3 cifre. Qualche esempio:

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)

Regole aggiuntive

  • Questa funzione può mappare sia booleani (es truee false), 1s e 0S o qualsiasi valore truthy / falsey. Specifica quali formati sono supportati dalla tua risposta.
  • È possibile prendere un numero intero come input o una stringa intera (ovvero una stringa composta da cifre).
  • È possibile scrivere un programma o una funzione.
  • Quando si passano i gruppi digitali alla funzione f , è necessario tagliare tutti gli zero iniziali non necessari. Ad esempio, f , quando applicato a N = 123.000 dovrebbe essere eseguito come f (123) ef (0).

Casi test

La notazione di funzione è n -> f(n), ad es n -> n == 0. Tutti gli operatori assumono l'aritmetica dei numeri interi. (Ad es. 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 non siamo in grado di accettare funzioni come argomenti, possiamo supporre che la funzione sia definita come variabile e la facciamo riferimento nel nostro programma?
caird coinheringaahing

@cairdcoinheringaahing Si prega di leggere il riferimento per le funzioni della scatola nera , in particolare i riferimenti alla fine di quel post. Per riassumere, sì, puoi, anche se la tua lingua è in grado di assumere funzioni come argomenti (afaict)
Conor O'Brien,

L'ingresso può essere negativo? Zero? Parli di numeri interi, ma tutti gli esempi sono positivi. Suggerirei anche di includere casi di test in cui è necessario gestire un raggruppamento di 000.
xnor

1
@ ConorO'Brien In quel caso dovresti aggiungere ( n -> n > 0applicato a 0) ai casi di test perché la maggior parte delle risposte fallisce.
Solo Tuhid,

1
@EriktheOutgolfer Lo sono [0].
Conor O'Brien,

Risposte:


4

Gelatina , 5 byte

bȷÇ€Ạ

Provalo online!

L'argomento della riga di comando è il numero. La riga sopra la riga in cui risiede questa funzione è la riga principale del resto del programma, ovvero il codice che viene chiamato per ciascuno dei gruppi. Fare attenzione a non fare riferimento alla linea bȷÇ€Ạè in! L'esempio usato qui è il 5 ° caso di test.



@AsoneTuhid Non lo è; Il numero è 0e il suo elenco di gruppi di cifre è [0], quindi viene mappato su ciascun elemento ( 0qui il singolo ), trasformando l'elenco in [1]e, poiché tutti gli elementi di questo elenco sono veritieri, 1viene restituito. Nota che se avessi l'elenco dei gruppi di cifre []invece il risultato non cambierebbe, poiché tutti gli elementi di []sono verità (verità vacua). Tuttavia, il risultato può essere diverso per i diversi programmi e le regole non sono esattamente chiare al riguardo ( PO richiesto ).
Erik the Outgolfer

Scusa, capisco a malapena Jelly. Bella soluzione.
Solo Tuhid,

7

Brachylog , 8 byte

ḃ₁₀₀₀↰₁ᵐ

Provalo online!

La funzione blackbox passa alla seconda riga (o "Footer" su TIO) e l'intero viene letto da STDIN. Stampa true.o di false.conseguenza.

ḃ₁₀₀₀      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 byte

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

Accetta la funzione e il valore eseguendo il curry e restituisce 0 o 1. Modifica: salvato 4 byte grazie a @Shaggy.


1000-> 1e3per salvare un paio di byte. E potresti sostituirlo &&con &un altro byte?
Shaggy

@Shaggy Sì, penso che sia abbastanza sicuro. Lo stesso vale per la risposta di Betseg?
Neil,

non riesce per function_name(n=>n>0)(0)(ritorna true)
Asone Tuhid

@AsoneTuhid Grazie, risolto.
Neil

2

Pyth , 9 byte

.AyMjQ^T3

Provalo online! (utilizza il terzo caso di test)

Presuppone che la funzione scatola nera sia denominata y. È possibile dichiarare tale funzione usando L(argomento b:), come mostrato su TIO. In seguito implementerò tutti i casi di test, se ho tempo.


2

Stax , 8 byte

Vk|Eym|A

I programmi Stax non hanno chiamate di funzione o argomenti, quindi memorizziamo un blocco nel Yregistro che consuma e produce un singolo valore. Questo può essere fatto prima del codice del programma.

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

Ecco un esempio usando la funzione quadrata perfetta.





1

05AB1E , 8 byte

₄вεI.V}P

Provalo online!

Spiegazione

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

Prende il numero come prima riga di input e la funzione come seconda.
Emette 1 per verità e 0 per falsa.


Questo non esegue il codice su ogni elemento, ma sull'intero elenco.
Erik the Outgolfer,

@EriktheOutgolfer: con la vettorializzazione automatica di 05AB1E lo farà nella maggior parte dei casi. Mi sono appena reso conto che non funzionerà per Qe Êcomunque. Tornerò alla versione a 8 byte.
Emigna,

Tuttavia, non è .Vquello che vettorializza, non prende nemmeno la lista come argomento stesso per cominciare.
Erik the Outgolfer,

@EriktheOutgolfer: non ho mai detto che .Vvettorializza. Nell'esempio nel mio link è È.
Emigna,

In realtà Qe Êfunzionerebbe con la vettorializzazione diversamente da quanto precedentemente affermato, ma l'uso della vettorializzazione automatica renderebbe questi comandi mappati sull'intera lista che sembra fuori dallo spirito della sfida, quindi abbiamo bisogno ε.
Emigna,

1

Excel VBA, 79 byte

Una funzione di finestra immediata VBE anonima che accetta input, ncome tipo intero dall'intervallo [A1], e il nome di una funzione VBA definita pubblicamente dall'intervallo [B1].

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

Esempio di utilizzo

In un modulo pubblico, la funzione di input, in questo caso f()è definita.

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

Le variabili di input sono impostate.

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

Viene quindi chiamata la funzione finestra immediata.

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

Rubino , 37 byte

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

Provalo online!

Un lambda ricorsivo, che assume funzione e numero intero e ritorna booleano.

36 byte (solo positivo n)

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

Questa versione ritorna 1per verità, falseper falsità. Purtroppo può fallire quandon = 0

Provalo online!


Penso che devi contare g=se è ricorsivo
Asone Tuhid,

@AsoneTuhid Oh, ha senso. Lo aggiungerò.
benj2240,

Inoltre, prova questo (-1 byte), restituisce 1il valore di
verità

Mi ha arricciato un po 'il cervello ... Ho dovuto armeggiare un po' per convincermi che funzionava in tutti i casi. Grazie!
benj2240,

Ho sbagliato, questa versione non funziona per g[->n{n>0},0](ritorna true). Fallisce solo se l'input è, 0ma la domanda dice "non negativo", quindi dovresti tornare a 37. scusa
Asone Tuhid

1

Appleseed , 51 byte

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

Funzione lambda anonima che accetta un numero e una funzione e restituisce un valore booleano.

Provalo 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

Aggiungi ++ , 15 byte

L,1000$bbbUª{f}

Provalo online!

Richiede una funzione fda dichiarare nell'intestazione TIO.

Come funziona

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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.