Листифицировать число

19

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

Примеры

0[[0]]

123[[1,2,3]]

-123[[],[1,2,3]]

123.45[[1,2,3],[4,5]]

0.45[[0],[4,5]]

-0.45[[],[0],[4,5]]

-123.45[[],[1,2,3],[4,5]]

Адам
источник
Разрешено ли использовать цифры в массиве как строки из одного символа?
Дзайма
@dzaima Нет. Я добавлю это.
Адам
можно ли взять число в виде строки?
Уриэль
@Uriel Если вы получаете информацию от STDIN, тогда да (разницы нет). Если в качестве аргумента, нет, я думаю. Какой бы ни был мета-консенсус.
Адам
2
@Quelklef Да, на самом деле. Это было результатом долгого обсуждения дизайна, которое вы можете увидеть здесь о l(listify) команде совершенно нечеловеческого языка WIP, Intrnt .
Адам

Ответы:

7

C #, 60 66 байт

using System.Linq;s=>s.Split('-','.').Select(p=>p.Select(c=>c-48))

Попробуйте онлайн!

TheLethalCoder
источник
Нет видимых внешних скобок. Ваши результаты на самом деле списки?
Адам
@ Adám Да ( IEnumerable<char[]>) просто код печати не добавляет их.
TheLethalCoder
@TheLethalCoder Требования требуют, чтобы требуемый тип возвращаемого значения представлял собой список цифр в виде чисел, а не строки или символы, отображающие эти числа.
Камиль Дракари
@KamilDrakari Ой не видел, чтобы спецификация была обновлена ​​...
TheLethalCoder
@KamilDrakari Исправлено, спасибо, что сообщили мне об обновлении.
TheLethalCoder
7

JavaScript (ES6), 33 44 43 41 байт

Принимает ввод в виде строки. Пожертвовано 11 10 байт, преобразовывающих элементы в выходных данных в числа после обновления спецификации вызова.

s=>s.split(/\D/).map(a=>[...a].map(eval))
  • Сохраненный БАЙТОМ благодаря Арно внушения «s использования eval.

Проверь это

console.log((
s=>s.split(/\D/).map(a=>[...a].map(eval))
)("-123.45"))


объяснение

s=>

Анонимная функция, принимающая строку в качестве аргумента через параметр s.
"-123.45"

s.split(/\D/)

Использование регулярных выражений для разбиения строки на массив на всех не цифровые символы - то есть, -и.
["","123","45"]

.map(a=>)

Отобразить массив, передав каждую строку функции через параметр a.

[...a]

Разделить на массив строк отдельных символов.
[[],["1","2","3"],["4","5"]]

.map(eval)

Сопоставьте подмассив и evalкаждую строку, которая преобразует его в целое число.
[[],[1,2,3],[4,5]]

мохнатый
источник
2D массив строк? Как выглядит JSON?
Адам
Цифры должны быть числами.
Адам
@ Adám: обновлено, стоимостью 11 байт.
Лохматый
5

Желе ,  13  10 байт

ŒṘµ<”/œpV€

Монадическая ссылка, принимающая число и возвращающая итоговый список списков чисел.

Попробуйте онлайн! (нижний колонтитул просто печатает представление python, чтобы показать все действительные списки)
... или посмотреть набор тестов .

Как?

ŒṘµ<”/œpV€ - Link: number
ŒṘ         - Python representation (yields a string representation of the number)
  µ        - monadic chain separation (call that s)
    ”/     - literal '/' character
   <       - less than? (vectorises) ('.' and '-' are, digit characters are not)
      œp   - partition s at truthy indexes of the resulting list discarding the borders
        V€ - evaluate €ach (list of characters) as Jelly code (vectorises)
Джонатан Аллан
источник
И снова Желе лучше, чем 05AB1E!
Эрик Outgolfer
4

05AB1E , 12 11 байт

Спасибо Райли за сохранение байта. Код:

'-'.:'.¡εSï

Использует кодировку 05AB1E . Попробуйте онлайн!

Объяснение:

'-'.:            # Replace "-" by "."
     '.¡         # Split on "."
        ε        # Apply to each element..
         S       #   Split into a list of characters
          ï      #   Convert back to int
Аднан
источник
Вам технически нужно ï?
Волшебная урна осьминога
@MagicOctopusUrn OP сказалThe digits must be actual numbers, not strings.
dzaima
1
Обидно, подумал я: „-.S€¡за 6, но если они должны быть целыми ... неуверенными.
Волшебная Урна Осьминога
3

Python 2 , 59 байт

lambda a:[[]]*(a<0)+[map(int,n)for n in`abs(a)`.split('.')]

Попробуйте онлайн!

-5 байт от Фелипе Нарди Батиста

