Haskell ma krotki, które można zapisać jako
(a,b,c)
Jest to jednak tylko cukier syntaktyczny
(,,)a b c
Ogólnie przyjętą n krotka mogą być utworzone z n-1 ,
S pomiędzy (
... )
następnie jego elementów oddzielonych przestrzeni. Na przykład 7-krotkę (1,2,3,4,5,6,7)
można utworzyć przez
(,,,,,,)1 2 3 4 5 6 7
Ponieważ Haskell nie ma 1-krotek, nie można ich utworzyć. Nie będziesz również ponosić odpowiedzialności za puste krotki.
Zagnieżdżone krotki można utworzyć za pomocą parens, aby zastąpić kolejność operacji.
((1,2),3) == (,)((,)1 2)3
W ramach naszego dążenia do usunięcia całego cukru syntaktycznego z Haskell poproszę cię o napisanie programu, który usunie również cukier syntaktyczny z krotek Haskella.
Twój program powinien pobrać krotkę, tablicę lub łańcuch reprezentujący krotkę cukrową i powinien wypisać łańcuch reprezentujący krotkę „bez cukru”. Krotki wejściowe zawsze zawierają tylko dodatnie liczby całkowite lub inne krotki.
Ponieważ tutaj gramy w golfa, twój wynik powinien być krótki. Nie powinien zawierać niepotrzebnych
Przestrzenie. Spacje powinny być używane tylko do oddzielania argumentów funkcji krotki i nie powinny pojawiać się po a
)
lub przed a(
Zdanie wtrącone. Nawiasów należy używać tylko podczas tworzenia funkcji krotek lub zagnieżdżania krotek.
To jest pytanie w golfa kodu, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Przypadki testowe
(1,2) -> (,)1 2
(1,2,3) -> (,,)1 2 3
((1,2),3) -> (,)((,)1 2)3
(1,2,3,4) -> (,,,)1 2 3 4
(1,(2,3)) -> (,)1((,)2 3)
(10,1) -> (,)10 1
,
((1,(2,3)),4,(5,6))
i(1,(2,3),4)
.Odpowiedzi:
Haskell ,
169148 bajtówWypróbuj online! Bierze krotkę jako ciąg.
init.tail.fst.([]%)
to anonimowa główna funkcja. Powiąż go np.f
I użyj likef "(3,(14,1),4,7)"
, który daje"(,,,)3((,)14 1)4 7"
.Dlaczego dane wejściowe nie są dostarczane jako krotka Haskell? Ponieważ Haskell jest mocno wpisany, krotka
(1,2)
ma typ(Int,Int)
1, a krotka(1,(2,3))
ma typ(Int,(Int,Int))
. Zatem funkcja, która akceptuje pierwszy rodzaj krotki, nie może być zastosowana do drugiego rodzaju, a zwłaszcza nie może być żadnej funkcji, która przyjmuje dowolną krotkę 2 .Wyjaśnienie:
p:k="(,"
to krótki sposób przypisaniap
do'('
ik
do","
.(%)
jest rekursywną funkcją analizującą i przetwarzającą. Pierwszy argument jest listą już przeanalizowanych wpisów krotek, drugi argument jest resztą oryginalnego ciągu. Każde wywołanie zwraca krotkę aktualnie przekonwertowanej krotki (jako ciąg i ujęte w nawiasy kwadratowe) oraz resztę ciągu.l%('(':r)
Jeśli ciąg zaczyna się od nawiasu otwierającego, musimy przeanalizować nowy wpis krotki.(y,x:s)<-[]%r
Stosujemy rekurencyjnie%
i otrzymujemy krotkę,y
a pozostały ciąg dzieli się na następny znakx
i resztę ciągus
.m<-y:l
Dodajemy nowy wpisy
do bieżącej listy już znalezionych wpisówl
i wywołujemy wynikm
.x
jest teraz przecinek,
lub nawias zamykający)
. Tolast$ <B> :[ <A> |x<',']
tylko krótszy sposób pisaniaif x == ')' then <A> else <B>
.,
jest następne, musimy rekursywnie przeanalizować następny wpis:m%(p:s)
przygotowujemy nawias otwierający, aby skończyć w odpowiednim przypadku i przekazać listę już znalezionych wpisówm
.x == ')'
, zakończyliśmy bieżącą krotkę i musimy wykonać wymaganą transformację:(p:p:(l>>k)++x:foldl(\r x->x++[' '|x>k,r>k]++r)[x]m,s)
p:p:(l>>k)++x:
Jeśli znaleźliśmy n pozycji, tom
ma n elementówy
, a lista przed dodaniem ostatnio znalezionego elementu ma n-1 pozycji. Jest to przydatne, ponieważ potrzebujemy n-1,
dlan
krotki elementów il>>k
działa na listach jako „łącząc listęk
ze sobą tyle razy, iley
ma elementów” . W ten sposób pierwsza część daje ciąg znaków"((,,,)"
.foldl(\r x->x++[' '|x>k,r>k]++r)[x]m
konkatenuje elementym
(w odwrotnej kolejności, ponieważ dodając nowe wpisy do samego frontum
skonstruowano w odwrotnej kolejności), dodając tylko spacje między dwoma elementami, jeśli są one liczbami:[' '|x>k,r>k]
sprawdzamy, czy bieżące wpisyx
ir
liczby są porównywane leksykograficznie je do","
- jeśli nie są liczbami, są już reprezentacją krotki ujętą w nawiasach i'(' < ','
zawiera.l%('(':r)
na samym początku nie powiedzie, wtedy kończy się w ostatnim wierszu:l%r=lex r!!0
. Oznacza to, że musimy przeanalizować liczbę i zwrócić liczbę oraz resztę ciągu. Na szczęście istniejelex
funkcja, która właśnie to robi (analizuje następny prawidłowy token Haskell, a nie tylko liczby). Jednak wynikowa krotka jest zawijana w listę, więc używamy,!!0
aby uzyskać pierwszy element listy.init.tail.fst.([]%)
jest główną funkcją, która pobiera ciąg znaków i stosuje%
się do niego pustą listę. Np. Dla danych wejściowych"(1,2)"
, stosując([]%)
plony("((,)1 2)","")
, więc krotkę zewnętrzną i wsporniki należy usunąć.fst
pobiera pierwszy element krotki,tail
usuwa wspornik zamykający iinit
otwierający.Edycja: Wielkie podziękowania dla @ Ørjan Johansen za grę w golfa w sumie 21 bajtów !
1 Właściwie jest to typ (Num t1, Num t) => (t, t1) , ale to inna historia.
2 Ignorowanie funkcji polimorficznych, takich jak id , które nie mogą faktycznie działać z ich danymi wejściowymi.
źródło
Desugarable
, ale trzeba by zadeklarować instancjeInt
i wszystkie typy krotek.g
można skrócićfoldr1(\x r->x++[' '|x>k,r>k]++r)
i wstawić.show (1,2,3,4,5,6,7,8,9,0,1,2,3,4,5)
w GHCi, a następnie dodaj,6
na końcu i spróbuj ponownie.)m<-y:l
, złóż w lewo zamiast w prawo i użyj[x]
jako wartości początkowej. Wypróbuj online!f
może być anonimowy:init.tail.fst.([]%)
.Haskell,
141 bajtów138 bajtów (dzięki Ørjan Johansen)f
ma typExp -> String
.Dane wejściowe: szablon
Exp
Reakcja Haskell (tj. Standardowa reprezentacja AST wartości Haskell dowolnego typu - w zasadzie przeanalizowany kod Haskell przed sprawdzeniem typu); musi reprezentować krotkę zawierającą tylko nieujemne liczby całkowite i inne takie krotki.Dane wyjściowe: ciąg znaków zawierający zdezaktualizowaną składnię tego wyrażenia krotkowego.
Próbny:
źródło
")"++
na')':
w dwóch miejscach i zaoszczędzić miejsce potail
, przenosząc je poza nawiasy.Haskell , 119 bajtów
Wypróbuj online! Używa niestandardowego typu danych
T
do reprezentowania krotek, czyli krotka((1,2),3)
jest reprezentowana jakoU[U[I 1,I 2],I 3]
. Przykładowe użycie:init.tail.f $ U[U[I 1,I 2],I 3]
daje(,)((,)1 2)3
.źródło
Python 2 , 110 bajtów
Wypróbuj online!
Trwa
tuple
.źródło
GNU sed,
14982 + 2 = 84 bajtów+2 bajty dla
-r
flagi.Wypróbuj online!
Wyjaśnienie
źródło
((1,(2,3)),4,(5,6))
i(1,(2,3),4)
.JavaScript, 75 bajtów
Tablica wejściowa liczba | tablica, ciąg wyjściowy.
Dzięki Neilowi zaoszczędź 2 bajty
źródło
(1/t?' ':0)+v
może być1/t?' '+v:v
.Mathematica, 94 bajty
Zawiera
U+F4A1
wbudowanąFunction
funkcję niedrukowalną .Przyjmuje
List
liczbę całkowitąString
. Jeżeli nie jest to dozwolone, to może być ustalone przez dodanie kolejnych 10 bajtów (Wersja ta trwaList
odList
e /Integer
e):źródło
Pip , 45 bajtów
Jest to funkcja, która przyjmuje listę jako argument. Wypróbuj online!
Skomentowana wersja
źródło
JavaScript (ES6),
8884 bajtówPrzyjmuje tablicę liczb całkowitych i tablic. Edycja: Zapisano 1 bajt, używając
s+=
zamiast dwóch osobnych zastosowańs+
. Zaoszczędziłem kolejne 3 bajty teraz, gdy mogę uprościć wewnętrzny trójskładnik. Jeśli kradnę pomysły @ tsh, mogę sprowadzić je do 76 bajtów:źródło
Your program should take either a tuple or a string representing a sugary tuple
Zakładam, że tablica tablic / liczb całkowitych powinna być w porządku.R, 316 bajtów?
(Muszę wyjść i nie jestem pewien, jaki jest właściwy sposób liczenia bajtów ... plus nie jest to świetne rozwiązanie, ale chciałem to opublikować, ponieważ spędziłem czas na tworzeniu ...)
Przypadki testowe:
źródło
JavaScript (ES6), 72 bajty
Dane wejściowe: tablica zawierająca liczby i / lub tablice
Wyjście: ciąg
Zastosowanie: f ([...])
Wykonuje wszystkie przypadki testowe, mile widziane ulepszenia
źródło
C, 308 lub 339 bajtów
308 lub 339 bajtów, w zależności od tego, czy dozwolone jest przekazywanie wskaźnika na koniec ciągu wejściowego; ostatnia linia jest tam tylko po to, aby pozwolić na przekazanie literału łańcucha bezpośrednio, bez konieczności obliczania jego długości.
Wyjaśnienie
Dość prosty algorytm. Zlicza przecinki na bieżącej głębokości, drukuje je jako konstruktor krotki, a następnie argumenty krotki, ucieka (spacje między liczbami, zagnieżdżone krotki między nawiasami), rekurencyjnie.
Przypadki testowe i zastosowanie
źródło