Erstellen Sie einen numerischen Listenumsetzer

20

Hassen Sie es nicht, wenn Sie eine Liste von Zahlen (Vektor, Array ...) von einem Programm in ein anderes kopieren und einfügen möchten, aber das Format, in dem Sie die Zahlen haben, stimmt nicht mit dem Format überein, in dem Sie sie benötigen ?

In MATLAB können Sie beispielsweise eine durch Leerzeichen getrennte Liste haben:

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

In Python müssten Sie Kommas einfügen, damit diese Liste eine gültige Eingabe ist, sodass Sie sie in konvertieren müssen

[1, 2, 3, 4, 5]

damit es funktioniert. In C ++ möchten Sie vielleicht etwas wie:

{16,2,77,29}

und so weiter.

Um das Leben aller zu vereinfachen, erstellen wir einen Listenkonverter, der eine Liste in einem beliebigen Format * erstellt und eine Liste in einem anderen angegebenen Format ausgibt.

Die gültigen Klammern sind:

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

Die gültigen Begrenzer sind:

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. 

Beachten Sie, dass die Eingabe beliebig viele Leerzeichen zwischen den Zahlen enthalten kann. Die Ausgabe kann jedoch auch null Leerzeichen (wenn ,oder ;als Trennzeichen verwendet) oder ein einzelnes Leerzeichen (wenn es durch Leerzeichen getrennt ist) verwenden.

