Tất cả các số phù hợp trong một chuỗi


12

Viết chương trình hoặc hàm lấy số nguyên dương N. Xuất ra danh sách tất cả các số thập phân riêng biệt có thể được viết bằng chính xác N ký tự bằng chữ số ( 0123456789), dấu thập phân ( .) và dấu âm ( -).

Ví dụ, một số con số đó sẽ là trong danh sách đầu ra N = 4 là 1337, 3.14, .999, -789, -2.7, và -.09.

Các con số sẽ được viết theo cách thông thường, nhưng càng ngắn càng tốt . Điều này có nghĩa là:

  • Chỉ nên đưa vào dấu thập phân nếu số đó không phải là số nguyên.

    • ví dụ 45.045.nên được viết là đơn giản45
    • -45.00 nên được viết là -45
  • Không nên có các số 0 đứng đầu bên trái dấu thập phân.

    • 03003nên được viết như 3, nhưng 30300tốt như họ
    • 0.300.3nên được viết như chỉ.3
    • -03 nên được viết là -3
    • -0.3 nên được viết là -.3
  • Không nên có các số 0 ở bên phải dấu thập phân

    • .50.500nên được viết là.5
    • 900.090 nên được viết là 900.09
  • Ngoại lệ của hai quy tắc cuối cùng là chính nó, nên luôn luôn được viết dưới dạng đơn giản0 .

  • Dấu hiệu tích cực ( +) không nên được sử dụng vì chúng kéo dài số không cần thiết.

Cũng lưu ý rằng dấu âm ( -) không nên được sử dụng làm dấu trừ. Nó chỉ nên xuất hiện dưới dạng ký tự đầu tiên của các số nhỏ hơn 0.

Định dạng

Thứ tự của danh sách đầu ra của các số không quan trọng. Nó có thể tăng dần, giảm dần hoặc trộn lẫn hoàn toàn. Nó chỉ là vấn đề mà tất cả các số riêng biệt có thể được viết bằng N ký tự đều có mặt.

Danh sách có thể được định dạng một cách hợp lý, sử dụng khoảng trắng, dòng mới, dấu phẩy hoặc có lẽ một cái gì đó khác giữa các số, miễn là mọi thứ đều nhất quán. Dấu ngoặc đứng và dấu (hoặc tương tự) là ổn nhưng những thứ như dấu ngoặc kép quanh số thì không. (tức là không trộn lẫn rõ ràng các chuỗi và ints / float trong đầu ra.)

Ví dụ: khi N = 1, một số đầu ra hợp lệ sẽ là:

0 1 2 3 4 5 6 7 8 9
[1, 2, 3, 4, 5, 6, 7, 9, 0]
ans = { 5 8 9 1 3 2 0 3 4 7 6 }

Nhưng điều này sẽ không hợp lệ:

[0, 1, 2, 3, 4, "5", "6", "7", "8", "9"]

Ví dụ

N = 1 -> 0 1 2 3 4 5 6 7 8 9

N = 2 -> -9 -8 -7 -6 -5 -4 -3 -2 -1 .1 .2 .3 .4 .5 .6 .7 .8 .9 10 11 12 ... 97 98 99

N = 3 -> -99 -98 ... -11 -10 -.9 -.8 ... -.2 -.1 .01 .02 ... .98 .99 1.1 1.2 ... 1.9 2.1 2.2 ... 2.9 3.1 ...... 9.9 100 101 ... 998 999

Danh sách theo thứ tự tăng dần, được elip hóa ở một số nơi để đọc thuận tiện.

Chấm điểm

Mã ngắn nhất tính bằng byte thắng. Trong trường hợp quan hệ, câu trả lời được bình chọn cao hơn sẽ thắng


Có nên -0đầu ra hợp lệ?
Doorknob

@DoorknobAlso note that the negative sign (-) should not be used as a subtraction sign. It should only appear as the first character of numbers less than zero.
Mego

@Mego Có. Là số 0 âm khác với số 0?
Doorknob

@Doorknob Có bằng 0 không?
Mego

@Doorknob Không. Những gì Mego nói, và cũng "luôn luôn nên được viết là đơn giản 0".
Sở thích của Calvin

Câu trả lời:


2

Bình thường, 47 45 byte

Nhờ FryAmTheEggman cho lưu ý rằng thứ tự không quan trọng.

