Uprość wprowadzanie macierzy!


20

Napisałem kilka wyzwań związanych z macierzami i wspólne dla wszystkich jest to, że używam formatu takiego jak ten poniżej, reprezentując macierze, zarówno w przykładach, jak i przypadkach testowych:

16    2    3   13
 5   11   10    8
 9    7    6   12
 4   14   15    1

Jest to prawdopodobnie kłopotliwy format w wielu językach.


Wyzwanie:

Napisz program / funkcję, która może przyjmować matrycę na formularzu podanym u góry jako dane wejściowe (bezpośrednio kopiuj / wklej z tego postu) i wypisz tę samą matrycę we wszystkich trzech innych konwencjonalnych formatach pokazanych poniżej .

Format wejściowy:

Liczby oddzielone zmienną liczbą spacji i znaki nowej linii do reprezentowania wierszy (patrz przypadki testowe).

  • Nie ma gwarancji, że liczba spacji między liczbami będzie spójna. Możesz jednak założyć, że ostatnia cyfra w każdej kolumnie jest wyrównana (jeśli to pomaga).
  • Mogą występować zarówno liczby całkowite, jak i zmiennoprzecinkowe, i mogą być dodatnie, ujemne lub zerowe. Matryca nie będzie zawierać liczb całkowitych i liczb zmiennoprzecinkowych jednocześnie.
  • Możesz założyć, że żadna liczba nie jest dłuższa niż 10 znaków, w tym minus i przecinek dziesiętny dla liczb zmiennoprzecinkowych.
  • Możesz założyć, że w każdym wierszu i każdej kolumnie jest taka sama liczba wpisów.
  • Nie będzie żadnych pustych macierzy wejściowych, ale mogą istnieć pojedyncze liczby lub macierze zawierające tylko jeden wiersz lub kolumnę.
    • W takich przypadkach możesz wybrać formaty wyjściowe pokazane w przypadkach testowych

Twój program / funkcja musi obsługiwać dane wejściowe, jeśli są one bezpośrednio kopiowane z tego postu i wklejane do interpretera (STDIN lub jako argument funkcji lub coś równoważnego). Możesz mieć co chcesz (nawiasy kwadratowe, cudzysłowy, nawiasy) przed i / lub po macierzy, ale musisz wziąć pod uwagę macierz jako ciąg znaków, których nie można zmienić (w tym znaki nowej linii).

Aby wyjaśnić: Załóżmy, że twoja funkcja / program jest wywoływany, fa macierz jest:

1 -2
3  5
6  7

wtedy możesz podać macierz jako argumenty funkcji takie jak ta (i nieskończenie wiele innych opcji):

f(1 -2
3  5
6  7)

f([1 -2
3  5
6  7])

f("""1 -2
3  5
6  7""")

Jeśli twój język nie może w żaden sposób przyjąć danych kopiowania / wklejania jako danych wejściowych, obawiam się, że musisz wybrać inny język.


Format wyjściowy:

Powinieneś wypisać matrycę w następujących trzech formatach (kolejność nie ma znaczenia):

[[16, 2, 3, 13], [5, 11, 10, 8], [9, 7, 6, 12], [4, 14, 15, 1]]
{{16, 2, 3, 13}, {5, 11, 10, 8}, {9, 7, 6, 12}, {4, 14, 15, 1}}
[16, 2, 3, 13; 5, 11, 10, 8; 9, 7, 6, 12; 4, 14, 15, 1]
  • Możesz rozdzielić trzy wyjścia, jak chcesz (np. Nowa linia)
  • Musisz wyprowadzać liczby z taką samą precyzją jak dane wejściowe (na przykład nie możesz przycinać liczby miejsc po przecinku, ani wypisywać liczb całkowitych jako liczb zmiennoprzecinkowych).
  • Miejsca są obowiązkowe
  • Musisz użyć -dla liczb ujemnych, nie _lub podobnych.

Przypadki testowe:

16    2    3   13
 5   11   10    8
 9    7    6   12
 4   14   15    1
----
[[16, 2, 3, 13], [5, 11, 10, 8], [9, 7, 6, 12], [4, 14, 15, 1]]
{{16, 2, 3, 13}, {5, 11, 10, 8}, {9, 7, 6, 12}, {4, 14, 15, 1}}
[16, 2, 3, 13; 5, 11, 10, 8; 9, 7, 6, 12; 4, 14, 15, 1]