Mego
источник
в вашем третьем выводе [[[1, 2, 3], [4, 5]]]есть дополнительный внешний список
Фелипе Нарди Батиста,
исправлено и до сих пор используется 64-
Фелипе Нарди Батиста
1
вы можете получить до 59 байт, если вы измените свой внешний вид mapс помощью списка: link
Felipe Nardi Batista
2

На самом деле , 23 байта

'.@;)A$s⌠♂≈⌡M[[]]+@s~@t

Попробуйте онлайн!

Объяснение:

'.@;)A$s⌠♂≈⌡M[[]]+@s~@t
'.                       push "."
  @;)                    make a copy of the input and move it to the bottom of the stack
     A$s                 absolute value of input, stringify, split on periods
        ⌠♂≈⌡M            convert integer and fractional parts to lists of digits
             [[]]+       prepend an empty list
                  @s~    bitwise negation of sign of input (1 -> -2, 0 -> -1, -1 -> 0)
                     @t  elements in the list starting at that 0-based index (drops the leading empty list if the input was positive)
Mego
источник
2

SOGL V0.12 , 11 байт

Ζ-.ŗ .Θ⌡č¹r

Попробуй здесь!

Выводится на вершину стека (потому что SOGL преобразует его в многострочную строку, потому что это сделано для ascii-art). Чтобы просмотреть результат, посмотрите в консоли после `r`@10:(внешние скобки являются массивами стека) или просто добавьте οø∑после кода

Ζ-.ŗ         replace "-" with "."
     .Θ      split on "."s
       ⌡     for each
        č      chop into characters (casts to strings :/)
         ¹   wrap in array (this + for each is like map())
          r  reverse types, vectorizing
dzaima
источник
2

Japt (v2.0a0), 12 10 8 байт

Принимает ввод в виде строки.

q\D ®¬®n

Проверьте это ( -Qпометьте только для целей визуализации.)

  • 2 байта сохранены благодаря Джастину .
  • 2 байта сохранены благодаря ETH.

объяснение

Неявный ввод строки U.

q\D

Используйте RegEx для разбиения ( q) массива на все нецифровые символы.

®

Карта над массивом.

¬

Разделите каждую строку на массив отдельных символов.

®

Карта над массивом.

n

Преобразовать в целое число.

мохнатый
источник
2
Не могли бы вы разделить на \D, так как единственные не цифры будут .и -?
Джастин Маринер
Самое приятное, что вам даже не нужны /s :-)
ETHproductions
@ETHproductions: Это очень мило. Я думал, что мог бы опустить закрытие /, перейдя многострочно. Я никогда не думал пытаться опустить их обоих.
Лохматый
1

Октава , 54 байта

@(x)cellfun(@(c){c-48},strsplit(num2str(x),{'-' '.'}))

Анонимная функция, которая принимает число в качестве входных данных и создает массив ячеек числовых векторов.

Попробуйте онлайн!

объяснение

@(x)cellfun(@(c){c-48},strsplit(num2str(x),{'-' '.'}))

@(x)                                                    % Function with input x
                                num2str(x)              % Convert x to string
                       strsplit(          ,{'-' '.'})   % Split at '-' or '.'. Gives a
                                                        % cell array of substrings
    cellfun(          ,                               ) % To each substring apply
                                                        % the following function
            @(c){c-48}                                  % Subtract 48 from each char
                                                        % and pack into a cell
Луис Мендо
источник
1

C (gcc) , 170 164 152 146 144 байта

Должен быть в состоянии сыграть в гольф немного вниз ...

#define P printf
#define V *v[1]
main(c,v)char**v;{for(V^45?P("[[%c",V++):P("[[],[%c",V++,V++);V;V^46?P(",%c",V++):P("],[%c",V++,V++));P("]]");}

Попробуйте онлайн!

cleblanc
источник
Я думаю, что вы можете сэкономить несколько байтов, выполнив, #define P printf(а затем пропустив скобки в Pвызовах
Cyoce
1

Желе , 12 байт

ŒṘ⁾-.yṣ”.V€€

Попробуйте онлайн!

