Усі числа, що вміщуються в рядок


12

Напишіть програму або функцію, яка має додатне ціле число N. Виведіть список усіх різних десяткових чисел, які можна записати рівно N символів за допомогою цифр ( 0123456789), десяткових знаків ( .) та від’ємних знаків ( -).

Наприклад, деякі номери , які були б у вихідному списку N = 4 представляють собою 1337, 3.14, .999, -789, -2.7, і -.09.

Цифри слід писати звичайним способом, але в максимально стислій формі . Це означає:

  • Десяткова крапка повинна бути включена, лише якщо число не є цілим числом.

    • наприклад, 45.0і 45.слід писати як просте45
    • -45.00 слід писати як -45
  • Ліворуч від десяткової крапки не повинно бути провідних нулів.

    • 03і 003слід писати як 3, але 30і 300добре, як є
    • 0.3і 00.3слід писати так само.3
    • -03 слід писати як -3
    • -0.3 слід писати як -.3
  • Праворуч від десяткової крапки не повинно бути ніяких кінцевих нулів

    • .50і .500слід писати як.5
    • 900.090 слід писати як 900.09
  • Виняток із двох останніх правил - це сам нуль, який завжди0 повинен бути записаний як звичайний .

  • Позитивні знаки ( +) не слід використовувати, оскільки вони надмірно подовжують число.

Також зауважте, що негативний знак ( -) не повинен використовуватися як знак віднімання. Він повинен відображатися лише як перший символ чисел, менших від нуля.

Форматування

Порядок вихідного списку чисел не має значення. Це може бути висхідний, низхідний або повністю змішаний. Важливо лише те, що всі чіткі числа, які можна записати в N символів, присутні.

Список можна відформатувати розумним способом, використовуючи пробіли, нові рядки, коми або, можливо, щось інше між номерами, доки речі послідовні. Провідні та кінцеві дужки (або подібні) добре, але такі речі, як цитати навколо цифр, не є. (тобто помітно не змішуйте рядки та ints / floats у висновку.)

Наприклад, коли N = 1, деякими дійсними результатами будуть:

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 }

Але це буде недійсним:

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

Приклади

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

Списки складаються у порядку зростання, десь еліпсизовані для зручності читання.

Оцінка балів

Виграє найкоротший код у байтах. У разі зв’язків виграє вища відповідь, що вища


Чи повинен -0бути дійсний вихід?
Дверна ручка

@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 Так. Чи відрізняється від нуля від’ємний нуль?
Дверна ручка

@Doorknob Чи дорівнює нулю менше нуля?
Мего

@Doorknob Ні. Що Мего сказав, а також "[нуль] завжди слід писати як звичайне 0".
Захоплення Кальвіна

Відповіді:


2

Pyth, 47 45 байт

Дякуємо FryAmTheEggman за те, що він не має значення.

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

Спробуйте в Інтернеті.

Час виконання жахливий, в основному O (12 n ), але я перевірив його на n= 6 на своєму комп’ютері (що займало 2 хвилини). Запуск n≥ 5 буде тайм - аут в Інтернеті.

Завдяки тому, як я генерую символи, 0123456789.-вихід у дійсно дивному порядку.

Технічно можна було б видалити {найближчий кінець, але це призвело б до складності O (19 n ). (Це також дасть багато копій, але це дозволено.)

Пояснення

                  _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

Основна частина коду - ".- \..*\. ^-?0. [.-]0*$"це регекси, які не повинні відповідати.

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

Pyth, 57 байт

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

Спробуйте це на онлайн-перекладачі .

Шлях занадто довгий і з жахливим часом виконання (займає кілька секунд протягом N = 4, біг з 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:

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

1
Це не гольф, але я думаю, що ви можете поставити *Qсвою перестановку перед тим, +щоб це впливало лише на цифри, це мало би покращити продуктивність. Це може навіть допомогти зберегти кілька байт у регулярному виразі?
FryAmTheEggman

2

Юлія, 126 117 байт

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

Це лямбда-функція, яка приймає ціле число і повертає масив рядків. Щоб викликати його, призначте його змінній. Підхід тут такий же, як і відповідь Pyth Doorknob .

Безголівки:

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

MATL , 60 байт

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

Спробуйте в Інтернеті!

Для цього застосовується надгруба сила (через декартову силу) з подальшим фільтруванням (через регулярний вираз). Я поясню пояснення пізніше.

Результати відображаються в кінці програми. Це може зайняти деякий час. Якщо ви хочете бачити результати, як вони створюються, додайте Dв кінці :

45:57iZ^!"@!'^(-?(([1-9]\d*)|([1-9]\d*)?(\.\d*[1-9]))|0)$'XXD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.