Bir numarayı listeleme


19

Gerçek bir sayı verildiğinde, negatif işaret (varsa) boş bir liste, tamsayı kısmı bir basamak listesi ve kesirli kısım (varsa) bir basamak listesi haline gelecek şekilde bir liste listesine dönüştürün. Rakamlar, dize değil gerçek sayı olmalıdır.

Örnekler

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


dizideki rakamların tek karakter dizesi olmasına izin verilir mi?
dzaima

@dzaima Hayır. Bunu ekleyeceğim.
Adam

sayı bir dize olarak alınabilir mi?
Uriel

@Uriel Eğer STDIN'den giriş alırsanız evet (fark yoktur). Eğer argüman olarak, hayır, sanırım. Meta mutabakatı ne olursa olsun.
Adam

2
@Quelklef Evet, aslında. Tamamen insanın WIP dilinin Intrnt (listify) komutu hakkında burada görebileceğiniz uzun bir tasarım tartışmasının sonucuydu . l
Adám

Yanıtlar:


7

C #, 60 66 bayt

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

Çevrimiçi deneyin!


Görünür dış parantez yoktur. Sonuçlarınız gerçekten listeler mi?
Adam

@ Adám Evet ( IEnumerable<char[]>) sadece baskı kodu onları
eklemiyor

@TheLethalCoder Gereksinimler, gerekli dönüş türünün, bu sayıları görüntüleyen dize veya karakter değil, sayı olarak rakamların bir listesi olduğunu belirtir.
Kamil Drakari

@KamilDrakari Oh spec güncellenmiş
görmedim

@KamilDrakari Düzeltildi, güncellemeyi bana bildirdiğiniz için teşekkürler.
TheLethalCoder

7

JavaScript (ES6), 33 44 43 41 bayt

Girişi dize olarak alır. Kurban 11 meydan spec sonra numaralara çıktı elemanlarını dönüştürme 10 bayt güncellendi.

s=>s.split(/\D/).map(a=>[...a].map(eval))

Dene

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


açıklama

s=>

Dizeyi parametre ile bağımsız değişken olarak alan anonim işlev s.
"-123.45"

s.split(/\D/)

Kullanım RegEx olmayan tüm haneli karakterlerin üzerinde bir diziye dize bölmek - yani -ve.
["","123","45"]

.map(a=>)

Her dizeyi parametre aracılığıyla bir işleve ileterek dizi üzerinden eşleyin a.

[...a]

Bireysel karakter dizelerinden oluşan bir diziye bölün.
[[],["1","2","3"],["4","5"]]

.map(eval)

Alt evaldiziyi ve onu bir tamsayıya dönüştüren her dizeyi eşleyin .
[[],[1,2,3],[4,5]]


2B dizeler dizisi? JSON nasıl görünüyor?
Adam

Rakamlar sayı olmalıdır.
Adam

@ Adám: 11 bayt maliyetle güncellendi.
Shaggy


5

Jöle ,  13  10 bayt

ŒṘµ<”/œpV€

Bir sayı alan ve ortaya çıkan sayı listelerini döndüren monadik bir bağlantı.

Çevrimiçi deneyin! (altbilgi yalnızca tüm gerçek listeleri göstermek için python temsilini yazdırır)
... veya test takımını görün .

Nasıl?

ŒṘµ<”/œ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)

Ve yine Jelly 05AB1E'den daha iyidir!
Outgolfer Erik

4

05AB1E , 12 11 bayt

Bayt kaydettiği için Riley'ye teşekkürler . Kod:

'-'.:'.¡εSï

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

'-'.:            # Replace "-" by "."
     '.¡         # Split on "."
        ε        # Apply to each element..
         S       #   Split into a list of characters
          ï      #   Convert back to int

Teknik olarak ihtiyacınız var ïmı?
Sihirli Ahtapot Urn

@MagicOctopusUrn OP dediThe digits must be actual numbers, not strings.
dzaima

1
Bu utanç verici, diye düşünüyordum: „-.S€¡6 için ama eğer ints olmaları gerekiyorsa ... emin değilim .
Sihirli Ahtapot Urn


2

Aslında 23 bayt

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

Çevrimiçi deneyin!

Açıklama:

'.@;)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 bayt

Ζ-.ŗ .Θ⌡č¹r

Buradan Deneyin!

Yığının en üstüne çıkar (çünkü SOGL onu çok satırlı bir dizeye dönüştürür, çünkü ascii-art için yapılmıştır). Sonucu görüntülemek için, konsola sonradan bakın `r`@10:(dış parantezler yığın dizileridir) veya οø∑koddan sonra ekleyin

Ζ-.ŗ         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 bayt

Girişi dize olarak alır.

q\D ®¬®n

Test edin ( -Qyalnızca görselleştirme amacıyla işaretleyin.)

  • Justin sayesinde 2 bayt kurtardı .
  • ETH sayesinde 2 bayt kaydedildi.

açıklama

Örtülü dize girdisi U.

q\D

Sayısal qolmayan tüm karakterler üzerinde bir diziye bölmek ( ) için RegEx kullanın .

