Tìm các nhóm chữ số có liên quan


14

Gần đây, danh tiếng của tôi là 25,121. Tôi nhận thấy rằng mỗi nhóm chữ số (nghĩa là các số được phân tách bằng dấu phẩy) là một hình vuông hoàn hảo.

Thách thức của bạn là, được đưa ra một số nguyên N không âm và Hàm hộp đen boolean đơn phương f : Z *B , mang lại một giá trị trung thực nếu mỗi giá trị của f áp dụng cho các nhóm chữ số của N là trung thực và ngược lại.

Người ta có thể tìm thấy các nhóm chữ số bằng cách chia số thành các nhóm 3, bắt đầu từ phía bên phải. Nhóm ngoài cùng bên trái có thể có 1, 2 hoặc 3 chữ số. Vài ví dụ:

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)

Quy tắc bổ sung

  • Hàm này có thể ánh xạ tới booleans (ví dụ truefalse), 1s và 0s hoặc bất kỳ giá trị trung thực / falsey nào. Vui lòng xác định (các) định dạng được hỗ trợ bởi câu trả lời của bạn.
  • Bạn có thể lấy một số nguyên làm đầu vào hoặc một chuỗi số nguyên (nghĩa là một chuỗi gồm các chữ số).
  • Bạn có thể viết một chương trình hoặc một chức năng.
  • Khi chuyển các nhóm kỹ thuật số cho hàm f , bạn nên cắt tất cả các số 0 không cần thiết hàng đầu. Ví dụ: f , khi áp dụng cho N = 123.000 nên được thực thi là f (123) và f (0).

Các trường hợp thử nghiệm