0.14778   0.27114   0.24415
0.45997   0.12287   0.67470
0.28945   0.37928   0.51887
----
[[0.14778, 0.27114, 0.24415], [0.45997, 0.12287, 0.6747], [0.28945, 0.37928, 0.51887]]
{{0.14778, 0.27114, 0.24415}, {0.45997, 0.12287, 0.6747}, {0.28945, 0.37928, 0.51887}}
[0.14778, 0.27114, 0.24415; 0.45997, 0.12287, 0.6747; 0.28945, 0.37928, 0.51887]

-0.0398301   0.2403455  -0.2253368   0.3565870   0.0605803   0.0830780
-0.3254422  -0.1185191  -0.2989537   0.1647319   0.3621135   0.2018815
-0.0022281  -0.3362287  -0.3568447   0.4419063   0.3801872  -0.2847033
---
[[-0.0398301, 0.2403455, -0.2253368, 0.3565870, 0.0605803, 0.0830780], [-0.3254422, -0.1185191, -0.2989537, 0.1647319, 0.3621135, 0.2018815], [-0.0022281, -0.3362287, -0.3568447, 0.4419063, 0.3801872, -0.2847033],]
{{-0.0398301, 0.2403455, -0.2253368, 0.3565870, 0.0605803, 0.0830780}, {-0.3254422, -0.1185191, -0.2989537, 0.1647319, 0.3621135, 0.2018815}, {-0.0022281, -0.3362287, -0.3568447, 0.4419063, 0.3801872, -0.2847033},}
[-0.0398301, 0.2403455, -0.2253368, 0.3565870, 0.0605803, 0.0830780; -0.3254422, -0.1185191, -0.2989537, 0.1647319, 0.3621135, 0.2018815; -0.0022281, -0.3362287, -0.3568447, 0.4419063, 0.3801872, -0.2847033]

0       4       1       0
0       0      -6       0
0       1       4      -3
2       0       0       8
0       0       0       0
----
[[0, 4, 1, 0], [0, 0, -6, 0], [0, 1, 4, -3], [2, 0, 0, 8], [0, 0, 0, 0]]
{{0, 4, 1, 0}, {0, 0, -6, 0}, {0, 1, 4, -3}, {2, 0, 0, 8}, {0, 0, 0, 0}}
[0, 4, 1, 0; 0, 0, -6, 0; 0, 1, 4, -3; 2, 0, 0, 8; 0, 0, 0, 0]

1
----
[1]     (or [[1]])
{1}     (or {{1}})
[1]     (or 1)

1 2
----
[1, 2]  (or [[1, 2]])
{1, 2}  (or {{1, 2}})
[1, 2]

4
5
----
[[4], [5]]
{{4}, {5}}
[4; 5]

Jestem w pełni świadomy tego , ale w tym starciu, format kłopotliwe I / O to właśnie chodzi. Wyzwanie będzie polegało na sformatowaniu danych wyjściowych w niektórych językach, podczas gdy czytanie danych wejściowych będzie najtrudniejszą częścią w innych językach.

Nie zniechęcaj się, jeśli czytanie danych jest trudne, te zgłoszenia mogą być najbardziej interesujące. Krótkie niekoniecznie oznacza imponujące. I jak zawsze, wyjaśnienia są zachęcane!

Odpowiedzi:


7

Siatkówka , 52 bajty

Ta odpowiedź jest oparta na mojej odpowiedzi Perla , z pomocą Martina Endera w golfa z Retiną.

^ *
[
$
]
\s+
, 
m):`.+
[$&]
*T`[]`{}
], .
; 
^.|]$

Wypróbuj online!

Wyjaśnienia można znaleźć w mojej odpowiedzi na Perla. Różnice są następujące:

*
[
$
]

Zamiast s/^ *(.+)/[$1]/gmusuwać oba początkowe spacje i dodawać nawiasy wokół linii.

^.|]$

Aby usunąć nawiasy początkowe i końcowe dla trzeciego wyjścia.


6

Retina , 57 54 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

m`^ +

