Temukan pengelompokan digit yang relevan

14

Baru-baru ini, reputasi saya adalah 25,121. Saya perhatikan bahwa setiap pengelompokan digit (yaitu angka yang dipisahkan oleh koma) adalah kuadrat sempurna.

Tantangan Anda adalah, diberi bilangan bulat non-negatif N dan fungsi Kotak Hitam boolean unary f : Z *B , menghasilkan nilai kebenaran jika setiap nilai f yang diterapkan pada pengelompokan digit N adalah benar, dan sebaliknya falsey.

Orang dapat menemukan pengelompokan digit dengan membagi angka menjadi kelompok-kelompok 3, mulai dari sisi kanan. Grup paling kiri mungkin memiliki 1, 2, atau 3 digit. Beberapa contoh:

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)

Aturan tambahan

  • Fungsi ini dapat memetakan ke boolean (misalnya truedan false), 1s dan 0s, atau nilai true / falsey. Silakan tentukan format mana yang didukung oleh jawaban Anda.
  • Anda dapat mengambil integer sebagai input, atau string integer (yaitu string yang terdiri dari digit).
  • Anda dapat menulis program atau fungsi.
  • Saat meneruskan grup digital ke fungsi f , Anda harus memangkas semua nol terkemuka yang tidak perlu. Misalnya, f , ketika diterapkan pada N = 123.000 harus dieksekusi sebagai f (123) dan f (0).

Uji kasus

