Faça um conversor de lista numérica

20

Você não odeia quando deseja copiar e colar uma lista de números (vetor, matriz ...), de um programa para outro, mas o formato em que você tem os números não corresponde ao formato em que você precisa ?

Por exemplo, no MATLAB, você pode ter uma lista separada por espaços como esta:

[1 2 3 4 5]    (you can also have it comma separated, but that's not the point)

No Python, você precisará inserir vírgulas para tornar essa lista uma entrada válida; portanto, você precisará convertê-la para

[1, 2, 3, 4, 5]

para fazer funcionar. Em C ++, você pode querer algo como:

{16,2,77,29}

e assim por diante.

Para simplificar a vida de todos, vamos criar um conversor de lista, que pega uma lista em qualquer formato * e gera uma lista em outro formato especificado.

Os colchetes válidos são:

[list]
{list}
(list)
<list>
list      (no surrounding brackets)

Os delimitadores válidos são:

a,b,c
a;b;c
a b c
a,  b,  c       <-- Several spaces. Must only be supported as input.
a;     b; c     <-- Several spaces. Must only be supported as input.
a   b   c       <-- Several spaces. Must only be supported as input. 

Observe que a entrada pode ter qualquer número de espaços entre os números, mas a saída pode optar por ter zero espaços (se ,ou ;for usado como delimitador) ou um único espaço (se for delimitado por espaço).

Além da lista de entrada, haverá uma sequência (ou dois caracteres) que define o formato de saída. A cadeia de formato irá primeiro ser o tipo de suporte de abertura (apenas), [, (, <, {ou (o último é um único espaço utilizado quando não há nenhum suporte circundante). O tipo de colchete será seguido pelo tipo de delimitador ,, ;ou (o último é um espaço único). Os dois caracteres do formato de entrada devem ser tomados como um único argumento (sequência ou dois caracteres consecutivos) na ordem descrita acima.

Alguns exemplos de cadeias de formato:

[,    <-- Output format:   [a,b,c]
{;    <-- Output format:   {a;b;c}
      <-- Two spaces, output list has format:   a b c   

Regras:

  • A saída não pode ter espaços à esquerda
  • A saída pode ter espaços à direita e uma nova linha
    • A saída deve ser apenas a lista de números, não ans =ou similar
  • A entrada será uma lista de números inteiros ou decimais (positivos e negativos (e zero)) e uma sequência de dois caracteres
    • Se a entrada consistir apenas em números inteiros, a lista de saída deverá ter apenas números inteiros. Se a lista de entrada consistir em números inteiros e decimais, todos os números de saída poderão ser números decimais. (É opcional manter os números inteiros como números inteiros)
    • O número máximo de dígitos após o ponto decimal que deve ser suportado é 3.
    • A entrada será dois argumentos. Ou seja, os números estão em um argumento e a string de formato é um único argumento.
  • O código pode ser um programa ou função
  • A entrada pode ser argumento de função ou STDIN

Alguns exemplos:

1 2 3 4
[,
[1,2,3,4]

<1;  2;  3>
 ;    <-- Space + semicolon
1;2;3
not valid:  1.000;2.000;3.000   (Input is only integers => Output must be integers)

{-1.3, 3.4, 4, 5.55555555}
[,
[-1.300,3.400,4.000,5.556]  (5.555 is also valid. Rounding is optional)
also valid: [-1.3,3.4,4,5.55555555]

O código mais curto em bytes vence. Como sempre, o vencedor será selecionado uma semana a partir do dia em que o desafio foi lançado. As respostas postadas mais tarde ainda podem vencer se forem mais curtas que o vencedor atual.


Entre os melhores

O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

## Perl, 43 + 2 (-p flag) = 45 bytes

Você também pode transformar o nome do idioma em um link que será exibido no snippet:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

Stewie Griffin
fonte
O espaço em branco à direita e à esquerda é permitido?
overactor
@overactor, veja as duas primeiras regras. O espaço em branco à esquerda não está OK, o rastreio está OK.
Stewie Griffin
Podemos receber informações na ordem oposta? (delimitadores em primeiro lugar, lista em segundo)
Martin Ender
@ MartinBüttner, sim. Não está especificado que ele deve ser listado primeiro, então você pode escolher.
Stewie Griffin
J usa _para denotar elementos negativos. :(
Zgarb 11/12/2015

Respostas:

1

CJam, 27 bytes

l)l_5ms`-SerS%*\S-_o_'(#(f-

Experimente aqui.

Explicação

l      e# Read the format string.
)      e# Extract the separator.
l_     e# Read the list.
5ms`   e# Get a string that contains -.0123456789.
-      e# Get the characters in the list that are not in the string.
Ser    e# Replace those characters with spaces.
S%     e# Split by those characters, with duplicates removed.
*      e# Join with the separator.
\S-    e# Remove spaces (if any) from the left bracket.
_o     e# Output a copy of that character before the stack.
_'(#   e# Find '( in the left bracket string.
(      e# Get -1 if '( is the first character, and -2 if it doesn't exist.
f-     e# Subtract the number from every character in the left bracket string,
          making a right bracket.
jimmy23013
fonte
8

JavaScript (ES6), 75 82

Como uma função anônima

Edit: 2 bytes salvos thx @ user81655 (e mais 5 apenas analisando)

(l,[a,b])=>a.trim()+l.match(/[-\d.]+/g).join(b)+']})> '['[{(< '.indexOf(a)]

Snippet de teste

F=(l,[a,b])=>a.trim()+l.match(/[-\d.]+/g).join(b)+']})> '['[{(< '.indexOf(a)]

// Test
console.log=x=>O.innerHTML+=x+'\n'
// default test suite
t=[['1 2 3 4','[,'],['<1;  2;  3>',' ;'],['{-1.3, 3.4, 4, 5.55555555}','[,']]
t.forEach(t=>console.log(t[0]+' *'+t[1]+'* '+F(t[0],t[1])))
function test() { console.log(P1.value+' *'+P2.value+'* '+F(P1.value,P2.value)) }
#P1 { width: 10em }
#P2 { width: 2em }
P1<input id=P1>
P2<input id=P2>
<button onclick="test()">-></button>
<pre id=O></pre>

edc65
fonte
6

CJam, 35 34 bytes

l(S-l"{[<(,}]>);":BSerS%@*1$B5/~er

Teste aqui.

Espera o formato na primeira linha e a lista na segunda.

Explicação

l   e# Read the format line.
(   e# Pull off the first character, which is the opening bracket.
S-  e# Set complement with a space, which leaves brackets unchanged and turns a space
    e# into an empty string.
l   e# Read the list.
"{[<(,}]>);":B
    e# Push this string which contains all the characters in the list we want to ignore.
Ser e# Replace each occurrence of one of them with a space.
S%  e# Split the string around runs of spaces, to get the numbers.
@   e# Pull up the the delimiter string.
*   e# Join the numbers in the list with that character.
1$  e# Copy the opening bracket (which may be an empty string).
B5/ e# Push B again and split it into chunks of 5: ["{[<(," "}]>);"]
~   e# Unwrap the array to leave both chunks on the stack.
er  e# Use them for transliteration, to turn the opening bracket into a closing one.
Martin Ender
fonte
5

Pitão, 33 bytes

rjjezrXwJ"<>[]  {}(),;"d7@c6JChz6

Experimente on-line: Demonstration or Test Suite

Explicação:

J"<>[]  {}(),;"  assign this string to J

rjjezrXwJd7@c6JChz6   implicit: z = first input string, e.g. "[;"
       w              read another string from input (the list of numbers)
      X Jd            replace every char of ^ that appears in J with a space
     r    7           parse ^ (the string of numbers and spaces) into a list
  jez                 put z[1] (the separator symbol) between the numbers
            c6J       split J into 6 pieces ["<>", "[]", "  ", "{}", "()", ",;"]
               Chz    ASCII-value of z[0] (opening bracket symbol)
           @          take the correspondent (mod 6) brackets from the list
 j                    and put the numbers between these brackets
r                 7   remove leading and trailing spaces
Jakube
fonte
Você pode adicionar uma explicação de como isso funciona?
Shelvacu 12/12
1
@ Shel Aqui está você.
Jakube 12/12
5

PowerShell, 108 100 95 85 bytes

$i,$z=$args;($z[0]+($i-split'[^\d.-]+'-ne''-join$z[1])+' }) >]'[($z[0]-32)%6]).Trim()

(consulte o histórico de revisões para versões anteriores)

Golfou outros 15 bytes removendo $be $svariáveis ​​e alterando os parênteses na cadeia interna.

Isso recebe a entrada como duas strings e as armazena em , $ie $zentão construímos uma nova string de saída. O interno analisa -splits $icom um regex para selecionar apenas dígitos numéricos e, em seguida, -joinvolta com o delimitador solicitado. Concatenamos isso com o primeiro caractere da entrada do delimitador (por exemplo, [) e o fechamos com a indexação em uma string com base no valor ASCII do primeiro caractere e em alguns truques de formulação. O exterior .Trim()remove todos os espaços iniciais ou finais.

AdmBorkBork
fonte
Eu acho que você poderia substituir sua expressão de colchete "]})>"["[{(< ".IndexOf($b[0])]por algo assim ' }) >]'[($b[0]-32)%6]. A ($b[0]-32)%6dá-lhe 0,2,4,5,1para abrir personagens do suporte, que você pode usar para índice para a seqüência de colchete de fechamento ' }) >]'. Pode haver uma "fórmula" mais curta, mas isso parece bom o suficiente.
Danko Durbić
@ DankoDurbić Excelente! Eu estava tentando criar algumas matemáticas para selecionar o caractere de saída correto com base nos valores ASCII, mas não consegui encontrar a fórmula correta. Eu ficava tropeçando por ()estar um ao lado do outro, mas os outros colchetes têm um caractere entre eles, então fui com a indexação. Obrigado!
AdmBorkBork
Usando String.Replace()em vez do -replaceoperador iria comprar mais 2 bytes (sem necessidade de escapar ou definir uma classe de caráter com [])
Mathias R. Jessen
@ MathiasR.Jessen A menos que eu esteja perdendo alguma coisa aqui, o .Replace('[]{}()<>;,',' ')texto não capta caracteres individuais, mas tenta combinar o todo simbólico, que não existe. Nós precisaríamos usar o Regex.Replace , que envolve uma [regex]::chamada do .NET e, em vez disso, aumentaria o código.
AdmBorkBork
@TessellatingHeckler Thanks! Joguei outro byte usando em -ne''vez de |?{$_}.
AdmBorkBork
4

Python 2, 96 bytes

import re
lambda(a,(b,c)):(b+c.join(re.findall('[-\d\.]+',a))+'])>} '['[(<{ '.index(b)]).strip()

Ligue como:

f(('{-1.3, 3.4, ,4, 5.55555555}','[,'))

Saída:

[-1.3,3.4,4,5.55555555]
TFeld
fonte
2

JavaScript (ES6), 82 92 116 92 bytes

(a,b)=>(c=a.match(/-?\d+(\.\d+)?/g).join(b[1]),d=b[0],d<"'"?c:d+c+"]}>)"["[{<(".indexOf(d)])

Uma função anônima, execute-a assim

((a,b)=>(c=a.match(/-?\d+(\.\d+)?/g).join(b[1]),d=b[0],d<"'"?c:d+c+"]}>)"["[{<(".indexOf(d)]))("{1;  2;3;   4}","<;")

Provavelmente isso pode ser jogado muito longe ..

Ungolfed

(a,b)=>(                             // "{1;  2;3;   4}", "<;"
    c=a.match(/-?\d+(\.\d+)?/g)      // regex to match decimals
    .join(b[1]),                     // c -> "1;2;3;4"
    d=b[0],                          // d -> "<"
    d<"'" ?                          // if d is smaller than ' then ...
        c :                          // return just "1;2;3;4"
        d + c +                      // "<" + "1;2;3;4" + ...
        "]}>)" [ "[{<(".indexOf(d) ] // "]}>)"[2] -> ">"
)
Bassdrop Cumberwubwubwub
fonte
Eu acho que você tem que pegar um como uma string, não uma lista.
overactor
Totalmente mal interpretado isso: The input will be a list of integer or decimal numbers (both positive and negative (and zero)), and a string of two characters. Corrigido, obrigado
Bassdrop Cumberwubwubwub 11/11
2

Mathematica, 108 bytes

O Mathematica geralmente é desajeitado com entradas de string, a menos que a string seja interpretada como um texto.

c=Characters;t_~f~p_:=({b,s}=c@p;b<>Riffle[StringCases[t,NumberString],s]<>(b/.Thread[c@"[ {<(" -> c@"] }>)"]))

Explicação

StringCases[t,NumberString]retorna a lista de seqüências numéricas.

Riffleinsere os separadores entre os números.

/.Thread[c@"[ {<(" -> c@"] }>)"]) substitui o "suporte" esquerdo pelo suporte direito.

<>é a forma infix de StringJoin. Cola as substrings.

DavidC
fonte
2

Matlab, 85 bytes

@(s,x)[x(1) strjoin(regexp(s,'-?\d+\.?\d*','match'),x(2)) x(1)+(x(1)~=32)+(x(1)~=40)]

Exemplo de uso:

>> @(s,x)[x(1) strjoin(regexp(s,'-?\d+\.?\d*','match'),x(2)) x(1)+(x(1)~=32)+(x(1)~=40)]
ans = 
    @(s,x)[x(1),strjoin(regexp(s,'-?\d+\.?\d*','match'),x(2)),x(1)+(x(1)~=32)+(x(1)~=40)]

>> ans('1 2.4 -3 -444.555 5', '[,')
ans =
[1,2.4,-3,-444.555,5]
Luis Mendo
fonte
1

Julia, 95 bytes

f(l,s)=(x=s[1]<33?"":s[1:1])*join(matchall(r"[\d.-]+",l),s[2])*string(x>""?s[1]+(s[1]<41?1:2):x)

Esta é uma função f que aceita duas strings e retorna uma string.

Ungolfed:

function f{T<:AbstractString}(l::T, s::T)
    # Extract the numbers from the input list
    n = matchall(r"[\d.-]+", l)

    # Join them back into a string separated by given separator
    j = join(n, s[2])

    # Set the opening bracket type as the empty string unless
    # the given bracket type is not a space
    x = s[1] < 33 ? "" : s[1:1]

    # Get the closing bracket type by adding 1 or 2 to the ASCII
    # value of the opening bracket unless it's an empty string
    c = string(x > "" ? s[1] + (s[1] < 41 ? 1 : 2) : x)

    # Put it all together and return
    return x * j * c
end
Alex A.
fonte
1

Utilitários Bash + GNU, 90

b=${2:0:1}
echo $b`sed "s/[][{}()<>]//g;s/[,; ]\+/${2:1}/g"<<<"$1"``tr '[{(<' ']})>'<<<$b`
Trauma Digital
fonte