Tôi cần bao nhiêu chữ số tông?


32

Tôi cần chuẩn bị các chữ số làm bằng bìa cứng để hiển thị một số số ( ví dụ ). Tôi không biết trước mình nên hiển thị số nào - điều duy nhất tôi biết là nó không lớn hơn n.

Tôi nên chuẩn bị bao nhiêu chữ số?

Thí dụ: n = 50

Để hiển thị bất kỳ số nào trong phạm vi 0 ... 50, tôi cần các chữ số sau:

  1. Số 0, để hiển thị số 0 hoặc bất kỳ số tròn nào khác
  2. Hai bản sao của các chữ số 1, 2, 3 và 4, để hiển thị các số tương ứng
  3. Một bản sao của các chữ số 5, 6, 7 và 8, trong trường hợp chúng xuất hiện dưới dạng chữ số có nghĩa ít nhất trong số
  4. Chữ số 9 không bao giờ cần thiết, vì tôi có thể sử dụng chữ số 6 đảo ngược thay thế

Tổng cộng: 13 chữ số

Các trường hợp thử nghiệm (mỗi dòng là một trường hợp thử nghiệm ở định dạng "đầu vào; đầu ra")

0 1
1 2
9 9
11 10
50 13
99 17
100 18
135 19
531 22
1000 27
8192 34
32767 38

2
Bất kỳ chữ số nào khác có thể được xoay ngoài 6/9?
frageum

Không (xem ví dụ)
anatolyg

Vì vậy, hai số 1 không thể được phủ lên để tạo số 7 sau đó
user253751

2
... và hai số không thể tạo thành số 8. Điều đó thật xấu xí.
anatolyg

Có lẽ là một câu hỏi khó xử, nhưng vì đây là những chữ số 'bìa cứng', chúng có thể được in hai mặt để tiết kiệm tổng số yêu cầu không? Trong ví dụ, bạn sẽ không bao giờ cần 6 và 0 cùng nhau.
Weckar E.

Câu trả lời:


16

Thạch , 9 byte

‘ḶDœ|/ḟ9L

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

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

‘ḶDœ|/ḟ9L
‘Ḷ         [0,1,...,n]
  D        convert each to list of its digits
   œ|/     fold by multiset union
      ḟ9   remove 9
        L  length

14
Quá nhanh>. <Tôi thề, bạn có câu trả lời Jelly cho mọi thử thách đã biết trong vũ trụ và bạn chỉ cần có một bot để đăng chúng ngay sau thử thách. : P Câu trả lời hay.
HyperNeutrino

10
@HyperNeutrino Tôi nghĩ rằng bot trích xuất các thử nghiệm từ thử thách và thử mọi chương trình thạch có thể bằng siêu máy tính.
NieDzejkob

1
@HyperNeutrino Bạn biết cảm giác ... đặc biệt nếu giải pháp của bạn là 0rDŒr€ẎQṪÞẎḟ9ĠẎL.
Erik the Outgolfer

Tôi nghi ngờ tính hợp lệ của ḟ9 một lúc, sau đó tôi nhận ra 6 <9 nên số lượng 6s không thể ít hơn tổng số 6s và 9 có thể kết hợp trong mỗi kết hợp.
Nader Ghanbari

7

Python 2 , 49 byte

lambda n:9*len(`n`)-9+(n*9+8)/10**len(`n`)+(n<10)

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

Một công thức số học vụng về. Giả sử nphù hợp với một intcái sao cho Lkhông được nối thêm.

Cảm ơn Neil vì đã tiết kiệm 5 byte bằng cách chỉ ra rằng 9 không được sử dụng có thể được xử lý bằng cách thực hiện n*9+8thay vì n*9+9, do đó, giả sử, 999*9+8=8999không chuyển sang 9000.


@ovs Điều đó không hoàn toàn hiệu quả, không đủ để biết chữ số đầu tiên. Ví dụ 33333yêu cầu năm 3 giây nhưng 22222chỉ yêu cầu bốn. n*9[0] rất hấp dẫn, nhưng thất bại đối với những con số bắt đầu bằng 1và ít hơn thế 111...
xnor

Theo tính toán của tôi (xem câu trả lời hàng loạt của tôi), bạn có thể sử dụng (n*9+8)/10**len(`n`)để tránh sử dụng min.
Neil

7

Haskell , 117 114 108 95 89 88 87 84 82 63 byte

6 byte được lưu nhờ Laikoni

1 4 6 byte được lưu nhờ vào nimi

g x=sum[maximum[sum[1|u<-show y,d==u]|y<-[0..x]]|d<-['0'..'8']]

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


