Все числа, которые вписываются в строку


12

Напишите программу или функцию, которая принимает положительное целое число N. Выведите список всех различных десятичных чисел, которые можно записать ровно в N символах, используя digits ( 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 символов.

Список может быть отформатирован разумным способом, используя пробелы, символы новой строки, запятые или, возможно, что-то еще между числами, если все согласовано. Начальные и конечные скобки (или аналогичные) в порядке, но такие вещи, как кавычки вокруг чисел, - нет. (т.е. не путайте видимые строки и целые / плавающие числа в выводе.)

Например, когда 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

@ Да, да. Отличен ли отрицательный ноль от нуля?
Дверная ручка

@ Doorknob Ноль меньше нуля?
Mego

@ 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 дверной ручки в ответ .

Ungolfed:

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.