Finden Sie relevante Zifferngruppierungen


14

Vor kurzem war mein Ruf 25,121. Ich bemerkte, dass jede Zifferngruppierung (dh die durch Kommas getrennten Zahlen) ein perfektes Quadrat war.

Ihre Herausforderung besteht darin, bei einer nicht negativen ganzen Zahl N und einer unären booleschen Black-Box-Funktion f : Z *B einen Wahrheitswert zu erhalten, wenn jeder Wert von f , der auf die Zifferngruppierungen von N angewendet wird, wahr ist, andernfalls falsch.

Sie finden die Zifferngruppierungen, indem Sie die Zahl von rechts nach rechts in Dreiergruppen aufteilen. Die Gruppe ganz links kann aus 1, 2 oder 3 Ziffern bestehen. Einige Beispiele:

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)

Zusätzliche Regeln

  • Diese Funktion kann entweder auf Boolesche Werte (z. B. trueund false), 1s und 0s oder auf einen beliebigen Wert für "truthy / falsey" abgebildet werden. Bitte geben Sie an, welche Formate von Ihrer Antwort unterstützt werden.
  • Sie können eine Ganzzahl als Eingabe oder eine Ganzzahlzeichenfolge (dh eine aus Ziffern zusammengesetzte Zeichenfolge) verwenden.
  • Sie können ein Programm oder eine Funktion schreiben.
  • Wenn Sie die digitalen Gruppen an die Funktion f übergeben , sollten Sie alle unnötigen führenden Nullen kürzen. Beispielsweise sollte f , wenn es auf N = 123.000 angewendet wird, als f (123) und f (0) ausgeführt werden.

Testfälle

