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, f
a 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!
Japt ,
6353 bajtyNadchodziło to w 44 bajtach, zanim zauważyłem, że odstępy w danych wyjściowych były obowiązkowe.
Sprawdź to
Wyjaśnienie
źródło
Perl 5 , 71 bajtów
69 bajtów kodu +
-p0
flagi.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 ):
W przypadku tej wersji wyjaśnienia znajdują się w odpowiedzi Martina .
źródło
MATL , 60 bajtów
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.
źródło
05AB1E ,
4544 bajtówWypróbuj online!
Pierwsze wyjście
Drugie wyjście
Trzecie wyjście
źródło
Python 2 , 143 bajty
Wypróbuj online!
źródło
JavaScript (ES6),
121110106 bajtów-15 bajtów dzięki @Shaggy i @Justin
Przykładowy fragment kodu:
źródło
map(x=>x.trim().replace(/ +/g,", "))
namap(x=>x.match(/\S+/g).join`, `)
.Python 2 ,
163152150145 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).
Wypróbuj online!
źródło
Python 3 ,
184 178 174 173 169 163 * 157 *153 bajtówFormat wejścia / wyjścia: wyjście ze spacją między macierzami i wejście za pomocą tego wywołania funkcji (jak pokazano na TIO):
To jest funkcja:
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.
źródło
C, 415 bajtów
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
źródło
Galaretka , 37 bajtów
Pełny program drukujący trzy formaty na trzech liniach.
Wypróbuj online!
W jaki sposób?
źródło
V , 41 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
R , 132 bajty
Wypróbuj online!
anonimowa funkcja. Przyjmuje dane wejściowe jak
Drukuje je w tej samej kolejności co przypadki testowe, ale ze spacjami jako separatorem.
Wyjaśnienie:
Najpierw zamienia spacje
,
i zapisuje wynik jakoy
. Następnie zamienia znaki nowej linii na], [
, umieszcza[[
i]]
na obu końcach i zapisuje wynik jakoz
.Następnie
chartr
włącza[
się{
i]
z}
wz
.Wreszcie bierze
y
, zamienia nowe wiersze zi;
umieszcza[
i]
na obu końcach.Następnie wszystkie wyniki są przekazywane w takiej kolejności, w
cat
jakiej są drukowane, wszystkie ładnie sformatowane i oddzielone pojedynczą spacją.Lekko niegolfowany:
źródło
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
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śnijctrl
+v
zgodnie z wymaganiami wyzwania.Teraz naciśnij
F6
! Spowoduje to skompilowanie kodu, uruchomienie go i wygenerowanie oczekiwanych reprezentacji macierzy.źródło
\n
, dzięki czemu wynik co zobaczyłeś. Więc nie do końca rozumiem, szczerze mówiąc: sMathematica, 129 bajtów
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:Fragment
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.źródło
Pip ,
4946 bajtów45 bajtów kodu, +1 dla
-r
flagi.Pobiera dane wejściowe ze standardowego wejścia. Wypróbuj online!
Wyjaśnienie
(Ten format wyjaśnień wydaje mi się trochę skomplikowany, więc daj mi znać, jeśli coś nie ma sensu).
źródło
SCALA, 590 bajtów
Było ciężko, ale myślę, że już z tym skończyłem
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!
źródło
05AB1E , 34 bajty
Wypróbuj online!
ε...}
został zastąpionyvy...})
przez TIO, ponieważ nie został jeszcze tam pobrany.źródło
C # (.NET Core) , 214 bajtów
Wypróbuj online!
Bierze Matrycę jako ciąg, zwraca trzy formaty jako pojedynczy ciąg oddzielony znakami nowej linii.
źródło
using System.Text.RegularExpressions
wymaga dodania (według moich obliczeń) 37 dodatkowych bajtów.Węgiel drzewny , 38 bajtów
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:To pobiera dane wejściowe i przygotowuje je, dzieląc je na linie i normalizując separatory.
To obsługuje przypadki
[[ ... ], [ ... ]]
i{{ ... }, { ... }}
.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:
Wypróbuj online! Uwaga: końcowe miejsce. Link jest do pełnej wersji kodu. Wyjaśnienie:
źródło