Zusätzlich zur Eingabeliste gibt es eine Zeichenfolge (oder zwei Zeichen), die das Ausgabeformat definiert. Die Formatzeichenkette wird zuerst der Öffnungsbügel Typ sein (nur) [, (, <, {oder (die letzten ist ein einziger Raum verwendet , wenn es keine umgebende Klammer). Die Halterung Typ wird von dem Trennzeichen - Typ folgen, ,, ;oder (die letzten ist ein einziger Raum). Die beiden Eingabeformatzeichen müssen als einzelnes Argument (Zeichenfolge oder zwei aufeinanderfolgende Zeichen) in der oben beschriebenen Reihenfolge verwendet werden.

Einige Beispiele für Formatstrings:

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

Regeln:

  • Die Ausgabe darf keine führenden Leerzeichen enthalten
  • Die Ausgabe kann abschließende Leerzeichen und eine neue Zeile enthalten
    • Die Ausgabe sollte nur die Liste der Zahlen sein, nicht ans =oder ähnlich
  • Die Eingabe besteht aus einer Liste von Ganzzahlen oder Dezimalzahlen (sowohl positive als auch negative (und Null)) und einer Zeichenfolge aus zwei Zeichen
    • Wenn die Eingabe nur aus Ganzzahlen besteht, sollte die Ausgabeliste nur Ganzzahlen enthalten. Wenn die Eingabeliste aus Ganzzahlen und Dezimalzahlen besteht, können alle Ausgabezahlen Dezimalzahlen sein. (Es ist optional, die Ganzzahlen als Ganzzahlen beizubehalten.)
    • Die maximal zu unterstützende Anzahl von Nachkommastellen beträgt 3.
    • Die Eingabe besteht aus zwei Argumenten. Dh die Zahlen sind in einem Argument und die Formatzeichenfolge ist ein einzelnes Argument.
  • Der Code kann ein Programm oder eine Funktion sein
  • Die Eingabe kann ein Funktionsargument oder STDIN sein

Einige Beispiele:

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]

Der kürzeste Code in Bytes gewinnt. Wie immer wird der Gewinner eine Woche ab dem Tag ausgewählt, an dem die Herausforderung veröffentlicht wurde. Antworten, die später veröffentlicht werden, können trotzdem gewinnen, wenn sie kürzer als der aktuelle Gewinner sind.


Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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

Stewie Griffin
quelle
Ist es erlaubt, Leerzeichen nach und nach zu setzen?
Overactor
@overactor, siehe die ersten beiden Regeln. Führende Leerzeichen sind nicht in Ordnung, nachfolgende sind in Ordnung.
Stewie Griffin
Können wir Eingaben in umgekehrter Reihenfolge vornehmen? (Trennzeichen zuerst, Liste an zweiter Stelle)
Martin Ender
@ MartinBüttner, ja. Es ist nicht spezifiziert, dass es zuerst eine Liste sein muss, also können Sie wählen.
Stewie Griffin
J _bezeichnet negative Elemente. :(
Zgarb

Antworten:

1

CJam, 27 Bytes

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

Probieren Sie es hier aus.

Erläuterung

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
quelle
8

JavaScript (ES6), 75 82

Als anonyme Funktion

Bearbeiten: 2 Byte gespeichert thx @ user81655 (und 5 weitere, die es gerade überprüfen)

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

Testschnipsel

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
quelle
6

CJam, 35 34 Bytes

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

Teste es hier.

Erwartet das Format in der ersten Zeile und die Liste in der zweiten.

Erläuterung

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
quelle
5

Pyth, 33 Bytes

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

Probieren Sie es online aus: Demo oder Test Suite

Erläuterung:

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
quelle
Können Sie eine Erklärung hinzufügen, wie es funktioniert?
Shelvacu
1
@Shel Hier bist du.
Jakube
5

PowerShell, 108 100 95 85 Bytes

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

(siehe Versionsverlauf für frühere Versionen)

Golfed weitere 15 Bytes , die durch das Entfernen $bund $sVariablen und Pars auf dem inneren Strang zu verändern.

Dies nimmt Eingaben als zwei Zeichenfolgen und speichert sie in $iund $z, dann konstruieren wir eine neue Ausgabezeichenfolge. Die innere Pars -splits $imit einem regex nur Ziffern zu wählen, und dann -joinzusammen s zurück mit den gewünschten Trennzeichen. Wir verketten das mit dem ersten Zeichen der Begrenzereingabe (z. B. [) und schließen es mit der Indizierung in eine Zeichenfolge auf der Grundlage des ASCII-Werts des ersten Zeichens und einiger Formulierungsprobleme. Das Äußere .Trim()entfernt alle führenden oder nachfolgenden Leerzeichen.

AdmBorkBork
quelle
Ich denke, Sie könnten Ihren schließenden Klammerausdruck "]})>"["[{(< ".IndexOf($b[0])]durch so etwas wie ersetzen ' }) >]'[($b[0]-32)%6]. Das ($b[0]-32)%6gibt Ihnen 0,2,4,5,1zum Öffnen Klammerzeichen, mit denen Sie in die schließende Klammerzeichenfolge indizieren können ' }) >]'. Es könnte eine kürzere "Formel" geben, aber das scheint gut genug zu sein.
Danko Durbić
@ DankoDurbić Ausgezeichnet! Ich habe versucht, etwas Mathematik zu finden, um das richtige Ausgabezeichen basierend auf ASCII-Werten auszuwählen, aber ich konnte nicht die richtige Formel finden. Ich habe mich immer wieder gestolpert, ()weil ich direkt nebeneinander war, aber die anderen Klammern haben einen Buchstaben dazwischen, also habe ich mit der Indizierung angefangen. Vielen Dank!
AdmBorkBork
Mit String.Replace()anstelle des -replaceOperators würden Sie weitere 2 Bytes kaufen (kein Entweichen oder Definieren einer Zeichenklasse mit [])
Mathias R. Jessen
@ MathiasR.Jessen Sofern ich hier nichts vermisse, .Replace('[]{}()<>;,',' ')werden die einzelnen Zeichen nicht abgefangen, sondern es wird versucht, das symbolische Ganze zu finden, das es nicht gibt. Wir müssten Regex.Replace verwenden , was einen [regex]::.NET-Aufruf beinhaltet und stattdessen den Code verlängern würde.
AdmBorkBork
@TessellatingHeckler Danke! Ich spielte ein anderes Byte mit -ne''anstelle von Golf |?{$_}.
AdmBorkBork
4

Python 2, 96 Bytes

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

Anrufen als:

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

Ausgabe:

[-1.3,3.4,4,5.55555555]
TFeld
quelle
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)])

Eine anonyme Funktion, führen Sie es so aus

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

Dies kann wahrscheinlich viel weiter golfen werden ..

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
quelle
Ich denke, Sie müssen eine Zeichenfolge nehmen, keine Liste.
Overactor
Völlig falsch verstanden dies: The input will be a list of integer or decimal numbers (both positive and negative (and zero)), and a string of two characters.
Behoben
2

Mathematica, 108 Bytes

Mathematica ist im Allgemeinen umständlich mit Zeichenfolgeneingaben, sofern die Zeichenfolge nicht als Text interpretiert werden soll.

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

Erläuterung

StringCases[t,NumberString]gibt die Liste der Zahlenketten zurück.

Rifflefügt die Trennzeichen zwischen den Zahlen ein.

/.Thread[c@"[ {<(" -> c@"] }>)"]) Ersetzt die linke "Klammer" durch die rechte Klammer.

<>ist die Infixform von StringJoin. Es klebt die Teilstrings zusammen.

DavidC
quelle
2

Matlab, 85 Bytes

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

Beispiel Verwendung:

>> @(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
quelle
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)

Dies ist eine Funktion f, die zwei Zeichenfolgen akzeptiert und eine Zeichenfolge zurückgibt.

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.
quelle
1

Bash + GNU Utilities, 90

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