Funktionsnotation ist n -> f(n)z n -> n == 0. Alle Operatoren gehen von einer Ganzzahlarithmetik aus. (ZB 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

Wenn wir keine Funktionen als Argumente annehmen können, dürfen wir dann davon ausgehen, dass die Funktion als Variable definiert ist und wir verweisen darauf in unserem Programm?
Caird Coinheringaahing

@cairdcoinheringaahing Bitte lesen Sie die Referenz für Blackbox- Funktionen , insbesondere die Referenzen am Ende dieses Beitrags. Um es zusammenzufassen, ja, Sie können, auch wenn Ihre Sprache in der Lage ist, Funktionen als Argumente zu übernehmen (afaict)
Conor O'Brien

Kann der Eingang negativ sein? Null? Sie sprechen von ganzen Zahlen, aber alle Beispiele sind positiv. Ich würde auch vorschlagen, Testfälle einzuschließen, in denen eine Gruppierung von 000 behandelt werden muss.
Xnor

1
@ ConorO'Brien In diesem Fall sollten Sie die Testfälle hinzufügen (auf sie n -> n > 0anwenden 0), da die meisten Antworten darauf fehlschlagen.
Asone Tuhid

1
@EriktheOutgolfer Sie sind [0].
Conor O'Brien

Antworten:


4

Gelee , 5 Bytes

bȷÇ€Ạ

Probieren Sie es online!

Das Befehlszeilenargument ist die Zahl. Die Zeile über der Zeile, in der sich diese Funktion befindet, ist die Hauptzeile des restlichen Programms, dh der Code, der für jede der Gruppen aufgerufen wird. Achten Sie darauf, dass Sie sich nicht auf die Zeile beziehen, in der sich diese bȷÇ€Ạbefindet! Das hier verwendete Beispiel ist der 5. Testfall.



@AsoneTuhid Ist es nicht; Die Zahl ist 0und ihre Zifferngruppenliste ist [0], also wird sie jedem Element zugeordnet (dem einzelnen 0hier), [1]wodurch die Liste zu und zurückgegeben wird, da alle Elemente dieser Liste wahr 1sind. Beachten Sie, dass sich []das Ergebnis nicht ändern würde , wenn ich stattdessen die Zifferngruppenliste hätte, da alle Elemente von []wahr sind (leere Wahrheit). Das Ergebnis kann jedoch für verschiedene Programme unterschiedlich sein, und die Regeln dafür sind nicht genau klar ( nachgefragtes OP ).
Erik der Outgolfer

Entschuldigung, dann verstehe ich Jelly kaum. Gute Lösung.
Asone Tuhid

7

Brachylog , 8 Bytes

ḃ₁₀₀₀↰₁ᵐ

Probieren Sie es online!

Die Blackbox-Funktion wechselt in die zweite Zeile (oder in die "Fußzeile" von TIO) und die Ganzzahl wird aus STDIN gelesen. Druckt true.oder false.entsprechend.

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

Übernimmt die Funktion und den Wert durch Currying und gibt 0 oder 1 zurück. Bearbeiten: 4 Bytes dank @Shaggy gespeichert.


1000-> 1e3um ein paar Bytes zu sparen. Und könnten Sie ersetzen &&mit &für ein anderes Byte?
Shaggy

@ Shaggy Ja, ich denke das ist sicher genug. Gleiches gilt für die Antwort von betseg?
Neil

scheitert function_name(n=>n>0)(0)(Rückkehr true)
Asone Tuhid

@AsoneTuhid Danke, behoben.
Neil

2

Pyth , 9 Bytes

.AyMjQ^T3

Probieren Sie es online! (verwendet den dritten Testfall)

Angenommen, die Black-Box-Funktion heißt y. Sie können eine solche Funktion mit L(argument b:) deklarieren , wie in TIO gezeigt. Ich werde alle Testfälle später implementieren, wenn ich Zeit habe.


2

Stax , 8 Bytes

Vk|Eym|A

Stax-Programme haben keine Funktionsaufrufe oder Argumente, daher speichern wir einen Block im YRegister, der einen einzelnen Wert verbraucht und erzeugt. Dies kann vor dem Programmcode erfolgen.

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

Hier ist ein Beispiel mit der perfekten Quadratfunktion.





1

Excel VBA, 79 Bytes

Eine anonyme VBE-Direktfensterfunktion, die Eingaben nals Ganzzahl aus dem Bereich [A1]und den Namen einer öffentlich definierten VBA-Funktion aus dem Bereich entgegennimmt [B1].

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

Anwendungsbeispiel

In einem öffentlichen Modul wird die Eingabefunktion in diesem Fall f()definiert.

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

Die Eingangsvariablen werden gesetzt.

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

Die Sofortfensterfunktion wird dann aufgerufen.

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

Probieren Sie es online!

Ein rekursives Lambda, das eine Funktion und eine Ganzzahl annimmt und einen Booleschen Wert zurückgibt.

36 Bytes (nur positives n)

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

Diese Version kehrt 1für die Wahrheit, falsefür die Falschheit zurück. Leider kann es beim ausfallenn = 0

Probieren Sie es online!


Ich denke, Sie müssen zählen, g=ob es rekursiv ist
Asone Tuhid

@AsoneTuhid Oh, das macht Sinn. Ich werde es in hinzufügen.
benj2240

Versuchen Sie auch, diese (-1 Byte), gibt sie 1als truthy Wert
asOne Tuhid

Das hat mein Gehirn ein wenig zerknittert ... Ich musste ein bisschen herum basteln, um mich davon zu überzeugen, dass es in allen Fällen funktionierte. Vielen Dank!
benj2240

Ich habe mich geirrt, diese Version funktioniert nicht für g[->n{n>0},0](Retouren true). Es schlägt nur fehl, wenn die Eingabe 0"nicht negativ" lautet , Sie sollten also zu 37 zurückkehren. Entschuldigung
Asone Tuhid

1

Appleseed , 51 Bytes

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

Anonyme Lambda-Funktion, die eine Zahl und eine Funktion übernimmt und einen booleschen Wert zurückgibt.

Probieren Sie es 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

Addiere ++ , 15 Bytes

L,1000$bbbUª{f}

Probieren Sie es online!

Erfordert fdie Deklaration einer Funktion im TIO-Header.

Wie es funktioniert

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

Probieren Sie es online!

Erläuterung

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

Nimmt die Nummer als erste Eingabezeile und die Funktion als zweite.
Ausgänge 1 für truthy und 0 für falsy.


Dies führt den Code nicht für jedes Element aus, sondern für die gesamte Liste.
Erik der Outgolfer

@EriktheOutgolfer: Mit der automatischen Vektorisierung von 05AB1E ist dies in den meisten Fällen der Fall. Mir ist nur klar geworden, dass es für Qund Êobwohl nicht funktioniert . Ich werde auf die 8-Byte-Version zurückgreifen.
Emigna

Trotzdem ist es nicht .Vso vektorisierend, dass es die Liste nicht einmal als eigentliches Argument betrachtet.
Erik der Outgolfer

@EriktheOutgolfer: Ich habe noch nie gesagt, dass .Vvektorisiert. In dem Beispiel in meinem Link ist es È.
Emigna

Eigentlich Qund Êwürde mit Vektorisierung arbeiten, anders als ich es vorher angegeben habe, aber mit der automatischen Vektorisierung würden diese Befehle auf die gesamte Liste abgebildet, was sich außerhalb des Geistes der Herausforderung anfühlt, die wir brauchen ε.
Emigna
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.