Stwórz konwerter listy numerycznej


20

Czy nie nienawidzisz go, gdy chcesz skopiować i wkleić listę liczb (wektor, tablica ...) z jednego programu do drugiego, ale format, w którym masz numery, nie odpowiada formatowi, w którym go potrzebujesz ?

Na przykład w MATLAB możesz mieć listę rozdzieloną spacjami, taką jak ta:

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

W Pythonie trzeba wstawić przecinki, aby ta lista była prawidłowym wejściem, więc trzeba by ją przekonwertować

[1, 2, 3, 4, 5]

aby działało. W C ++ możesz chcieć czegoś takiego:

{16,2,77,29}

i tak dalej.

Aby uprościć wszystkim życie, utwórzmy konwerter list, który pobiera listę w dowolnym formacie * i wyświetla listę w innym określonym formacie.

Prawidłowe nawiasy kwadratowe to:

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

Prawidłowe ograniczniki to:

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. 

Uwaga: dane wejściowe mogą zawierać dowolną liczbę spacji między liczbami, ale dane wyjściowe mogą mieć zerowe spacje (jeśli ,lub ;są używane jako separator) lub pojedyncze spacje (jeśli są rozdzielane spacjami).

Oprócz listy wejściowej pojawi się ciąg (lub dwa znaki) określający format wyjściowy. Ciąg formatu zostaną najpierw typ uchwyt otwierania (tylko), [, (, <, {lub (ostatni z nich jest pojedyncza przestrzeń stosowany, gdy nie ma otaczające wspornik). Po typie nawiasu następuje typ separatora ,, ;lub (ostatni to spacja). Dwa znaki formatu wejściowego należy traktować jako pojedynczy argument (ciąg znaków lub dwa kolejne znaki) w kolejności opisanej powyżej.

Kilka przykładów ciągów formatu:

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

Zasady:

  • Dane wyjściowe nie mogą mieć spacji wiodących
  • Dane wyjściowe mogą zawierać końcowe spacje i nowy wiersz
    • Wynikiem powinna być tylko lista liczb, a nie ans =podobna
  • Dane wejściowe to lista liczb całkowitych lub dziesiętnych (zarówno dodatnich, jak i ujemnych (i zero)) oraz ciąg dwóch znaków
    • Jeśli dane wejściowe składają się tylko z liczb całkowitych, lista wyjściowa powinna zawierać tylko liczby całkowite. Jeśli lista wejściowa składa się z liczb całkowitych i liczb dziesiętnych, wszystkie liczby wyjściowe mogą być liczbami dziesiętnymi. (Opcjonalne jest zachowanie liczb całkowitych jako liczb całkowitych)
    • Maksymalna liczba cyfr po przecinku, która musi być obsługiwana, to 3.
    • Dane wejściowe będą dwoma argumentami. Oznacza to, że liczby są w jednym argumencie, a ciąg formatu jest pojedynczym argumentem.
  • Kod może być programem lub funkcją
  • Dane wejściowe mogą być argumentem funkcji lub STDIN

Kilka przykładów:

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]

Najkrótszy kod w bajtach wygrywa. Jak zawsze zwycięzca zostanie wybrany tydzień po opublikowaniu wyzwania. Odpowiedzi zamieszczone później mogą nadal wygrywać, jeśli są krótsze niż obecny zwycięzca.


Tabela liderów

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

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


Czy dozwolone są końcowe i wiodące białe znaki?
overactor

@overactor, zobacz dwie pierwsze zasady. Wiodące białe znaki nie są w porządku, końcowe są w porządku.
Stewie Griffin,

Czy możemy pobierać dane wejściowe w odwrotnej kolejności? (separatory pierwsze, lista drugie)
Martin Ender

@ MartinBüttner, tak. Nie jest określone, że najpierw musi być na liście, więc możesz wybrać.
Stewie Griffin,

J używa _do oznaczania elementów ujemnych. :(
Zgarb,

Odpowiedzi:


1

CJam, 27 bajtów

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

Wypróbuj tutaj.

Wyjaśnienie

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.

8

JavaScript (ES6), 75 82

Jako funkcja anonimowa

Edycja: zapisano 2 bajty thx @ user81655 (i 5 kolejnych tylko przegląda)

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

Testowy fragment kodu

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>


6

CJam, 35 34 bajtów

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

Sprawdź to tutaj.

Oczekuje formatu w pierwszym wierszu i listy w drugim.

Wyjaśnienie

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.

5

Pyth, 33 bajty

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

Wypróbuj online: pakiet demonstracyjny lub testowy

Wyjaśnienie:

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

Czy możesz dodać wyjaśnienie, jak to działa?
Shelvacu,

1
@Shel Oto jesteś.
Jakube,

5

PowerShell, 108 100 95 85 bajtów

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

(zobacz historię zmian dla poprzednich wersji)

Golfed kolejne 15 bajtów poprzez usunięcie $bi $szmienne i zmiany parens na wewnętrznym sznurkiem.

Trwa to wejście jako dwa ciągi i zapisuje je do $ia $z, następnie budujemy nowy ciąg wyjściowy. Pareny wewnętrzne -splits $iz wyrażeniem regularnym, aby wybrać tylko cyfry, a następnie -joins z powrotem wraz z żądanym ogranicznikiem. Łączymy to z pierwszym znakiem wejściowym separatora (np. [) I zamykamy go indeksowaniem do łańcucha na podstawie wartości ASCII pierwszego znaku i pewnych sztuczek formułowania. Zewnętrzne .Trim()usuwa wszelkie spacje wiodące lub końcowe.


Myślę, że możesz zastąpić wyrażenie nawiasu zamykającego "]})>"["[{(< ".IndexOf($b[0])]czymś takim ' }) >]'[($b[0]-32)%6]. ($b[0]-32)%6Daje 0,2,4,5,1do otwarcia znaki wspornikach, które można wykorzystać do indeksu w ciągu nawiasu zamykającego ' }) >]'. Może istnieć krótsza „formuła”, ale wydaje się to wystarczająco dobre.
Danko Durbić,

@ DankoDurbić Znakomity! Próbowałem wymyślić matematykę, aby wybrać poprawny znak wyjściowy na podstawie wartości ASCII, ale nie mogłem znaleźć właściwej formuły. Ciągle się potykałem, ()będąc tuż obok siebie, ale pozostałe nawiasy mają znak pomiędzy, więc zacząłem indeksować. Dzięki!
AdmBorkBork,

Użycie String.Replace()zamiast -replaceoperatora kupiłoby ci kolejne 2 bajty (nie musisz uciekać ani definiować klasy postaci [])
Mathias R. Jessen

@ MathiasR.Jessen O ile mi czegoś tu .Replace('[]{}()<>;,',' ')nie brakuje, nie złapie pojedynczych postaci, ale zamiast tego spróbuje dopasować symboliczną całość, która nie istnieje. Musielibyśmy użyć Regex.Replace , który obejmuje [regex]::wywołanie .NET i zamiast tego wydłużyłby kod.
AdmBorkBork,

@TessellatingHeckler Thanks! Grałem w inny bajt -ne''zamiast |?{$_}.
AdmBorkBork,

4

Python 2, 96 bajtów

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

Zadzwoń jako:

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

Wynik:

[-1.3,3.4,4,5.55555555]

2

JavaScript (ES6), 82 92 116 92 bajty

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

Anonimowa funkcja, uruchom ją w ten sposób

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

Prawdopodobnie można to pograć w golfa dalej ..

Nie golfił

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

Myślę, że musisz wziąć jako ciąg, a nie listę.
overactor

Zupełnie źle to: The input will be a list of integer or decimal numbers (both positive and negative (and zero)), and a string of two characters. Naprawiono, dzięki
Bassdrop Cumberwubwubwub,

2

Mathematica, 108 bajtów

Matematyka jest na ogół niezdarna z wprowadzaniem ciągów, chyba że ciąg ma być interpretowany jako tekst.

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

Wyjaśnienie

StringCases[t,NumberString]zwraca listę ciągów liczb.

Rifflewstawia separatory między liczbami.

/.Thread[c@"[ {<(" -> c@"] }>)"]) zastępuje lewy „wspornik” prawym wspornikiem.

<>jest formą infix StringJoin. Skleja ze sobą podłoża.


2

Matlab, 85 bajtów

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

Przykładowe zastosowanie:

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

1

Julia, 95 bajtów

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)

Jest to funkcja, fktóra akceptuje dwa ciągi i zwraca ciąg.

Nie golfowany:

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

1

Bash + GNU Utilities, 90

b=${2:0:1}
echo $b`sed "s/[][{}()<>]//g;s/[,; ]\+/${2:1}/g"<<<"$1"``tr '[{(<' ']})>'<<<$b`
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.