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

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.



@ 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.

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


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





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.


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.


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.





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)

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!


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

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]

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.