jf!sm:Td)c".- \..*\. ^-?0. [.-]0*$"d^{`c_T17Q

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

Thời gian chạy là khủng khiếp, về cơ bản là O (12 n ), nhưng tôi đã thử nghiệm nó cho n= 6 trên máy tính của tôi (mất 2 phút). Chạy n5 sẽ hết giờ trực tuyến.

Do cách tôi tạo các ký tự 0123456789.-, đầu ra theo một thứ tự thực sự kỳ lạ.

Về mặt kỹ thuật, người ta có thể loại bỏ {gần cuối, nhưng nó sẽ dẫn đến sự phức tạp của O (19 n ). (Nó cũng sẽ tạo ra nhiều bản sao, nhưng điều đó được cho phép.)

Giải trình

                  _T       -10
                 c  17     -10 / 17 = -0.5882352941176471
                `          representation: "-0.5882352941176471"
               {           uniquify: "-0.582394176"
              ^       Q    input'th Cartesian power
 f                         filter on:
         c"…"d               split this string by spaces
    m:Td)                    check if the parts match the current string
  !s                         true if none of the parts matched
j                            join by newlines

Phần chính của mã là ".- \..*\. ^-?0. [.-]0*$", chứa các biểu thức chính mà bất kỳ đầu ra nào cũng không được khớp.

.-         minus must be first character
\..*\.     there may only be one decimal point
^-?0.      no extra leading zeroes
[.-]0*$    number must not end with decimal/minus and 0+ zeroes

3

Bình thường, 57 byte

j-f:T"^0$|^-?([1-9]\d*)?(\.\d*[1-9])?$"0{.P*Q+jkUT".-"Q\-

Hãy thử nó trên trình thông dịch trực tuyến .

Quá lâu và với thời gian chạy khủng khiếp (mất vài giây cho N = 4, không nên chạy với N = 5).

            .P           Q    all permutations of length (input) of
                 jkUT         ... the string "0123456789"
                +    ".-"     ... plus the chars "." and "-"
              *Q              ... whole thing times the input -- pyth has
                              no repeated_permutation, so this is necessary
           {                  uniquify
  f                           filter by
   :T"..."0                   does it match the really long regex?
 -                        \-  get rid of "-"
j                             join on newline

Regex giải thích:

^0$|            "0", or...
^
 -?             optional negative sign
 ([1-9]\d*)?    optional part-before-decimal
 (\.\d*[1-9])?  optional part-after-decimal
$

1
Không phải là một môn đánh gôn, nhưng tôi nghĩ bạn có thể đặt điều đó *Qvào sự hoán vị của mình trước khi +nó chỉ ảnh hưởng đến các chữ số, điều này sẽ cải thiện hiệu suất khá nhiều. Nó thậm chí có thể giúp lưu một số byte trong regex?
FryAmTheEggman

2

Julia, 126 117 byte

n->filter(i->ismatch(r"^0$|^-?([1-9]\d*)?(\.\d*[1-9])?$",i)&&i!="-",∪(map(join,combinations((".-"join(0:9))^n,n))))

Đây là hàm lambda chấp nhận một số nguyên và trả về một chuỗi các chuỗi. Để gọi nó, gán nó cho một biến. Cách tiếp cận ở đây giống như câu trả lời Pyth của Doorknob .

Ung dung:

function g(n::Int)
    # Get all n-character combinations of .-0123456789
    c = combinations((".-"join(0:9))^n, n)

    # Join each group of n characters into a string and take unique
    u = ∪(map(join, c))

    # Filter to only appropriately formatted strings
    filter(i -> ismatch(r"^0$|^-?([1-9]\d*)?(\.\d*[1-9])?$", i) && i != "-", u)
end

1

TOÁN , 60 byte

45:57iZ^!"@!'^(-?(([1-9]\d*)|([1-9]\d*)?(\.\d*[1-9]))|0)$'XX

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

Điều này sử dụng lực siêu mạnh (thông qua sức mạnh của Cartesian) sau đó là lọc (thông qua một biểu thức chính quy). Tôi sẽ thêm một lời giải thích sau.

Kết quả được hiển thị ở cuối chương trình. Việc này có thể mất một lúc. Nếu bạn muốn xem kết quả khi chúng được tạo, hãy thêm Dvào cuối :

45:57iZ^!"@!'^(-?(([1-9]\d*)|([1-9]\d*)?(\.\d*[1-9]))|0)$'XXD
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.