Znajdź odpowiednie grupy cyfr

14

Ostatnio moja reputacja była 25,121. Zauważyłem, że każda grupa cyfr (tzn. Liczby oddzielone przecinkami) to idealny kwadrat.

Twoim wyzwaniem jest, biorąc pod uwagę nieujemną liczbę całkowitą N i jednoargumentową funkcję logiczną Black Box f : Z *B , uzyskaj prawdziwą wartość, jeśli każda wartość f zastosowana do grup cyfr N jest prawdziwa, a falsey w przeciwnym razie.

Grupowanie cyfr można znaleźć, dzieląc liczbę na grupy po 3, zaczynając od prawej strony. Grupa najbardziej na lewo może mieć 1, 2 lub 3 cyfry. Kilka przykładów:

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)

Dodatkowe zasady

  • Ta funkcja może być przypisana do obu booleanów (np. trueI false),1 s i 0s, albo na dowolną wartość truey / falsey. Proszę określić, które formaty są obsługiwane przez twoją odpowiedź.
  • Możesz wziąć liczbę całkowitą jako dane wejściowe lub ciąg liczb całkowitych (tj. Ciąg złożony z cyfr).
  • Możesz napisać program lub funkcję.
  • Przesyłając grupy cyfrowe do funkcji f , powinieneś wyciąć wszystkie niepotrzebne zera wiodące. Np. F , gdy zastosowane do N = 123 000, należy wykonać jako f (123) if (0).

Przypadki testowe

Oznaczenie funkcji to n -> f(n)np n -> n == 0. Wszyscy operatorzy przyjmują arytmetykę liczb całkowitych. (Np. 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
źródło
Jeśli nie jesteśmy w stanie przyjmować funkcji jako argumentu, czy możemy założyć, że funkcja jest zdefiniowana jako zmienna i odwołujemy się do tego w naszym programie?
caird coinheringaahing
@cairdcoinheringaahing Proszę przeczytać odniesienia do funkcji czarnej skrzynki , w szczególności odniesienia na końcu tego postu. Podsumowując, tak, możesz, nawet jeśli twój język potrafi przyjmować funkcje jako argumenty (afaict)
Conor O'Brien
Czy dane wejściowe mogą być ujemne? Zero? Mówisz o liczbach całkowitych, ale wszystkie przykłady są pozytywne. Sugeruję również włączenie przypadków testowych, w których należy obsłużyć grupę 000.
xnor
1
@ ConorO'Brien W takim przypadku należy dodać ( n -> n > 0zastosować 0) do przypadków testowych, ponieważ większość odpowiedzi na nich się nie powiedzie.
Asone Tuhid
1
@EriktheOutgolfer Oni są [0].
Conor O'Brien

Odpowiedzi:

4

Galaretka , 5 bajtów

bȷÇ€Ạ

Wypróbuj online!

Argumentem wiersza polecenia jest liczba. Linia powyżej linii, w której znajduje się ta funkcja, jest główną linią reszty programu, to znaczy kodem wywoływanym dla każdej z grup. Uważaj, aby nie odwoływać się do linii bȷÇ€Ạ! Przykładem tutaj jest piąty przypadek testowy.

Erik the Outgolfer
źródło
@AsoneTuhid To nie jest; Liczba jest 0, a jej lista grup cyfr jest [0], więc następnie jest mapowany do każdego elementu ( 0tutaj pojedynczego ), zamieniając listę na [1]i, ponieważ wszystkie elementy tej listy są zgodne z prawdą, 1jest zwracana. Zauważ, że gdybym []zamiast tego miał listę cyfr cyfr, wynik nie zmieniłby się, ponieważ wszystkie elementy []są prawdziwe (próżna prawda). Jednak wyniki mogą być różne dla różnych programów, a zasady nie są do końca jasne w tej sprawie ( zapytany PO ).
Erik the Outgolfer
Przepraszam, ledwo rozumiem Jelly. Niezłe rozwiązanie.
Asone Tuhid
7

Brachylog, 8 bytes

ḃ₁₀₀₀↰₁ᵐ

Try it online!

The blackbox function goes on the second line (or the "Footer" on TIO) and the integer is read from STDIN. Prints true. or false. accordingly.

ḃ₁₀₀₀      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
źródło
5

APL (Dyalog), 16 13 bytes

3 bytes saved thanks to @Adám

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

Try it online!

How?

1e3⊥⍣¯1⊢⎕ - input the number and encode in base 1000

⎕¨ - input the function and apply on each

∧/ - reduce with logical and

Uriel
źródło
Save 3 bytes by going explicit: Try it online!
Adám
@Adám thanks! I liked the alpha-alpha though...
Uriel
correct me if i'm wrong but i think this is a failure
Asone Tuhid
4

Python 2, 46 bytes

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

Try it online!

Chas Brown
źródło
44 bytes by using * in place of and.
Bubbler
3

JavaScript (ES6), 40 36 bytes

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

Takes the function and value by currying and returns 0 or 1. Edit: Saved 4 bytes thanks to @Shaggy.

Neil
źródło
1000 -> 1e3 to save a couple of bytes. And could you replace && with & for another byte?
Shaggy
@Shaggy Yes, I think that's safe enough. Same goes for betseg's answer?
Neil
fails for function_name(n=>n>0)(0) (returns true)
Asone Tuhid
@AsoneTuhid Thanks, fixed.
Neil
2

Pyth, 9 bytes

.AyMjQ^T3

Try it online! (uses the third test case)

Assumes the black-box function is named y. You can declare such a function using L (argument: b), as shown on TIO. I will implement all the test cases later, if I have time.

Mr. Xcoder
źródło
2

Stax, 8 bytes

Vk|Eym|A

Stax programs do not have function calls or arguments, so we store a block in the Y register that consumes and produces a single value. This can be done before the program code.

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

Here's an example using the perfect square function.

recursive
źródło
2

Common Lisp, 73 72 bytes

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

Try it online!

Dennis
źródło
This is my first Lisp answer, so it's probably terrible.
Dennis
1

05AB1E, 8 bytes

₄вεI.V}P