¶
] [
 +
, 
:`.+
[[$&]]
*T`[]`{}
], .
; 
^.|]$

Wypróbuj online!

Łącze TIO obecnie nie drukuje żadnych linii między tymi trzema formatami, ale dzieje się tak, ponieważ używa niestabilnego zatwierdzenia. Program drukuje pośrednie podawanie linii w Retina 0.8.2.

Wyjaśnienie

m`^ +

Pozbądź się wiodących spacji na każdej linii.

¶
] [

Zamień kanały na ] [.

 +
, 

Zastąp wszystkie przebiegi spacjami przecinkiem i spacją.

:`.+
[[$&]]

Zawiń całą rzecz, w [[...]]której kończy się pierwszy format. Wydrukuj wynik.

*T`[]`{}

Zamień nawiasy klamrowe i wydrukuj wynik bez zmiany łańcucha roboczego (tzn. Pierwszy format zostanie przywrócony po wydrukowaniu).

], .
; 

Zastąp ], [średnikiem i wysuwem linii.

^.|]$

Usuń pierwszy [i ostatni ]. To uzupełnia trzeci format.


5

Scala, 183 181 149 bajtów

Wypróbuj online!

Nowa wersja, wykorzystująca Stringzamienniki i wyrażenia regularne:

(x:String)=>{val d=x.replaceAll("\n *","; ").replaceAll("(?<!;) +",", ");(s"[[${d.replace("; ","], [")}]]",s"{{${d.replace("; ","}, {")}}}",s"[$d]")}

Nowa wersja ma takie same semantykę i wykorzystanie jak w starej wersji za pomocą split, mapi mkString.

Stara wersja, za pomocą split, mapi mkString:

Edycja: Nadmiarowa klasa postaci dla przestrzeni usunięta

(x:String)=>{val d=x.split("\n").map(_.trim.split(" +").mkString(", "));(d.map(x=>s"[$x]").mkString("[",", ","]"),d.map(x=>s"{$x}").mkString("{",", ","}"),d.mkString("[","; ","]"))}

Lambda. Wykonaj w REPL. Akceptuje dane wejściowe jako potrójny cytowany Stringparametr, zwraca dane wyjściowe w postaci 3 krotek wymaganych danych wyjściowych. REPL renderuje krotki oddzielone przecinkami, otoczone nawiasami.

Wyjaśnienie:

Nowa wersja:

Przeważnie taka sama logika, jak inne odpowiedzi oparte na wyrażeniach regularnych, z wyjątkiem trudnego spojrzenia za obsługą wiodących spacji na liniach.

Stara wersja:

Podzieliliśmy reprezentację macierzy wejściowej na Stringtablicę 2D , a następnie odwzorowaliśmy ją na tablicę 1D, zwijając wewnętrzne tablice, oddzielając elementy ,. Wreszcie, po prostu tworzymy różne dane wyjściowe poprzez zwijanie tablic 1D przy użyciu wymaganych separatorów nowej linii i znaczników granic (przedrostków i przyrostków). Wszystko to jest realizowane poprzez split(czytanie), map(przekształcanie) i mkString(zwijanie).

Przykładowa sesja REPL:

scala> val r=(x:String)=>{val d=x.split("\n").map(_.trim.split(" +").mkString(", "));(d.map(x=>s"[$x]").mkString("[",", ","]"),d.map(x=>s"{$x}").mkString("{",", ","}"),d.mkString("[","; ","]"))}

scala> r("""16    2    3   13
     |  5   11   10    8
     |  9    7    6   12
     |  4   14   15    1""")
res12: (String, String, String) = ([[16, 2, 3, 13], [5, 11, 10, 8], [9, 7, 6, 12], [4, 14, 15, 1]],{{16, 2, 3, 13}, {5, 11, 10, 8}, {9, 7, 6, 12}, {4, 14, 15, 1}},[16, 2, 3, 13; 5, 11, 10, 8; 9, 7, 6, 12; 4, 14, 15, 1])

W przypadku kilku elementów krawędziowych zapewnia to pożądany wynik.


2
O wiele lepsza niż druga odpowiedź Scali, dobra robota!
Pan Xcoder,

4

Japt , 63 53 bajty

Nadchodziło to w 44 bajtach, zanim zauważyłem, że odstępy w danych wyjściowych były obowiązkowe.

·®¸f
"[[{q"],["}]]
\{\{{q"},\{"}}}
[{q';}]"r",|;"_+S

Sprawdź to


Wyjaśnienie

          :Implicit input of string U
·         :Split to an array on newlines.
®         :Map over the array.
¸         :Split each element to an array on spaces.
f         :Filter to remove empty elements from the subarrays.
"[[       :Start building the output string. In Japt strings, anything enclosed in {}s will be evaluated before being added to the string.
{q"],["}  :Join the array to a string using ],[ The sub-arrays will be cast to comma separated strings in the process.
]]        :That's the first line done.
\{\{      :The start of the second line. A few bytes have to be sacrificed to esapce the {s
{q"},\{"} :Join the array to a string using },{
}}        :That's the second line done.
[         :And on to the last line.
{q';}     :This time we join the array with a semi-colon.
]"        :And that's the string completed.
r         :Except we still need to replace...
",|;"     :  All occurrences of a comma or a semi-colon with...
_+S       :  Itself and a space.
          :Implicit output of resulting string.

Dobra robota. Najlepsze, co mogłem zrobić, to około 60 bajtów ...
ETHproductions

3

Perl 5 , 71 bajtów

69 bajtów kodu + -p0flagi.

s/^ *(.+)/[$1]/gm;s/\s+/, /g;$_="[$_]
{".y/[]/{}/r."}
".s/], \[/; /gr

Wypróbuj online!

Objaśnienia

s/^ *(.+)/[$1]/gm;dodaje []wokół każdej linii, jednocześnie usuwając spacje wiodące.
s/\s+/, /g;zastępuje ciągi spacji i nowego wiersza przecinkiem i spacją.
Pierwsze wyjście jest następnie przez otaczający z szelkami: [$_].
Drugi musi zastąpić nawiasy klamrowe klamrami ( y/[]/{}/r) i otoczyć klamrami klamrowymi "{" ... "}".
Po trzecie, ], [zastępuje się średnikiem i spacją ( s/], \[/; /gr).


Po napisaniu tego rozwiązania próbowałem dostosować odpowiedź Retina Martina Endera, ale skończyło się to o 10 bajtów dłużej ( TryItOnline ):

s/^ +//gm;s/
/] [/g;s/ +/, /g;$_="[[$_]]
{{".y/[]/{}/r."}}
[".s/], \[/; /gr."]"

W przypadku tej wersji wyjaśnienia znajdują się w odpowiedzi Martina .


3

MATL , 60 bajtów

`jtU&D32', 'XHYXw]xXhH&Zc91wh93htD[]&D{}&DXED&GxvUH&4$'; 'TD

