Wszystkie liczby pasujące do ciągu

12

Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą N. Wydrukuj listę wszystkich wyraźnych liczb dziesiętnych, które można zapisać dokładnie w N znakach, używając cyfr ( 0123456789), miejsc dziesiętnych ( .) i znaków ujemnych ( -).

Na przykład, niektóre numery, które znajdować się na liście wyjściowej n = 4 to 1337, 3.14, .999, -789, -2.7, i -.09.

Liczby należy zapisywać w normalny sposób, ale w możliwie najkrótszej formie . To znaczy:

  • Kropkę dziesiętną należy podać tylko wtedy, gdy liczba nie jest liczbą całkowitą.

    • np. 45.0i 45.powinny być napisane jako proste45
    • -45.00 należy zapisać jako -45
  • Po lewej stronie przecinka dziesiętnego nie powinno być żadnych zer wiodących.

    • 03i 003powinny być napisane jako 3, ale 30i 300są w porządku, jakimi są
    • 0.3i 00.3powinny być napisane jako sprawiedliwe.3
    • -03 należy zapisać jako -3
    • -0.3 należy zapisać jako -.3
  • Po prawej stronie przecinka dziesiętnego nie powinno być żadnych zer końcowych

    • .50i .500powinny być zapisane jako.5
    • 900.090 należy zapisać jako 900.09
  • Wyjątkiem od dwóch ostatnich reguł jest samo zero, które zawsze należy pisać jako zwykłe0 .

  • Znaków dodatnich ( +) nie należy używać, ponieważ niepotrzebnie wydłużają liczbę.

Zauważ również, że znak ujemny ( -) nie powinien być używany jako znak odejmowania. Powinien pojawiać się tylko jako pierwszy znak liczb mniejszych od zera.

Formatowanie

Kolejność wyjściowej listy liczb nie ma znaczenia. Może to być rosnąco, malejąco lub całkowicie pomieszane. Ważne jest tylko to, że obecne są wszystkie różne liczby, które można zapisać w N znakach.

Listę można sformatować w rozsądny sposób, używając spacji, znaków nowej linii, przecinków lub czegoś innego między liczbami, o ile są spójne. Wiodące i końcowe nawiasy kwadratowe (lub podobne) są w porządku, ale rzeczy takie jak cudzysłowy wokół liczb nie są. (tzn. nie mieszaj widocznie ciągów znaków i liczb całkowitych / zmiennoprzecinkowych na wyjściu.)

Na przykład, gdy N = 1, niektóre prawidłowe dane wyjściowe to:

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 }

Ale byłoby to nieprawidłowe:

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

Przykłady

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

Listy są w porządku rosnącym, w niektórych miejscach są elipsowane dla wygody czytania.

Punktacja

Najkrótszy kod w bajtach wygrywa. W przypadku remisu wygrywa wyższa głosowana odpowiedź

Hobby Calvina
źródło
Czy powinno -0być prawidłowe wyjście?
Klamka
@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 Tak. Czy zero ujemne różni się od zera?
Klamka
@Doorknob Czy zero jest mniejsze niż zero?
Mego
@Doorknob Nie. To, co powiedział Mego, a także „[zero] zawsze powinno być zapisane jako zwykłe 0”.
Calvin's Hobbies

Odpowiedzi:

2

Pyth, 47 45 bajtów

Dziękujemy FryAmTheEggman za zauważenie, że kolejność nie ma znaczenia.

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

Wypróbuj online.

Środowisko wykonawcze jest okropne, w zasadzie O (12 n ), ale przetestowałem go na n= 6 na moim komputerze (co zajęło 2 minuty). Uruchamianie n≥ 5 będzie limit czasu w Internecie.

Ze względu na sposób, w jaki generuję znaki, 0123456789.-wyniki są naprawdę dziwne.

Można technicznie usunąć {koniec, ale spowodowałoby to złożoność O (19 n ). (Spowodowałoby to również powstanie wielu duplikatów, ale jest to dozwolone).

Wyjaśnienie

                  _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

Główna część kodu ".- \..*\. ^-?0. [.-]0*$"zawiera wyrażenia regularne, których nie można dopasować do żadnego wyniku .

.-         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
PurkkaKoodari
źródło
3

Pyth, 57 bajtów

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

Wypróbuj go w tłumaczu online .

Zbyt długo i przy przerażającym środowisku uruchomieniowym (dla N = 4 trwa kilka sekund, nie zaleca się uruchamiania z 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

Wyjaśnienie Regex:

^0$|            "0", or...
^
 -?             optional negative sign
 ([1-9]\d*)?    optional part-before-decimal
 (\.\d*[1-9])?  optional part-after-decimal
$
Klamka
źródło
1
Nie jest to golf, ale myślę, że możesz włożyć *Qcoś do robienia permutacji przed, +więc wpływa to tylko na cyfry, to powinno nieco poprawić wydajność. Może nawet pomóc zaoszczędzić niektóre bajty w wyrażeniu regularnym?
FryAmTheEggman
2

Julia, 126 117 bajtów

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

Jest to funkcja lambda, która przyjmuje liczbę całkowitą i zwraca tablicę ciągów. Aby go wywołać, przypisz go do zmiennej. Podejście tutaj jest takie samo jak odpowiedź Pyth Doorknob .

Nie golfowany:

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
Alex A.
źródło
1

MATL , 60 bajtów

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

Wypróbuj online!

Wykorzystuje to super brutalną siłę (poprzez siłę kartezjańską), a następnie filtruje (poprzez wyrażenie regularne). Wyjaśnię później.

Wyniki są wyświetlane na końcu programu. To może zająć chwilę. Jeśli chcesz zobaczyć wyniki podczas ich generowania, dodaj Dna końcu :

45:57iZ^!"@!'^(-?(([1-9]\d*)|([1-9]\d*)?(\.\d*[1-9]))|0)$'XXD
Luis Mendo
źródło