Try it online!

Explanation

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

Takes the number as the first line of input and the function as the second.
Outputs 1 for truthy and 0 for falsy.

Emigna
źródło
This doesn't execute the code on each element, but on the whole list.
Erik the Outgolfer
@EriktheOutgolfer: With 05AB1E's automatic vectorization it will in most cases. I just realized that it won't work for Qand Ê though. I'll revert back to the 8-byte version.
Emigna
Still, it's not .V that vectorizes, it doesn't even take the list as an argument itself to begin with.
Erik the Outgolfer
@EriktheOutgolfer: I've never said that .V vectorizes. In the example in my link it's È.
Emigna
Actually Q and Ê would work with vectorization unlike I previously stated, but using automatic vectorization would make these commands map on the whole list which feels outside the spirit of the challenge so we need ε.
Emigna
1

Excel VBA, 79 bytes

An anonymous VBE immediate window function that takes input, n as type integer from range [A1], and the name of a publically defined VBA function from range [B1].

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

Usage example

In a public module, the input function, in this case f() is defined.

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

The input variables are set.

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

The immediate window function is then called.

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
źródło
1

Ruby, 37 bytes

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

Try it online!

A recursive lambda, taking function and integer and returning boolean.

36 bytes (only positive n)

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

This version returns 1 for truthy, false for falsey. Unfortunately it can fail when n = 0

Try it online!

benj2240
źródło
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
I was wrong, this version doesn't work for g[->n{n>0},0] (returns true). It only fails if the input is 0 but the question says "non-negative" so you should go back to 37. sorry
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.

Try it 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
źródło
1

Add++, 15 bytes

L,1000$bbbUª{f}

Try it online!

Requires a function f to be declared in the TIO header.

How it works

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
źródło