Ký hiệu chức năng là n -> f(n), ví dụ , n -> n == 0. Tất cả các toán tử giả định số học số nguyên. (Ví dụ 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

Nếu chúng ta không thể lấy các hàm làm đối số, chúng ta có được phép giả định rằng hàm được định nghĩa là một biến và chúng ta tham chiếu đến điều đó trong chương trình của mình không?
caird coinheringaahing

@cairdcoinheringaahing Vui lòng đọc tài liệu tham khảo cho các chức năng Hộp đen , cụ thể là các tài liệu tham khảo ở cuối bài đó. Tóm lại, vâng, bạn có thể, ngay cả khi ngôn ngữ của bạn có khả năng nhận các chức năng làm đối số (afaict)
Conor O'Brien

Đầu vào có thể là âm? Số không? Bạn nói về số nguyên, nhưng tất cả các ví dụ đều tích cực. Tôi cũng đề nghị bao gồm các trường hợp thử nghiệm trong đó một nhóm 000 cần được xử lý.
xnor

1
@ ConorO'Brien Trong trường hợp đó, bạn nên thêm (n -> n > 0 áp dụng 0) vào các trường hợp kiểm tra vì hầu hết các câu trả lời đều thất bại.
Asone Tuhid

1
@EriktheOutgolfer Họ là [0].
Conor O'Brien

Câu trả lời:


4

Thạch , 5 byte

bȷÇ€Ạ

Hãy thử trực tuyến!

Đối số dòng lệnh là số. Dòng phía trên dòng chức năng này nằm trong dòng chính của phần còn lại của chương trình, nghĩa là mã được gọi cho mỗi nhóm. Hãy cẩn thận không tham khảo các dòng bȷÇ€Ạlà trong! Ví dụ được sử dụng ở đây là trường hợp thử nghiệm thứ 5.



@AsoneTuhid Không phải vậy; Số này là 0, và danh sách nhóm chữ số của nó là [0], do đó, được ánh xạ tới từng thành phần (đơn 0ở đây), biến danh sách thành [1]và, vì tất cả các yếu tố của danh sách này là trung thực, 1được trả về. Lưu ý rằng nếu tôi có danh sách nhóm chữ số thì []thay vào đó, kết quả sẽ không thay đổi, vì tất cả các yếu tố []là sự thật (sự thật bỏ trống). Tuy nhiên, kết quả có thể khác nhau đối với các chương trình khác nhau và các quy tắc không chính xác rõ ràng về điều này ( OP hỏi ).
Erik the Outgolfer

Xin lỗi sau đó, tôi hầu như không hiểu Jelly. Giải pháp tốt đẹp.
Asone Tuhid

7

Brachylog , 8 byte

ḃ₁₀₀₀↰₁ᵐ

Hãy thử trực tuyến!

Hàm hộp đen đi trên dòng thứ hai (hoặc "Footer" trên TIO) và số nguyên được đọc từ STDIN. In true.hoặc false.theo đó.

ḃ₁₀₀₀      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 được lưu nhờ vào @ Adám

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

Hãy thử trực tuyến!

Làm sao?

1e3⊥⍣¯1⊢⎕ - nhập số và mã hóa trong cơ sở 1000

⎕¨ - nhập chức năng và áp dụng trên mỗi

∧/ - giảm với logic và


Lưu 3 byte bằng cách rõ ràng: Hãy thử trực tuyến!
Adám

@ Adám cảm ơn! Tôi thích alpha-alpha mặc dù ...
Uriel

sửa tôi nếu tôi sai nhưng tôi nghĩ đây là một thất bại
Asone Tuhid





3

JavaScript (ES6), 40 36 byte

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

Thực hiện chức năng và giá trị bằng cách curry và trả về 0 hoặc 1. Chỉnh sửa: Đã lưu 4 byte nhờ @Shaggy.


1000-> 1e3để lưu một vài byte. Và bạn có thể thay thế &&bằng &cho byte khác?
Shaggy

@Shaggy Vâng, tôi nghĩ rằng đủ an toàn. Cùng đi cho câu trả lời của betseg?
Neil

thất bại cho function_name(n=>n>0)(0)(trở về true)
Asone Tuhid

@AsoneTuhid Cảm ơn, đã sửa.
Neil

2

Bình thường , 9 byte

.AyMjQ^T3

Hãy thử trực tuyến! (sử dụng trường hợp thử nghiệm thứ ba)

Giả sử chức năng hộp đen được đặt tên y. Bạn có thể khai báo một hàm như vậy bằng cách sử dụng L(đối số b:), như được hiển thị trên TIO. Tôi sẽ thực hiện tất cả các trường hợp thử nghiệm sau, nếu tôi có thời gian.


2

Stax , 8 byte

Vk|Eym|A

Các chương trình Stax không có các lời gọi hàm hoặc đối số, vì vậy chúng tôi lưu trữ một khối trong thanh Yghi tiêu thụ và tạo ra một giá trị duy nhất. Điều này có thể được thực hiện trước mã chương trình.

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

Đây là một ví dụ sử dụng hàm vuông hoàn hảo.





1

VBA Excel, 79 byte

Hàm cửa sổ ngay lập tức VBE ẩn danh nhận đầu vào, ndưới dạng số nguyên từ phạm vi [A1]và tên của hàm VBA được xác định công khai từ phạm vi [B1].

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

Ví dụ sử dụng

Trong một mô-đun công cộng, chức năng đầu vào, trong trường hợp f()này được xác định.

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

Các biến đầu vào được đặt.

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

Các chức năng cửa sổ ngay lập tức được gọi.

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

Hãy thử trực tuyến!

Một lambda đệ quy, lấy hàm và số nguyên và trả về boolean.

36 byte (chỉ có n dương)

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

Phiên bản này trở lại 1cho sự thật, falsecho falsey. Thật không may, nó có thể thất bại khin = 0

Hãy thử trực tuyến!


Tôi nghĩ bạn phải tính g=nếu nó đệ quy
Asone Tuhid

@AsoneTuhid Ồ, điều đó có ý nghĩa. Tôi sẽ thêm nó vào.
benj2240

Ngoài ra, hãy thử điều này (-1 byte), nó sẽ trả về 1giá trị trung thực
Asone Tuhid

Điều đó làm nhăn não tôi một chút ... Tôi phải sửa lại một chút để thuyết phục bản thân nó hoạt động trong mọi trường hợp. Cảm ơn!
benj2240

Tôi đã sai, phiên bản này không hoạt động cho g[->n{n>0},0](trả về true). Nó chỉ thất bại nếu đầu vào là 0nhưng câu hỏi nói "không âm" vì vậy bạn nên quay lại 37. xin lỗi
Asone Tuhid

1

Đã áp dụng , 51 byte

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

Hàm lambda ẩn danh nhận một số và một hàm và trả về giá trị boolean.

Hãy thử trực tuyến!

(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

Thêm ++ , 15 byte

L,1000$bbbUª{f}

Hãy thử trực tuyến!

Yêu cầu một chức năng fđược khai báo trong tiêu đề TIO.

Làm thế nào nó hoạt động

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

Hãy thử trực tuyến!

Giải trình

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

Lấy số làm dòng đầu tiên và hàm là số thứ hai.
Đầu ra 1 cho sự thật và 0 cho giả.


Điều này không thực thi mã trên từng thành phần, nhưng trên toàn bộ danh sách.
Erik the Outgolfer

@EriktheOutgolfer: Với vector hóa tự động của 05AB1E, nó sẽ có trong hầu hết các trường hợp. Tôi chỉ nhận ra rằng nó sẽ không hoạt động QÊmặc dù. Tôi sẽ trở lại phiên bản 8 byte.
Emigna

Tuy nhiên, nó không phải .Vlà vector hóa, thậm chí nó không lấy danh sách làm đối số để bắt đầu.
Erik the Outgolfer

@EriktheOutgolfer: Tôi chưa bao giờ nói rằng .Vvector hóa. Trong ví dụ trong liên kết của tôi, nó È.
Emigna

Trên thực tế QÊ sẽ hoạt động với vector hóa không giống như tôi đã nêu trước đây, nhưng sử dụng vector hóa tự động sẽ làm cho các lệnh này ánh xạ trên toàn bộ danh sách mà cảm thấy bên ngoài tinh thần của thách thức mà chúng ta cần ε.
Emigna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.