関連する数字グループを見つける


14

最近、私の評判はでした25,121。各数字のグループ化(つまり、コンマで区切られた数字)が完全な正方形であることに気付きました。

あなたの挑戦は、非負の整数Nと単項ブールブラックボックス関数 fZ *Bが与えられると、Nの桁グループに適用されるfの各値が真である場合は真の値を返し、それ以外の場合は偽です。

右側から数を3のグループに分割することにより、数字のグループ化を見つけることができます。一番左のグループには、1、2、または3桁があります。いくつかの例:

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)

追加のルール

  • この関数は、ブール値(trueおよびなどfalse)、1sおよび0s、または真偽値にマッピングできます。回答でサポートされている形式を指定してください。
  • 入力として整数、または整数文字列(数字で構成される文字列)を使用できます。
  • プログラムまたは関数を作成できます。
  • デジタルグループを関数fに渡す場合、不要な先行ゼロをすべて削除する必要があります。例えば、F、に適用した場合N = 123000のように実行されるべきであるF(123)およびF(0)。

テストケース

関数表記法はn -> f(n)、例えばですn -> n == 0。すべての演算子は整数演算を前提としています。(例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

関数を引数として受け取ることができない場合、関数が変数として定義されていると仮定して、プログラムでそれを参照できますか?
コイナーリンガーリング

@cairdcoinheringaahing ブラックボックス関数のリファレンス、特にその投稿の最後のリファレンスをお読みください。要約すると、はい、あなたの言語が関数を引数として取ることができる場合でも(afaict)
Conor O'Brien

入力は負の値にできますか?ゼロ?あなたは整数について話しますが、すべての例はポジティブです。また、000のグループ化を処理する必要があるテストケースを含めることをお勧めします。
-xnor

1
@ ConorO'Brienその場合、ほとんどの回答が失敗するため、テストケースに追加(にn -> n > 0適用0)する必要があります。
アソーヌトゥヒッド

1
@EriktheOutgolfer彼らはそう[0]です。
コナーオブライエン

回答:


4

ゼリー、5バイト

bȷÇ€Ạ

オンラインでお試しください!

コマンドライン引数は数値です。この関数が存在する行の上の行は、プログラムの残りのメイン行です。つまり、各グループに対して呼び出されるコードです。bȷÇ€Ạが参照されないように注意してください!ここで使用する例は、5番目のテストケースです。



@AsoneTuhidそうではありません。番号は0で、その桁グループリストは[0]であるため、各要素(0ここでは1つ)にマッピングされ、リストが変換されます。[1]このリストのすべての要素は真実で1あるため、返されます。[]代わりに数字グループリストがあれば、のすべての要素が[]真実(空虚な真実)であるため、結果は変わりません。ただし、結果はプログラムによって異なる可能性があり、これに関するルールは明確ではありません(OPに尋ねました)。
エリックアウトゴルファー

申し訳ありませんが、私はほとんどゼリーを理解していません。いい解決策。
アソーントゥヒッド

7

Brachylog、8バイト

ḃ₁₀₀₀↰₁ᵐ

オンラインでお試しください!

ブラックボックス関数は2行目(またはTIOの「フッター」)に進み、整数がSTDINから読み取られます。印刷true.またはfalse.それに応じて。

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

5

APL(Dyalog)16 13バイト

@Adámのおかげで3バイト節約

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

オンラインでお試しください!

どうやって?

1e3⊥⍣¯1⊢⎕ -数値を入力し、ベース1000でエンコードします

⎕¨ -関数を入力し、それぞれに適用します

∧/ -論理的および


明示的に行って3バイト節約:オンラインで試してみてください!
アダム

@Adámありがとう!私はアルファアルファが好きだった
Uriel

私が間違っているが、これは失敗
Asone Tuhid





3

JavaScript(ES6)、40 36バイト

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

カリー化によって関数と値を取得し、0または1を返します。編集:@Shaggyのおかげで4バイト保存されました。


1000-> 1e3数バイト節約します。そして、あなたは置き換えることができ&&&、別のバイトのために?
シャギー

@Shaggyはい、それは十分に安全だと思います。betsegの答えにも同じことが言えますか?
ニール

function_name(n=>n>0)(0)(返品true)に失敗しました
Asone Tuhid

@AsoneTuhidありがとう、修正。
ニール

2

Pyth、9バイト

.AyMjQ^T3

オンラインでお試しください!(3番目のテストケースを使用)

ブラックボックス関数の名前はであると仮定しますy。TIOに示されているように、L(引数b:)を使用してこのような関数を宣言できます。時間があれば、後ですべてのテストケースを実装します。


2

スタックス、8バイト

Vk|Eym|A

Staxプログラムには関数呼び出しや引数がないためY、単一の値を消費して生成するブロックをレジスタに保存します。これは、プログラムコードの前に行うことができます。

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

完全な二乗関数を使用した例次に示します。





1

Excel VBA、79バイト

nrangeから整数型として入力を取り、rangeから[A1]公的に定義されたVBA関数の名前を受け取る匿名VBEイミディエイトウィンドウ関数[B1]

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

使用例

パブリックモジュールでは、この場合の入力関数f()が定義されています。

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

入力変数が設定されます。

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

次に、イミディエイトウィンドウ関数が呼び出されます。

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

ルビー、37バイト

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

オンラインでお試しください!

関数と整数を取り、ブール値を返す再帰ラムダ。

36バイト(正のnのみ)

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

このバージョンは1、偽りのfalseために、真実のために戻ります。残念ながら、それは失敗することができますn = 0

オンラインでお試しください!


私はあなたがカウントすると思うg=、それは再帰的だ場合
Asone Tuhid

@AsoneTuhidああ、それは理にかなっています。追加します
。– benj2240

また、しようとし、これを(-1バイト)、それは返し1truthy値として
Asone Tuhid

それは私の脳を少ししわにした...私はそれがすべての場合でうまくいくと確信させるために少しいじくり回さなければならなかった。ありがとう!
benj2240

私は間違っていました、このバージョンはg[->n{n>0},0](returns true)では機能しません。入力された場合にのみ失敗した0が、あなたは申し訳ありませんが37に戻って行く必要がありますので、質問は「非ネガティブ」と言う
Asone Tuhid

1

アップルシード、51バイト

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

数値と関数を取り、ブール値を返す匿名ラムダ関数。

オンラインでお試しください!

(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

Add ++、15バイト

L,1000$bbbUª{f}

オンラインでお試しください!

fTIOヘッダーで関数を宣言する必要があります。

使い方

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バイト

₄вεI.V}P

オンラインでお試しください!

説明

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

入力の最初の行として数値を、2番目の関数として関数を使用します。
出力1 truthyためと0 falsyため。


これは、各要素でコードを実行するのではなく、リスト全体でコードを実行します。
エリックアウトゴルファー

@EriktheOutgolfer:05AB1Eの自動ベクトル化により、ほとんどの場合になります。私はちょうどそれがために動作しないことを実現QしてÊいるが。8バイトバージョンに戻ります。
エミグナ

それでも、それ.Vはベクトル化するものではなく、リスト自体を引数としてとらえさえしません。
エリックアウトゴルファー

@EriktheOutgolfer:それが.Vベクトル化すると言ったことはありません。私のリンクの例では、Èです。
エミグナ

実際QÊ以前に述べたのとは異なり、ベクトル化で動作しますが、自動ベクトル化を使用すると、これらのコマンドがリスト全体にマップされ、チャレンジの精神の外にあるため、必要になりεます。
エミグナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.