Эрик Outgolfer
источник
Да, я тоже пробовал, в настоящее время у меня есть только 13 (я опубликую это, но думаю, что должно быть в состоянии быть короче) 0.45возвращается [[],[4,5]вместо [[0],[4,5]](это сталкивается с -45)
Джонатан Аллан
@JonathanAllan Да, конечно ... не знаете, откуда я это взял? Ой, подождите, это ! Исправление ... хорошо исправлено. Кто бы мог ожидать, что Jelly будет анализировать 0и .45по 0.45отдельности ... и выводить его тоже.
Эрик Outgolfer
1

На самом деле , 16 байтов

$'.'-(Æ'.@s⌠♂≈⌡M

Попробуйте онлайн!

Объяснение:

$'.'-(Æ'.@s⌠♂≈⌡M Implicit eval'd input
$                Convert to str
 '.              Push '.'
   '-            Push '-'
     (           Rotate stack left
      Æ          Pop a, b, c; push c.replace(b, a)
       '.        Push '.'
         @       Pop a, b; push b, a (swap)
          ⌠♂≈⌡   Push function ♂≈
           ♂       Map
            ≈        Convert to int
              M  Map
Эрик Outgolfer
источник
1
Превзошел создателя, милая.
Захари
@ Zacharý Это просто вопрос выбора алгоритма.
Эрик Outgolfer
И ты
победишь
@ Zacharý Ну, дважды в этом вызове, чтобы быть справедливым ...
Эрик Outgolfer
1

R 51 47 72 байта

x=RG::s(strtoi(s(gsub('-','.',scan()),on='\\.')))
x[is.na(x)]=list(NULL)

Я люблю RG библиотеку.

Пришлось добавить 26 байтов, чтобы убедиться, что пустой список действительно пустой.

               gsub('-','.',scan())             # replace - with . in input; also converts to string
             s(                    ,on='\\.')   # split string on '.'
      strtoi(                                )  # convert to numeric
RG::s(                                        ) # convert to lists of digits

    x[is.na(x)]=list(NULL)                      # converts list of `NA` to empty list

Пример вывода:

> x=RG::s(strtoi(s(gsub('-','.',-123.45),on='\\.')))
> x[is.na(x)]=list(NULL)
> x
[[1]]
NULL

[[2]]
[1] 1 2 3

[[3]]
[1] 4 5
BLT
источник
ну что там numeric(0)за пустой числовой список или list()или NULL?
Джузеппе
Я сделал исправление, чтобы сделать это, NULLно теперь я уверен, что есть лучший способ сделать это. Может быть, я вернусь к этому.
BLT
1

Perl 5 , 56 54 + 1 (-p) = 55 байт

$_="[[$_]]";s/\D\K\./0./;s/\d(?=\d)/$&,/g;s/-|\./],[/g

Попробуйте онлайн!

Сохранено два байта из-за того, что Дом напомнил мне о $ &

Объяснение:

$_="[[$_]]";        # Add opening and closing to ends of strings
s/\D\K\./0./;       # handle the case of .45 or -.45 by inserting 0 before
                    # the decimal.  Otherwise, .45 & 45 would be ambiguous.
s/\d(?=\d)/$&,/g;   # Put a comma between numbers.
s/-|\./],[/g        # Turn - and . into separators between lists
Xcali
источник
Я немного поиграл с этим и обнаружил, что ломать его немного короче. Не уверены, что вы можете объединить это на основе моего, чтобы уменьшить ваши? 😊 Попробуйте онлайн!
Дом Гастингс
1
Использовал $ & от вашего. Я думаю, что теперь они в основном эквивалентны, за исключением того, что мой обрабатывает дело «.45» против «45».
Xcali
Аааа, да, пропустил это!
Дом Гастингс
1

Perl 6 , 23 байта

+«*.split(/\D/)».comb

Проверь это

расширенный

\            # numify each of the following (possibly in parallel)
*\             # WhateverCode lambda (this is the input)
.split(/\D/)\  # split on non-digits ( . and - )
».comb         # split each of those into individual characters

Обратите внимание, что …».combэто более высокий приоритет, чем+«…

Брэд Гилберт b2gills
источник
0

Perl 6 , 22 байта

{m:g/^\d*|\d+/».comb}

Попробуйте онлайн!

Элементы в возвращаемом списке являются строками, но, как обычно для Perl, они могут использоваться как числа и будут преобразованы неявно; они являются «фактическими числами» для всех практических целей. Чтобы заставить их быть числами в их наиболее непосредственном представлении, нужно только поставить префикс содержимого блока кода с «+« »для еще трех байтов.

Шон
источник
Задача конкретно гласит: « Цифры должны быть действительными числами, а не строками. », Так что, вероятно, следует включить.
Брэд Гилберт b2gills
0

РУБИН, 75 байт

->(x){(x<0?[[]]:[])+x.abs.to_s.split('.').map{|y|y.chars.map{|z|z.to_i}}}

Попробуйте онлайн!

Грегори
источник
1
Вы можете удалить все эти пробелы?
TheLethalCoder
Да, ты прав, готово!
Григорий
То же самое с некоторыми изменениями синтаксиса: попробуйте онлайн!(Кстати, если вы используете верхний и нижний колонтитулы на TIO, размер, отображаемый в правой части кода, будет фактическим размером решения.)
manatwork
Исправлено, спасибо за всю информацию.
Григорий
Вы можете поменять .map{z|z.to_i}на.map &:to_i
Cyoce