3
1.) maximum[a,b]giống như max a b. 2.) Danh sách hiểu được thường ngắn hơn filter:max d$sum[1|x<-show a,x==b]
Laikoni

1
Bạn có thể thay thế gbằng một hàm pointfree bằng chữ : sum.(#[-9..]).
nimi

@nimi Tôi không biết chức năng nghĩa đen là gì, nhưng tôi nghĩ tôi thấy những gì bạn đang đề xuất. Nói cho tôi biết nếu tôi sai.
Phù thủy lúa mì

1
... và length[x|x<-...]sum[1|x<-...].
nimi

1
Các chức năng có thể không được đặt tên, vì vậy không cần g=(nhưng có lẽ bạn muốn đưa nó vào phiên bản TIO).
nimi

5

Toán học, 49 byte

Tr@Delete[Max~MapThread~DigitCount@Range[0,#],9]&

tốt đẹp! Đây có phải dựa trên câu trả lời của tôi?
J42161217

5

JavaScript (ES6), 60 53 byte

f=(n,i=9)=>n>(i%9+1+"e"+(i/9|0))/9-1?1+f(n,-~i):n>9^1

Một loại giải pháp đệ quy hacky. Điều này tạo ra các số yêu cầu thêm một chữ số:

1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 22, 33, 44, 55, 66, 77, 88, 100, 111, 222, ...

và sau đó đếm có bao nhiêu ít hơn đầu vào. Bằng một phép màu hạnh phúc, việc loại bỏ chữ số 9thực sự loại bỏ một vài byte khỏi hàm, bởi vì chuỗi sau đó có thể được tạo ra như vậy (giả sử phân chia số nguyên):

1e1 / 9 = 1, 2e1 / 9 = 2, ..., 8e1 / 9 = 8, 9e1 / 9 = 10, 1e2 / 9 = 11, 2e2 / 9 = 22, ...

Chúng ta phải tính đến thực tế là các số dưới 10 vẫn yêu cầu số 0, nhưng điều này đơn giản như việc thêm n > 9 ? 0 : 1vào kết quả.

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


n>9^1có thể có thển<10
CalculatorFeline

@CalculatorFeline Vâng, điều đó mang lại truecho đầu vào 0, vì vậy tôi hơi do dự khi làm điều đó.
Sản phẩm ETH

0>9là sai, false^1là 1 ...?
Máy

@CalculatorFeline Vâng, tôi đang nói rằng tôi do dự khi đưa ra boolean truethay cho số 1.
Sản xuất ETH

4

Mẻ, 67 byte

@if %1 geq 10%2 %0 %1 0%2 -~%3
@cmd/cset/a(%1*9+8)/10%2+9*%30+!%30

Trong công thức chuẩn của vấn đề này, bạn cần có các chữ số 69chữ số riêng biệt , nhưng bạn không bắt buộc phải hiển thị 0. Khi giá trị tối đa được nyêu cầu tăng lên, số lượng chữ số được yêu cầu tăng lên mỗi khi bạn đạt được một chữ số (vì bạn không có đủ số đó) và mỗi khi bạn đạt đến một số lũy thừa 10(khi bạn cần thêm 0). Tổng cộng mỗi sức mạnh của 10nhu cầu 10nhiều hơn số trước đó, có thể được nhân như là floor(log10(n))*10. Đối với các giá trị ngiữa các lũy thừa là 10, số lượng chữ số trung gian sau đó có thể được tính bằng floor(n/((10**floor(log10(n))*10-1)/9))hoặc thay thế floor(n*9/(10**floor(log10(n))*10-1)).

Tôi tính toán floor(log10(n))bằng các vòng lặp trên dòng đầu tiên. Mỗi lần, %2kiếm thêm 0%3kiếm thêm -~. Điều này có nghĩa 10%2là đã 10*10**floor(log10(n))%30đang floor(log10(n)).

Sự trùng lặp 69có hai hiệu ứng: thứ nhất, chỉ có các 9chữ số cần thiết cho mỗi sức mạnh 10và thứ hai là phát hiện chữ số cần bỏ qua các 9chữ số. May mắn thay vì chúng là một ít hơn 10 sức mạnh, điều này có thể đạt được bằng cách điều chỉnh công thức để tạo ra kết quả floor((n*9+8)/(10**floor(log10(n))*10)).

Đối phó với số 0 rất đơn giản: điều này chỉ cần thêm một chữ số khi n<10, tức là floor(log10(n))==0.


2

Toán học, 83 byte

v=DigitCount;s=v@0;(Table[s[[i]]=v[j][[i]]~Max~s[[i]],{i,10},{j,#}];s[[9]]=0;Tr@s)&


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.