Wypróbuj online!

Wielkie dzięki dla Luisa Mendo za wygolenie jednej czwartej mojego bajtu w mistrzowskiej klasie na czacie.

Wklej dane wejściowe, a następnie pusty wiersz.

% Act I: Taking input.

`jt             w]    % Take input line by line until an empty line is encountered.
   U                  % Convert string input to numerical row array
    &D                % Convert back to string, adding brackets and single spaces
      32', 'XHYX      % Add commas before the spaces. Store ',  ' in clipboard H.


% Act II: Nested square brackets

x                     % Discard the tab character
 Xh                   % Concatenate all strings as cell array.
   H&Zc               % Join all the strings together, using clipboard H as a separator
       91wh93h        % Wrap in square brackets (ASCII 91 and 93)
              tD      % Display a copy of the result.

% Act III: Nested curly brackets

[]&D{}&D              % Convert empty array and cell array to string.
        XE            % Use to substitute square for curly brackets.

% Act IV: MATLAB-style input.

&Gxv                  % Get all the input again, discard the tab, and concatenate vertically.
    U                 % Convert to numerical 
     &4$     TD       % Convert to string, using row- and column separators
        H'; '         % Namely, clipboard H and a semicolon.

2

05AB1E ,  45  44 bajtów

|„  ð:ðδÛ˜ð¡„, ý''KD…[ÿ]=„[]„{}‡,"], ["„; :=

Wypróbuj online!

Pierwsze wyjście

|                           # push a list of the inputs
 „  ð:                      # replace any instance of 2 spaces with 1 space
      ðδÛ                   # remove any leading spaces
         ˜                  # flatten to a 1D list
          ð¡                # split on spaces
            „, ý            # merge on ", "
                ''K         # remove all single quotes
                   D        # duplicate for use in output 3
                    …[ÿ]    # interpolate between square brackets
                        =   # print without popping 

Drugie wyjście

„[]„{}‡,                    # translate square brackets to curly brackets and print

Trzecie wyjście

                            # the copy from the first output is used here
 "], ["„; :                 # replace "], [" with "; "
           =                # print


2

JavaScript (ES6), 121 110 106 bajtów

-15 bajtów dzięki @Shaggy i @Justin

m=>`[[${(a=m.split`
`.map(x=>x.match(/\S+/g).join`, `)).join`], [`}]]
{{${a.join`}, {`}}}
[${a.join`; `}]`

Przykładowy fragment kodu:

f=
m=>`[[${(a=m.split`
`.map(x=>x.match(/\S+/g).join`, `)).join`], [`}]]
{{${a.join`}, {`}}}
[${a.join`; `}]`
console.log(f(
`1 -2
 3  5
 6  7`
))


Zaoszczędź 4 bajty, zmieniając map(x=>x.trim().replace(/ +/g,", "))na map(x=>x.match(/\S+/g).join`, `).
Justin Mariner

1

Python 2 , 163 152 150 145 bajtów

-5 bajtów dzięki Felipe Nardi Batista, który zasugerował użycie ikonek (przepraszam, potrzebuję tylko wymówki, aby powiedzieć to słowo: P).

import re
a=str.replace
def f(s):r=a(`[re.findall('[\.\d]+',i)for i in s.split('\n')]`,"'",'');print r,a(a(r,*']}'),*'[{'),a(r[1:-1],'], [','; ')

Wypróbuj online!


Ach, ikony ... Dzięki!
totalnie ludzki,

1

Python 3 , 184 178 174 173 169 163 * 157 * 153 bajtów

Format wejścia / wyjścia: wyjście ze spacją między macierzami i wejście za pomocą tego wywołania funkcji (jak pokazano na TIO):

g("""<paste matrix here>""")

To jest funkcja:

def g(s,r=str.replace):a=str([[[int,float]['.'in y](y)for y in x.split()]for x in s.split('\n')]);print(a,r(r(a,*'[{'),*']}'),'['+r(a,'], [','; ')[2:-1])

Wypróbuj online!


* Zapisano 6 bajtów dzięki @officialaimm (od 169 do 163 bajtów).

* Zaoszczędź 4 bajty dzięki @FelipeNardiBatista.


Wyjaśnienie, które nastąpi po dalszym golfie.


1

C, 415 bajtów

#import<stdio.h>
#define A(a,c,o)for(l=strlen(a)-o,k=0;c[k];)a[l+k]=c[k++];
j,k,l;main(i){char s[999],a[999]="[",b[999]="{",c[999]="[",t[]=" ";for(;fgets(s,999,stdin);){A(b,"{",0)A(a,"[",0)for(i=0;s[i];++i){j=0;for(;s[i]-32&&s[i]-10&&s[i];++i){j=1;t[0]=s[i];A(c,t,0)A(b,t,0)A(a,t,0)}if(j){A(c,", ",0)A(b,", ",0)A(a,", ",0)}}A(c,"; ",2)A(b,"}, ",2)A(a,"], ",2)}A(c,"]",2)A(b,"}",2)A(a,"]",2)puts(a);puts(b);puts(c);}

To potwór i tak długo tak długo, ale już skończyłem. Prawdopodobnie powinienem był wybrać inne podejście.

Wypróbuj online!

Drugi przypadek testowy | Trzeci przypadek testowy | Czwarty przypadek testowy | Piąty przypadek testowy | Szósty przypadek testowy | Siódmy przypadek testowy


1

Galaretka , 37 bajtów

j€⁾, j⁾; ⁾[]j
ỴḲLÐf$€VµŒṘṄ“[]“{}”yṄȧÇ

Pełny program drukujący trzy formaty na trzech liniach.

Wypróbuj online!

W jaki sposób?

j€⁾, j⁾; ⁾[]j - Link 1, create the 3rd format (semicolon-style): list of lists
  ⁾,          - literal [',', ' ']
j€            - join for €ach (place ", " between the elements of each row)
      ⁾;      - literal [';', ' ']
     j        - join (place "; " between the rows)
         ⁾[]  - literal ['[', ']']
            j - join (surround the whole result with a pair of brackets)

ỴḲLÐf$€VµŒṘṄ“[]“{}”yṄȧÇ - Main link: list of characters
Ỵ                       - split at newlines
     $€                 - last two links as a monad for €ach row:
 Ḳ                      -   split at spaces
   Ðf                   -   filter keep those for which the following is truthy:
  L                     -     length (this removes all the empty lists "between" spaces)
       V                - evaluate as jelly code (yields a list of lists of numbers)
        µ               - monadic chain separation, call that x
         ŒṘ             - get a Python string representation of x
           Ṅ            - print that (the 1st format) plus a newline, and yield it
            “[]“{}”     - literal [['[', ']'],['{', '}']]
                   y    - translate (converts all '[' to '{' and all ']' to '}')
                    Ṅ   - print that (the 2nd format) plus a newline, and yield it
                      Ç - call the last link as a monad with argument x
                     ȧ  - logical and
                        - implicit print of the result (the 3rd format)

1

V , 41 bajtów

òJé;òÓ¨ä©ó«/±, 
yss]Y.pkÓ; /], [
Ùòcs]}f[

Wypróbuj online!

Wyjaśnienie

òJé;ò            Join all lines with `; ` (trailing single space)
     Ó¨ä©ó«/±,   :s/\v(\d)\s+/\1, /g
yss]             Surround everything with brackets (completes [x,x;x,x])
Y.pk             (Y)ank, surround with brackets again, (p)aste.  Adds [[x,x;x,x]]
    Ó; /], [     :s/; /[, ]/g (transforms to [[x,x], [x,x]])
Ù                Duplicate this line
 ò               recursively
  cs]}           (c)hange (s)urrounding [] with {}
      f[         go to the next [ until there are none

1

R , 132 bajty

function(x,p=paste0,g=gsub)cat(z<-p('[[',g('\n','], [',y<-g('[:blank:]',', ',x)),']]'),chartr('[]','{}',z),p('[',g('
','; ',y),']'))

Wypróbuj online!

anonimowa funkcja. Przyjmuje dane wejściowe jak

f('1 -2
3 5
6 7')

Drukuje je w tej samej kolejności co przypadki testowe, ale ze spacjami jako separatorem.

Wyjaśnienie:

Najpierw zamienia spacje ,i zapisuje wynik jako y. Następnie zamienia znaki nowej linii na ], [, umieszcza [[i ]]na obu końcach i zapisuje wynik jakoz .

Następnie chartrwłącza [się {i ]z }w z.

Wreszcie bierze y, zamienia nowe wiersze zi ;umieszcza [i ]na obu końcach.

Następnie wszystkie wyniki są przekazywane w takiej kolejności, w catjakiej są drukowane, wszystkie ładnie sformatowane i oddzielone pojedynczą spacją.

Lekko niegolfowany:

function(x)
  cat(
    z<-paste0('[[',gsub('\n','], [',y<-gsub('[:blank:]',', ',x)),']]'),
    chartr('[]','{}',z),
    paste0('[',gsub('\n','; ',y),']'))

1

Java 8 z Netbeans 8+, 209 bajtów

Liczba to 208 od kodu plus 1 bajt, aby uruchomić go przez naciśnięcie F6 .

Uciążliwa odpowiedź na kłopotliwe wyzwanie: str

interface M{static void main(String[]a){String s="";s=s.trim().replaceAll(" +",", ").replaceAll("\n(, )?","; ");System.out.println("["+s+"]\n[["+s.replace("; ","], [")+"]]\n{{"+s.replace("; ","}, {")+"}}");}}

Jak używać?

W obrębie Netbeans wklej ten kod do pliku o nazwie M.java. Następnie skopiuj macierz, której chcesz użyć. Następnie pomiędzy dwiema kolejnymi postaciami ""naciśnij ctrl+ vzgodnie z wymaganiami wyzwania.

Teraz naciśnij F6! Spowoduje to skompilowanie kodu, uruchomienie go i wygenerowanie oczekiwanych reprezentacji macierzy.


Czy nie musi to być we wszystkich trzech formatach wyjściowych?
Giuseppe

1
Tam! Tego mi brakowało! : D Naprawianie tego teraz.
Olivier Grégoire

2
@StewieGriffin Jest to korzystne języki, które domyślnie używają STDIN lub te, które nie dbają o nowe wiersze, mógłbym również powiedzieć, że „kopiowanie / wklejanie” w dowolnym większym środowisku Java IDE automatycznie zmienia kopiowane / wklejane nowe wiersze na wizualne \n, dzięki czemu wynik co zobaczyłeś. Więc nie do końca rozumiem, szczerze mówiąc: s
Olivier Grégoire

@ OlivierGrégoire Jestem w pełni świadomy, że jest to korzystne dla niektórych języków, szczególnie tych, które mogą obsługiwać format bez specjalnego przetwarzania. Wspominam o tym nawet wyraźnie w tekście wyzwania. Pamiętaj, że nie konkurujesz z Jelly, Javascript lub Python, używasz Java. Ma bardzo różną funkcjonalność i nie można go rzetelnie porównać z innymi. Zawsze przestrzegam zasad dotyczących unikania uciążliwych formatów We / Wy, które mogą dawać niektórym językom nieuczciwą przewagę, ale w tym konkretnym wyzwaniu analizowanie danych wejściowych jest w dużej mierze jego częścią.
Stewie Griffin

1

Mathematica, 129 bajtów

s=StringSplit
r=StringReplace
Print[#,n,#~r~{"{"->"[","}"->"]"},n,#~r~{"{{"->"[","}}"->"]","}, {"->"; "}]&@ToString@s@s[#,n="
"]&

Trzeci i czwarty wiersz razem definiują czystą funkcję przyjmującą ciąg wejściowy; na przykład, jeśli ustawimy f=Print...&, wówczas ostatni przypadek testowy zostanie wywołany jako:

f@"4
5"

Fragment

ToString@s@s[#,n="
"]

analizuje ciąg wejściowy jako macierz (ciągów - nigdy nie próbujemy interpretować wpisów jako wielkości liczbowe) i konwertuje wynikowe wyrażenie z powrotem na ciąg; automatycznie generuje format wyjściowy z nawiasami klamrowymi. Następnie Print[#,n,#~r~{"{"->"[","}"->"]"},n,#~r~{"{{"->"[","}}"->"]","}, {"->"; "}]drukuje ten format wyjściowy i dwa pozostałe, oddzielone znakami nowej linii, przy użyciu prostych reguł zastępowania ciągów.


1

Pip , 49 46 bajtów

45 bajtów kodu, +1 dla -rflagi.

g|>:sYP(RPg^w)R';kPyR'['{R']'}O'[OgRwkJ"; "']

Pobiera dane wejściowe ze standardowego wejścia. Wypróbuj online!

Wyjaśnienie

                 Preset variables used: s is " ", w is regex `\s+`, k is ", "
g                With -r flag, g is a list of lines from stdin
 |>:s            Left-strip spaces from (elements of) g and assign back to g

YP(RPg^w)R';k
     g^w         Split (elements of) g on runs of whitespace
   RP            Apply Pip's built-in repr, which wraps lists in [] and separates items
                   with ; (e.g. [[1;2];[3;4]])
  (     )R';k    Replace the semicolons with ", " to obtain format #1
YP               Print and yank into y variable

PyR'['{R']'}
 yR'['{          In y, replace [ with {
       R']'}     and ] with }
P                and print (format #2)

O'[OgRwkJ"; "']
O'[              Output [ with no newline
   O             Output with no newline:
    g              Take g (list of lines of stdin, with leading spaces stripped)
     Rwk           Replace runs of whitespace with ", "
        J"; "      and join lines on "; "
             ']  Print the final ] to complete format #3

(Ten format wyjaśnień wydaje mi się trochę skomplikowany, więc daj mi znać, jeśli coś nie ma sensu).


1

SCALA, 590 bajtów

Było ciężko, ale myślę, że już z tym skończyłem

var o=s.replaceAll("  *"," ").replaceAll("\n ","\n")
var z=o.split("\n")
var h=z.length
var k=new Array[Array[String]](h)
for(i<-0 to h-1)k(i)=z(i).split(" ")
var u=k.length-1
print("{")
for(i<-0 to u){print("{")
for(j<-0 to k(i).length-2)print(k(i)(j)+", ")
print(k(i).last)
print("}")}
print("}[")
for(i<-0 to u){print("[")
for(j<-0 to k(i).length-2)print(k(i)(j)+", ")
print(k(i).last)
print("]")}
print("][")
for(i<-0 to u-1){for(j<-0 to k(i).length-2)print(k(i)(j)+", ")
print(k(i).last)
print("; ")}
for(j<-0 to k(k.length-1).length-2)print(k(u)(j)+", ")
print(k.last.last)
print("]")

Szybkie wyjaśnienie: pobieram dane wejściowe otoczone potrójnymi cytatami, a następnie usuwam niepotrzebne spacje; podziel ciąg dwa razy (raz dla linii i raz dla kolumn); i drukuję z trzema procedurami. Może być możliwe zdefiniowanie funkcji do mutualizacji, ale nie wiem jak.

Wypróbuj online!


2
To jest okropne. Teraz muszę opublikować odpowiedź Scali.
Tamoghna Chowdhury

Poproś jednak o poparcie.
Tamoghna Chowdhury

1
Możesz zajrzeć na codegolf.stackexchange.com/a/129356/48620, aby zobaczyć, co może być możliwe dzięki Scali. Używanie go tak, jak w wersji wcześniejszej niż 1.5 Java, drapie tylko wierzchołek góry lodowej.
Tamoghna Chowdhury

2
Ponadto dane wyjściowe są niepoprawne, co sprawia, że ​​chcę wycofać moje upvote - nie ma przecinków między nawiasami, co wynika z formatu wyjściowego.
Tamoghna Chowdhury



0

C # (.NET Core) , 214 bajtów

(s)=>{var result=Regex.Replace("[["+Regex.Replace(s.Replace("\n","], [")," +(\\d)",", $0")+"]","  +"," ").Replace("[, ","[");return$"{result}]\n{result.Replace('[','{').Replace(']','}')}}}\n[{result.Replace("[","").Replace("],",";")}";};

Wypróbuj online!

Bierze Matrycę jako ciąg, zwraca trzy formaty jako pojedynczy ciąg oddzielony znakami nowej linii.


Od tej odpowiedzi zyskałem większą pewność, że instrukcja using dla bibliotek innych niż system podstawowy powinna zostać uwzględniona w bajtecount. Na razie pozostawię go w obecnej formie, ale instrukcja using System.Text.RegularExpressionswymaga dodania (według moich obliczeń) 37 dodatkowych bajtów.
Kamil Drakari

0

Węgiel drzewny , 38 bajtów

≔E⪪θ¶⪫Φ⪪ι λ, θE⪪[]{}²⪫ι⪫Eθ⪫ιλ, ⪫[]⪫θ; 

Wypróbuj online! Uwaga: końcowe miejsce. Link jest do pełnej wersji kodu. Węgiel drzewny ma opcję wprowadzania wielowierszowego ograniczoną za pomocą ["""i """]. Wyjaśnienie:

   θ                Input string
  ⪪ ¶               Split on newlines
 E                  Map over each line
        ι           Current line
       ⪪            Split on spaces
      Φ   λ         Filter out empty strings
     ⪫     ,        Join with `, `
≔            θ      Assign resulting array to variable

To pobiera dane wejściowe i przygotowuje je, dzieląc je na linie i normalizując separatory.

 ⪪[]{}²             Split `[]{}` into substrings of length 2
E                   Map over the substrings
          Eθ        Map over array from above
            ⪫ιλ     Wrap each element with the substring
         ⪫     ,    Join elements with `, `
       ⪫ι           Wrap with the substring
                    Implicitly print each result on a separate line

To obsługuje przypadki [[ ... ], [ ... ]]i {{ ... }, { ... }}.

    θ               Array from above
   ⪫ ;              Join elements with `; `
⪫[]                 Wrap result with `[]`
                    Implicitly print

To obsługuje [ ... ; ... ] skrzynkę.

Zanim grałem w golfa bajt z powyższego rozwiązania, miałem dwa 39-bajtowe rozwiązania; to jest drugie:

⮌E⪪[]{}[]²⪫ι⪫EE⪪θ¶⪫Φ⪪λ ν, ⎇κ⪫ιλλ⁺§;,,κ 

Wypróbuj online! Uwaga: końcowe miejsce. Link jest do pełnej wersji kodu. Wyjaśnienie:

  ⪪[]{}[]²                              Split `[]{}[]` into substrings of length 2
 E                                      Map over the substrings
                θ                       Input string
               ⪪ ¶                      Split on newlines
              E                         Map over each line
                     λ                  Current line
                    ⪪                   Split on spaces
                   Φ   ν                Filter out empty strings
                  ⪫     ,               Join with `, `
             E                          Map over each line
                          ⎇κ   λ        If outer index is zero, just use the line
                            ⪫ιλ         Otherwise wrap the line in the substring
            ⪫                   ⁺§;,,κ  Join with `; ` or `, ` per outer index
          ⪫ι                            Wrap in the substring
⮌                                       Reverse the order of the results
                                        Implicitly print each result on a separate line
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.