®

Dizi üzerinde eşleyin.

¬

Her dizeyi tek tek karakter dizisine bölün.

®

Dizi üzerinde eşleyin.

n

Tamsayıya dönüştür.


2
Üzerinde bölünmüş Could \Dsadece sigara basamaklı olacağından, .ve -?
Justin Mariner

En iyi yanı, /s bile gerek yok :-)
ETHproductions

@ETHproductions: Şimdi, bu oldukça tatlı. Çok /satırlı olarak kapanmayı atlamış olabileceğimi düşündüm . İkisini de atlamayı denemedim.
Shaggy

1

Oktav , 54 bayt

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

Sayıyı girdi olarak alan ve sayısal vektörlerin hücre dizisini üreten anonim işlev.

Çevrimiçi deneyin!

açıklama

@(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 bayt

Bu biraz golf mümkün olmalıdır ...

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

Çevrimiçi deneyin!


Aramalarda #define P printf(parantez yaparak ve sonra atlayarak birkaç bayt tasarruf edebileceğinizi düşünüyorumP
Cyoce

1

Jöle , 12 bayt

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

Çevrimiçi deneyin!


Evet ben de denedim, şu anda sadece 13 var (bunu gönderirim ama daha kısa olabileceğini düşünürüm) 0.45dönüşler [[],[4,5]yerine [[0],[4,5]](çarpışır -45)
Jonathan Allan

@JonathanAllan Oh evet gerçekten ... bunu nereden bulduğumdan emin değil misiniz? Oh bekle, öyle ! Düzeltiliyor ... Tamam düzeltildi. Kim Jelly ayrıştırma beklenir 0ve .45bir 0.45ayrı ... ve o kadar sahip çok çıktı.
Outgolfer Erik

1

Aslında 16 bayt

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

Çevrimiçi deneyin!

Açıklama:

$'.'-(Æ'.@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
Yaratıcıyı aştı, güzel.
Zacharý

@ Zacharý Bu sadece bir algoritma seçimi meselesi.
Outgolfer Erik

Ve bu tabii ki Dennis değil, dövdü Mego :)
Zacharý

@ Zacharý Eh, bu meydan okumada iki kez adil olmak ...
Erik the Outgolfer

1

R, 51 47 72 bayt

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

RGKütüphaneyi çok seviyorum .

Boş listenin gerçekten boş olduğundan emin olmak için 26 bayt eklemek zorunda kaldım.

               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

Örnek çıktı:

> 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

kuyu, orada numeric(0)boş bir sayısal liste veya için list()ya NULL?
Giuseppe

Bunu yapmak için bir düzeltme yaptım NULLama şimdi eminim bunu yapmanın daha golfçü bir yolu var. Belki ona geri döneceğim.
BLT

1

Perl 5 , 56 54 + 1 (-p) = 55 bayt

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

Çevrimiçi deneyin!

Bana $ hakkında hatırlatan iki bayt kaydedildi &

Açıklama:

$_="[[$_]]";        # 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

Bununla küçük bir oyun vardı ve biraz daha kısa olması için onu kırma bulundu. Kendinizi küçültmek için benimkine göre birleştirip birleştiremeyeceğinizden emin değil misiniz? 😊 Çevrimiçi deneyin!
Dom Hastings

1
$ & Sizinkinden kullanılmış. Bence ikisinin temelde eşdeğer olduğunu düşünüyorum, ancak benimki “.45” ve “45” davasını ele alıyor.
Xcali

Ahhh, evet, bunu özledim!
Dom Hastings

1

Perl 6 , 23 bayt

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

Dene

Expanded

\            # 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

Bundan …».combdaha yüksek bir öncelik olduğunu unutmayın+«…





0

Perl 6 , 22 bayt

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

Çevrimiçi deneyin!

Döndürülen listedeki öğeler dizgidir, ancak Perl için normal olduğu gibi, sayı olarak kullanılabilirler ve örtük olarak dönüştürülürler; tüm pratik amaçlar için "gerçek sayılar" dır. Onları en yakın gösterimlerinde sayı olmaya zorlamak için, kod bloğunun içeriğine yalnızca üç bayt için "+« "öneki eklenmesi gerekir.


Zorluk özellikle “ Rakamlar, dizeler değil gerçek sayılar olmalıdır. ”, Bu yüzden muhtemelen dahil edilmelidir.
Brad Gilbert b2gills

0

YAKUT, 75 bayt

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

Çevrimiçi deneyin!


1
Tüm bu boşlukları kaldırabilir misiniz?
TheLethalCoder

Evet, haklısın, bitti!
Gregory

Bazı sözdizimi tweaks için aynı: Çevrimiçi deneyin! (BTW, TIO'da Üstbilgi ve Altbilgi kullanırsanız, Kod'un sağ tarafında görüntülenen boyut çözümün gerçek boyutu olacaktır.)
manatwork

Düzeltildi, tüm bilgiler için teşekkürler.
Gregory

Sen takas olabilir .map{z|z.to_i}için.map &:to_i
Cyoce
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.