Укажіть число


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

@dzaima Ні. Я додам це.
Adám

чи можна число приймати як рядок?
Уріель

@Uriel Якщо ви отримуєте дані від STDIN, то так (різниці немає). Якщо як аргумент, ні, я думаю. Що б не було мета консенсусу.
Adám

2
@Quelklef Так, насправді. Це було результатом тривалої дизайнерської дискусії, яку ви можете побачити тут про команду l(listify) абсолютно нелюдської мови WIP, Intrnt .
Адам

Відповіді:


7

C #, 60 66 байт

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

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


Немає видимих ​​зовнішніх дужок. Чи є ваші результати насправді списками?
Адам

@ 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))
  • Збережено байт завдяки пропозиції Арнальда щодо використання eval.

Перевірте це

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


Пояснення

s=>

Анонімна функція, яка приймає рядок як аргумент через параметр s.
"-123.45"

s.split(/\D/)

Використовуйте RegEx, щоб розділити рядок на масив на всі нецифрові символи - тобто, -і.
["","123","45"]

.map(a=>)

Мапа через масив, передаючи кожний рядок функції через параметр a.

[...a]

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

.map(eval)

Мапа через підмагістраль та evalкожен рядок, який перетворює його на ціле число.
[[],[1,2,3],[4,5]]


2D масив рядків? Як виглядає JSON?
Адам

Цифри повинні бути числами.
Adám

@ Adám: оновлено, вартістю 11 байт.
Кудлатий


5

Желе ,  13  10 байт

ŒṘµ<”/œpV€

Монадійне посилання, що приймає число і повертає отриманий список списків чисел.

Спробуйте в Інтернеті! (колонтитул просто роздруковує зображення пітона, щоб показати всі фактичні списки)
... або переглянути тестовий набір .

Як?

ŒṘµ<”/œ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!
Ерік Аутгольфер

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, але якщо вони повинні бути ints ... не впевнені.
Magic Octopus Urn

3

Python 2 , 59 байт

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

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

-5 байт від Felipe Nardi Batista


у вашому третьому виході [[[1, 2, 3], [4, 5]]]є додатковий зовнішній список
Феліпе Нарді Батіста,

виправлено і досі використовує 64-байтне посилання
Феліпе Нарді Батіста

1
Ви можете дістатися до 59 байт, якщо змінити зовнішній вигляд mapіз розумінням списку: посилання
Феліпе Нарді Батіста

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)

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

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: Тепер це дуже солодко. Я подумав, що міг би пропустити закриття /, пройшовши багаторядкові лінії . Я ніколи не думав намагатися опустити обох.
Shaggy

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("]]");}

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


Я думаю, ви можете зберегти кілька байтів, виконавши, #define P printf(а потім опустивши дужки в Pдзвінках
Cyoce

1

Желе , 12 байт

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

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


Так, я теж спробував це, на даний момент я отримав лише 13 (я опублікую це, але думаю, що це повинно бути в змозі бути коротшим) 0.45повернення [[],[4,5]замість [[0],[4,5]](зіткнеться -45)
Джонатан Аллан

@JonathanAllan О так, справді ... не знаю, де я це взяв? О, чекай, це ! Виправлення ... добре виправлено. Хто б очікувати , що Jelly розбирає 0і .45по 0.45окремо ... і він , як вихід теж.
Ерік Аутгольфер

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

1
Випередив творця, приємно.
Zacharý

@ Zacharý Це лише питання вибору алгоритму.
Ерік Аутгольфер

І це Мего ти побив, а не Денніс звичайно :)
Zacharý

@ Zacharý Що ж, двічі в цьому виклику бути справедливим ...
Ерік Переможник

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

ну, 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

Я трохи пограв з цим і виявив, що його руйнування буде трохи коротшим. Не знаєте, чи можете ви комбінувати його на основі моїх, щоб зменшити ваші? 😊 Спробуйте в Інтернеті!
Дом Гастінгс

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це більший пріоритет ніж+«…





0

Perl 6 , 22 байти

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

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

Елементи у поверненому списку - це рядки, але як це нормально для Perl, вони можуть використовуватися як числа і будуть перетворені неявно; вони "фактичні числа" для всіх практичних цілей. Щоб змусити їх бути числами в їх найближчому поданні, потрібно лише префіксувати вміст блоку коду "+" "ще на три байти.


У виклику конкретно сказано: " Цифри повинні бути фактичними числами, а не рядками. ", Тому, ймовірно, слід включити.
Бред Гілберт b2gills

0

RUBY, 75 байт

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

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


1
Чи можете ви видалити все це пробіл?
TheLethalCoder

Так, ви маєте рацію, зробили!
Григорій

Те саме з деякими синтаксичними налаштуваннями: спробуйте в Інтернеті! (BTW, якщо ви використовуєте Header and Footer в TIO, розмір, відображений у правій частині коду, буде фактичним розміром рішення.)
manatwork

Виправлено, спасибі за всі відомості.
Григорій

Ви можете поміняти .map{z|z.to_i}на.map &:to_i
Cyoce
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.