Notasi fungsi n -> f(n), misalnya n -> n == 0,. Semua operator mengasumsikan bilangan bulat aritmatika. (Misalnya, 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
sumber
Jika kami tidak dapat menggunakan fungsi sebagai argumen, apakah kami boleh berasumsi bahwa fungsi tersebut didefinisikan sebagai variabel dan kami merujuknya dalam program kami?
caird coinheringaahing
@cairdcoinheringaahing Harap baca referensi untuk fungsi Black box , khususnya referensi di akhir posting itu. Untuk meringkas, ya, Anda bisa, bahkan jika bahasa Anda mampu mengambil fungsi sebagai argumen (afaict)
Conor O'Brien
Apakah inputnya negatif? Nol? Anda berbicara tentang bilangan bulat, tetapi semua contohnya positif. Saya juga menyarankan menyertakan kasus uji di mana pengelompokan 000 perlu ditangani.
xnor
1
@ ConorO'Brien Dalam hal ini Anda harus menambahkan ( n -> n > 0diterapkan ke 0) ke kasus uji karena sebagian besar jawaban gagal di atasnya.
Asone Tuhid
1
@EriktheOutgolfer Mereka [0].
Conor O'Brien

Jawaban:

4

Jelly , 5 byte

bȷÇ€Ạ

Cobalah online!

Argumen baris perintah adalah angka. Baris di atas baris tempat fungsi ini berada adalah baris utama dari sisa program, yaitu kode yang dipanggil untuk masing-masing grup. Hati-hati jangan sampai merujuk ke baris yang bȷÇ€Ạada di! Contoh yang digunakan di sini adalah test case ke-5.

Erik the Outgolfer
sumber
Aku cukup yakin bahwa ini adalah kegagalan ketika menerapkan n -> n != 0ke0
Asone Tuhid
@ AsoneTuhid Bukan; Jumlahnya 0, dan daftar grup digitnya [0], demikian dipetakan ke setiap elemen (tunggal di 0sini), mengubah daftar menjadi [1]dan, karena semua elemen dari daftar ini adalah benar, 1dikembalikan. Perhatikan bahwa jika saya memiliki daftar kelompok digit sebagai []gantinya hasilnya tidak akan berubah, karena semua elemen dari []adalah kebenaran (kebenaran kosong). Namun, hasilnya bisa berbeda untuk program yang berbeda, dan aturannya tidak jelas tentang hal ini ( tanya OP ).
Erik the Outgolfer
Maaf, aku hampir tidak mengerti Jelly. Solusi bagus
Asone Tuhid
7

Brachylog , 8 byte

ḃ₁₀₀₀↰₁ᵐ

Cobalah online!

Fungsi kotak hitam berjalan di baris kedua (atau "Footer" di TIO) dan integer dibaca dari STDIN. Cetakan true.atau false.sesuai.

ḃ₁₀₀₀      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
sumber
5

APL (Dyalog) , 16 13 byte

3 byte disimpan berkat @ Adám

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

Cobalah online!

Bagaimana?

1e3⊥⍣¯1⊢⎕ - masukkan nomor dan enkode dalam basis 1000

⎕¨ - masukan fungsi dan terapkan masing-masing

∧/ - kurangi dengan logika dan

Uriel
sumber
Hemat 3 byte dengan membuka eksplisit: Coba online!
Adám
@ Adam terima kasih! Saya menyukai alpha-alpha ...
Uriel
koreksi saya jika saya salah tetapi saya pikir ini gagal
Asone Tuhid
4

Python 2 , 46 byte

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

Cobalah online!

Chas Brown
sumber
44 byte dengan menggunakan *menggantikan and.
Bubbler
3

JavaScript (ES6), 40 36 byte

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

Mengambil fungsi dan nilai dengan mengeruk dan mengembalikan 0 atau 1. Edit: Disimpan 4 byte berkat @Shaggy.

Neil
sumber
1000-> 1e3untuk menyimpan beberapa byte. Dan bisakah Anda mengganti &&dengan &byte lain?
Shaggy
@ Shaggy Ya, saya pikir itu cukup aman. Sama berlaku untuk jawaban betseg?
Neil
gagal untuk function_name(n=>n>0)(0)(pengembalian true)
Asone Tuhid
@ AsoneTuhid Terima kasih, sudah diperbaiki.
Neil
2

Pyth , 9 byte

.AyMjQ^T3

Cobalah online! (menggunakan test case ketiga)

Mengasumsikan fungsi kotak hitam bernama y. Anda dapat mendeklarasikan fungsi tersebut menggunakan L(argumen:) b, seperti yang ditunjukkan pada TIO. Saya akan menerapkan semua kasus uji nanti, jika saya punya waktu.

Tuan Xcoder
sumber
2

Stax , 8 byte

Vk|Eym|A

Program Stax tidak memiliki panggilan fungsi atau argumen, jadi kami menyimpan blok di Yregister yang mengkonsumsi dan menghasilkan nilai tunggal. Ini dapat dilakukan sebelum kode program.

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

Berikut ini contoh menggunakan fungsi kuadrat sempurna.

rekursif
sumber
2

Common Lisp , 73 72 byte

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

Cobalah online!

Dennis
sumber
Ini adalah jawaban Lisp pertamaku, jadi mungkin mengerikan.
Dennis
1

Excel VBA, 79 byte

Fungsi jendela langsung VBE anonim yang mengambil input, nsebagai tipe integer dari rentang [A1], dan nama fungsi VBA yang ditentukan secara publik dari rentang[B1] .

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

Contoh penggunaan

Dalam modul publik, fungsi input, dalam hal ini f() ini didefinisikan.

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

Variabel input ditetapkan.

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

Fungsi jendela langsung kemudian disebut.

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
sumber
1

Ruby , 37 byte

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

Cobalah online!

Lambda rekursif, mengambil fungsi dan integer dan mengembalikan boolean.

36 byte (hanya positif n)

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

Versi ini kembali 1untuk yang sebenarnya, falseuntuk yang palsu. Sayangnya itu bisa gagal kapann = 0

Cobalah online!

benj2240
sumber
Saya pikir Anda harus menghitung g=jika ini bersifat rekursif
Asone Tuhid
@ AsoneTuhid Oh, itu masuk akal. Saya akan menambahkannya.
benj2240
Juga, coba ini (-1 byte), ia kembali 1sebagai nilai yang sebenarnya
Asone Tuhid
Itu sedikit berkerut di otak saya ... Saya harus bermain-main sedikit untuk meyakinkan diri saya bahwa itu bekerja dalam semua kasus. Terima kasih!
benj2240
Saya salah, versi ini tidak berfungsi untuk g[->n{n>0},0](pengembalian true). Itu hanya gagal jika inputnya 0tetapi pertanyaannya mengatakan "non-negatif" jadi Anda harus kembali ke 37. maaf
Asone Tuhid
1

Diaplikasikan , 51 byte

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

Fungsi lambda anonim yang mengambil angka dan fungsi dan mengembalikan nilai boolean.

Cobalah 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
sumber
1

Tambahkan ++ , 15 byte

L,1000$bbbUª{f}

Cobalah online!

Membutuhkan suatu fungsi f dideklarasikan di header TIO.

Bagaimana itu bekerja

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
sumber
0

05AB1E , 8 byte

₄вεI.V}P

Cobalah online!

Penjelasan

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

Mengambil nomor sebagai baris input pertama dan fungsi sebagai baris kedua.
Output 1 untuk truey dan 0 untuk falsy.

Emigna
sumber
Ini tidak mengeksekusi kode pada setiap elemen, tetapi pada seluruh daftar.
Erik the Outgolfer
@EriktheOutgolfer: Dengan vektorisasi otomatis 05AB1E, dalam kebanyakan kasus hal itu akan terjadi. Saya baru menyadari bahwa itu tidak akan berhasil untuk Qdan Êmeskipun. Saya akan kembali ke versi 8-byte.
Emigna
Namun, ini bukan .Vvektorisasi, itu bahkan tidak mengambil daftar sebagai argumen itu sendiri untuk memulai.
Erik the Outgolfer
@EriktheOutgolfer: Saya tidak pernah mengatakan .Vvektorisasi itu. Dalam contoh di tautan saya itu È.
Emigna
Sebenarnya Qdan Êakan bekerja dengan vektorisasi tidak seperti yang saya katakan sebelumnya, tetapi menggunakan vektorisasi otomatis akan membuat perintah-perintah ini memetakan pada seluruh daftar yang terasa di luar semangat tantangan sehingga kita perlu ε.
Emigna