Składnia bez cukru

55

W Haskell notacja listy:

[a,b,c]

Jest tylko cukrem syntaktycznym dla:

a:b:c:[]

A notacja ciągów:

"abc"

Jest tylko cukrem syntaktycznym dla:

['a','b','c']

Oznacza to, że ciąg:

"abc"

Jest taki sam jak:

'a':'b':'c':[]

Zadanie

Biorąc pod uwagę ciąg znaków, powinieneś wypisać, jak wyglądałaby wersja bez składni w Haskell.

Zasady

  • Otrzymasz ciąg dowolną prawidłową metodą wprowadzania, powinieneś wypisać ciąg zakończony :[]każdym znakiem z wejścia otoczonego 'i oddzielonego :. Pusty ciąg powinien zostać wyprowadzony [].

  • Możesz założyć, że nie otrzymasz żadnych znaków wymagających ucieczki (np. Znaki 'nowej linii, tabulatory ...) i że dane wejściowe będą w drukowanym zakresie ascii

  • Jest to której celem powinno być zminimalizowanie liczby bajtów odpowiedzi

Przypadki testowe

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   
Kreator pszenicy
źródło
Czy dane wejściowe kiedykolwiek będą miały wartości inne niż ascii? Twoje ograniczenie dotyczące postaci wymagających ucieczki wymaga, abyśmy wiedzieli, które znaki ucieknie Haskell, lub zakładamy, że lista jest wyczerpująca.
FryAmTheEggman
@FryAmTheEggman Możesz założyć, że są w zasięgu ascii
Wheat Wizard
7
@totallyhuman Te nie są nawet ważne Haskell. Gdyby byli, ale mili nie są, zdecydowanie nie.
Wheat Wizard
38
Pytanie to można alternatywnie zatytułować „Diet Haskell”.
Marzec Ho
1
@cairdcoinheringaahing Nie, "i 'różnią się składniowo.
Kreator pszenicy,

Odpowiedzi:

85

Haskell , 26 bajtów

(++"[]").((++":").show=<<)

Wypróbuj online!

Wyjaśnienie:

W notacji bez point-point i używaniu concatMapzamiast =<<staje się to

f s = concatMap(\c-> show c ++ ":")s ++ "[]"

Biorąc pod uwagę ciąg s, odwzorowujemy każdy znak cna ciąg "'c':"przy użyciu showfunkcji, która zwraca ciąg reprezentujący większość typów Haskell. Te ciągi są łączone i []dołączany jest finał .

Chociaż nie showwymaga tego wyzwanie, ta odpowiedź działa nawet z właściwym ucieczką, ponieważ dba o to: f "'"ustępuje "'\\'':[]".

Laikoni
źródło
25
Chwileczkę (++'[':']':[]).((++':':[]).show=<<), nie?
Adám
11
Kiedy każde wyzwanie ma odpowiedź Haskella, głosuję za nią z zasady. To podwoi się w tym przypadku.
Ryan Reich,
43

Haskell, 33 28 26 bajtów

foldr((.(':':)).shows)"[]"

Wypróbuj online!

folddana funkcja pointfree od prawej do ciągu wejściowego rozpoczynającego się od []. Ta funkcja to: pokaż char jako znak Haskella, tj. Otoczony 'i połącz z wynikiem do tej pory po umieszczeniu :przed nim znaku .

Edycja: @ Ørjan Johansen zapisał dwa bajty. Dzięki!

nimi
źródło
To chyba znaczy (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám
1
Myślę, że jest to lepsze niż w przypadku innych odpowiedzi Haskell (przy tej samej liczbie bajtów) ze względu na użycie :do budowania listy zamiast ++, choć oba mają swoją elegancję.
97 CAD
4
To raczej niesamowite. Dwa oddzielne podejścia, które mają tę samą liczbę bajtów w tym samym języku.
J Atkin,
17

JavaScript ES6, 42 40 31 bajtów

s=>s.replace(/./g,"'$&':")+"[]"

Zamienia każdy znak na '<char>':, a następnie dodaje []do końca

Wypróbuj online!

Downgoat
źródło
1
Uwielbiam to w CodeGolf. Nigdy o tym nie wiedziałem $&.
Steve Bennett,
16

Common Lisp, 50 42 bajtów

(format t"~{'~a':~}[]"(coerce(read)'list))

Wypróbuj online!

Zmniejszone dzięki komentarzowi @coredump, dzięki użyciu readzamiast definiowania funkcji.

Renzo
źródło
1
Witamy w PPCG!
Martin Ender
2
Seplenienie! Rzeczywiście witamy :)
Olivier Dulac
@Renzo Cześć Renzo, możesz go trochę zmniejszyć, używając anonimowego formularza lambda lub po prostu nazywając read: (format t"~{'~a':~}[]"(coerce(read)'list))(niektóre inne pytania dotyczą bardziej rygorystycznych danych wejściowych i wyjściowych, ale tutaj jest w porządku)
coredump
@coredump, dzięki !, Zaktualizowałem kod.
Renzo
11

V , 11 bajtów

Í./'&':
A[]

Wypróbuj online!

Używa wyrażenia regularnego, aby otoczyć każdy znak wejściowy, '':a następnie Aprzesuwa []się do końca.

nmjcman101
źródło
10

C, 55 54 53 bajtów

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}
Govind Parmar
źródło
1
możesz usunąć miejsce wchar *h
Cyoce
1
Zamiast tego możesz zrobić puts("[]");wyjście z końcowym znakiem nowej linii, aby zapisać niektóre bajty.
Kritixi Lithos
rekurencyjnys(char*h){*h?printf("'%c':",*h++),s(h):puts("[]");}
l4m2
8

Python 3 , 41 38 36 bajtów

-2 bajty dzięki ovs

print(*map(repr,input()),[],sep=':')

Wypróbuj online!

Pręt
źródło
Ups ... Zapomniałem, że *mapistnieje ...
Pan Xcoder
Byłem zaskoczony pustką input()przez ostatnie 20 minut (dosłownie), kiedy może to być po prostu lambda @. @
Rod
@WheatWizard oh, używałem danych wejściowych pusty-pusty (bez nowej linii)
Rod
Można wymienić "[]"z[]
OVS
8

05AB1E , 15 12 11 10 bajtów

-3 bajty dzięki carusocomputing
-1 bajt dzięki Adnan
-1 bajt dzięki genialnemu pomysłowi Erika Outgolfera

ʒ"'ÿ':"?},

Wypróbuj online!

ʒ          # Filter out every character that the following code doesn't return 1 for
 "'ÿ':"?   #   Print the string 'ÿ': with ÿ replaced by this character
        }  # End for
         , # No character returned 1 so an empty array is left on the stack. Print that
Riley
źródło
Podobno pokonałem cię o 4 sekundy ;-)
Digital Trauma
1
@DigitalTrauma Yours pojawił się, gdy naciskałem „Post Your Answer”.
Riley
1
Możesz wydrukować tablicę globalną zamiast przesuwać nawiasy za pomocą 3 bajtów. Możesz również interpolować ciąg znaków, aby uzyskać kolejne oszczędności bajtów, co daje w sumie -3, końcowy wynik 12 bajtów:vy"'ÿ':"?}¯?
Magic Octopus Urn
@ carusocomputing Cały czas używam interpolatora ciągów dla pakietów testowych, ale zapominam o używaniu go w rzeczywistym kodzie. Dzięki!
Riley
@ carusocomputing Myślałem, vy"'ÿ':"}¯Jże zadziała dla 11, ale Jdołącza do globalnej tablicy, a nie do całego stosu w tej sytuacji.
Riley
8

R, 51 bajtów

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))
tc
źródło
1
Fajne rozwiązanie! Kilka sposobów na zaoszczędzenie niektórych bajtów i naprawdę zabranie tego. domyślne I / O pozwala po prostu zwrócić anonimową funkcję, a nawet pobrać dane wejściowe ze standardowego wejścia, którego użycie byłoby o wiele krótsze przy użyciu scan(,'')zamiast funkcji.
Giuseppe,
Dzięki, jestem trochę nowicjuszem z R (i kodem golfowym!), Więc jeszcze nie do końca zrozumiałem anonimowe funkcje, chociaż próbowałem to zrobić bez „funkcji”. skanowanie może być przydatne!
tc
ah, cóż, anonimowa funkcja to taka, w której nie przypisujesz jej do zmiennej, więc po prostu upuszczasz f<-od początku kodu
Giuseppe
paste0 (gsub ('(.)', "'\\ 1':", scan (, "")), '[]') to 43
Zahiro Mor
8

Pyth, 14 10 8 bajtów

j\:a`MQY

Spróbuj tego!

-2 bajty dzięki @isaacg

Wreszcie pyth jest w czymś dobry.

wyjaśnienie

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :
KarlKastor
źródło
@isaacg Dziękuję! Zapomniałem Mi nie wiem, dlaczego nie użyłem a. Teraz jesteśmy co najmniej 2 bajty krótsze niż wszystkie inne rozwiązania tutaj!
KarlKastor
7

Perl 6 , 19 bajtów

{S:g|.|'$/':|~'[]'}
Sean
źródło
7

Siatkówka, 12

  • 3 bajty zapisane dzięki @FryAmTheEggman
.
„$ &”:
$
[]

2 etapy:

  • za każdą pozostałą ' ':wokół niego postać
  • dodaj []do końca

Wypróbuj online .

Cyfrowa trauma
źródło
Pomógł związać cię facetowi o 4 sekundy;).
Magic Octopus Urn
Myślałem o tym!
CalculatorFeline,
6

Python 2 , 48 46 44 37 bajtów

-2 bajty dzięki Rod. -7 bajtów dzięki Kreatorowi pszenicy.

lambda s:':'.join(map(repr,s)+['[]'])

Wypróbuj online!

całkowicie ludzki
źródło
1
Nieco krótszy
Wheat Wizard
Och, fajnie. Dzięki!
całkowicieludzki
1
Jeden krótszy jako lambda s:':'.join(map(repr,[*s,[]]))lub lambda s:':'.join(map(repr,s))+":[]".
xnor
@xnor Drugi przykład, który podajesz, nie działa w przypadku pustej skrzynki. (oryginalna odpowiedź wyglądała bardzo podobnie do tej, ale zapłacono dużo, aby pokryć pustą skrzynkę na sznurki)
Wheat Wizard
6

JavaScript (ES6), 36 bajtów

s=>s?`'${[...s].join`':'`}':[]`:"[]"

Spróbuj

f=
s=>s?`'${[...s].join`':'`}':[]`:"[]"
oninput=_=>o.innerText=f(i.value);o.innerText=f(i.value="abc")
<input id=i><pre id=o>

Kudłaty
źródło
5

Galaretka ,  11 10  8 bajtów

-1 bajt dzięki Christianowi (usuń konkatenację ;i zamiast tego użyj drukowania niejawnego)

+0 bajtów (naprawiono dla przypadku krawędzi pustego łańcucha - wcześniej pełny program ŒṘ€j”:“:[]:)

-2 dzięki Erikowi Outgolfer (użycie pzamiast ;€od ”:jest efektywnie długością 1; użycie, Ø[ponieważ stało się krótsze ⁾[])

ŒṘ€p”:Ø[

Wypróbuj online!

Pełny program wypisujący wynik (jako link zwraca listę list znaków).

... ale czy istnieje sposób na oszczędzanie przy użyciu STDIN?

W jaki sposób?

ŒṘ€p”:Ø[ - Main link: list of characters, s  e.g. "Hey"
ŒṘ€      - Python representation for €ach    [["'",'H',"'"],["'",'e',"'"],["'",'y',"'"]]
    ”:   - literal character = ':'
   p     - Cartesian product                 [["'",'H',"'",':'],["'",'e',"'",':'],["'",'y',"'",':']]
         - implicit print (no newline): 'H':'e':'y':
      Ø[ - literal list of characters        ['[',']']
         - implicit print (no newline): []
Jonathan Allan
źródło
4

PHP , 41 bajtów

<?=preg_filter("#.#","'$0':",$argn)."[]";

Wypróbuj online!

Jörg Hülsermann
źródło
4 bajty: krótsze for(;~$c=$argn[$i++];)echo"'$c':"?>[].
user63956
@ user63956 nie potrzebujesz dodatkowej <?opcji, którą opcję należy uruchomić? Stwórz własne podejście, które chciałbym uzyskać, aby zyskać poparcie i Titus zrobił w międzyczasie coś podobnego
Jörg Hülsermann
Działa z -Rflagą. Tagi można zamykać nawet w konstrukcjach takich jak eval()i create_function().
user63956
4

Perl 5 , 22 bajtów

19 bajtów kodu + -pflaga.

s/./'$&':/g;$\="[]"

Albo, dla tego samego bytecount, s/./'$&':/g;s/$/[]/.

Całkiem prosto: s/./'$&':/gotacza każdą postać cudzysłowem i dodaje :po niej. $\jest niejawnie drukowany po każdym wydruku, więc ustawienie go na wydruk []końcowy [].

Wypróbuj online!

Dada
źródło
4

Java (OpenJDK 8) ,86 83 76 bajtów

-3 bajty dzięki @KevinCruijssen
-7 bajtów dzięki @FlorianSchaetz

s->{String b="";for(char c:s.toCharArray()){b+="'"+c+"':";};return b+"[]";};

Wypróbuj online!

Lękliwa Beluga
źródło
Możesz upuścić 4 bajty. Trailing ;nie musi być liczony dla odpowiedzi lambda, ;po tym, co }wcale nie jest konieczne, a {i }można usunąć wokół pętli for. I można zaoszczędzić kolejne 4 bajty w Javie 10 zmieniających się zarówno Stringi chardo var.
Kevin Cruijssen
4

pieprzenie mózgu, 68 bajtów

+[-->+[<]>-]>>,[<.>.<.>>-[>+<+++++++++]>+.[-]<<,]-[+[+<]>>+]<+++.++.

Wypróbuj online!

daniero
źródło
Nie działa całkiem z pustym ciągiem - zwróciło mi dwa nieprawidłowe znaki w teście online. W przeciwnym razie bardzo miło.
NoseKnowsAll
@NoseKnowsWszystko nie mogę tego odtworzyć; Bez wejścia nie mam wyjścia. Czy możesz podać zaktualizowany link z tym wejściem?
daniero
To co mam, kiedy go uruchomić . Przy pustym wejściu powinien zwracać „[]” bez cudzysłowów.
NoseKnowsAll
@NoseKnowsAll Twój link prowadzi do wejścia „witaj świecie” (uzyskaj zaktualizowany link, naciskając ten przycisk linku / łańcucha), ale tak, rozumiem o co ci chodzi.
Przyjrzę
1
@NoseKnowsAll Proszę bardzo, naprawiłem;)
daniero
3

Brain-Flak , 135 , 131 bajtów

{({}<>)<>}(((((((()()()()()){})){}{}())){}{})[()()])<>{<>(((((((()()()){}()){}){}()){})[(((()()()){})){}{}()])<>)({}<({}<>)>)<>}<>

Wypróbuj online!

+1bajt dla -cflagi.

Dzięki WheatWizard za usunięcie bardzo oczywistych NOOP, które miałem bez powodu XD.

DJMcMayhem
źródło
@WheatWizard> _> Tak, właśnie testowałem cię ... Hahaha, dzięki za zwrócenie na to uwagi. Spróbuję zagrać w golfa później, ale dodam, że teraz lol
DJMcMayhem
3

Standardowy ML , 52 50 bajtów

Zaoszczędź 2 bajty dzięki @Laikoni!

fn s=>String.translate(fn c=>"'"^str c^"':")s^"[]"

Wypróbuj online!

String.translateJest to niestety długa nazwa, ale był krótszy niż 5 bajtów użyciu concat, maporaz explode.

musicman523
źródło
@Laikoni dzięki! Zawsze zapominam, że operatorzy mają niższy priorytet niż funkcje.
musicman523
3

Cubix , 31 29 bajtów

uo@[)o'U);!A?ro;o;o;os:'/u:''

Amoże być również zastąpiony i; próbując dowiedzieć się, czy istnieje dobry sposób, aby wycisnąć z tego kolejny bajt lub dwa. -2 bajty dzięki MickyT! Rozgrywany również przez MickyT !

Pasuje do kostki 3x3x3:

      u o @
      [ ) o
      ' U )
; ! A ? r o ; o ; o ; o
s : ' / u : ' ' . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Obejrzyj online!

Wypróbuj online!

Giuseppe
źródło
Możesz zapisać kilka bajtów, używając kilku przyrostów dla ostatniego nawiasu. Pozwala to nieco kompresować wynik uo@[)o'U);!A?ro;o;o;os:'/u:''
końcowy
2

Python 2 , 47 bajtów

lambda a:`list(a)+[[]]`.replace(', ',':')[1:-1]

Wypróbuj online!

Pręt
źródło
Miałem to samo podejście, ale nie zrozumiałem tej [1:-1]części, więc było dłużej niż ludzie. +1
Kreator pszenicy
Dziwne, że trywialne rozwiązanie ma tylko 3 bajty dłużej (w Pythonie 3).
Pan Xcoder
2

APL (Dyalog) , 21 19 bajtów

'[]',⍨'.'R'''&'':'

Wypróbuj online!

'[]',⍨ dołączono nawiasy

'.' każda postać

⎕R PCRE R zastąpiony

'''&'':' cytat, dopasowanie, cytat i dwukropek

Adám
źródło
2

PHP, 39 bajtów

<?while(~$c=$argn[$i++])echo"'$c':"?>[]

Uruchom jako potok z -F.

Tytus
źródło
2

Cubix , 27 bajtów

uosW?U.iv":'"^soso;os@o[]'/

Wypróbuj online!

      u o s
      W ? U
      . i v
" : ' " ^ s o s o ; o s
@ o [ ] ' / . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Zobacz, jak biegnie

Nieco odmienna od odpowiedzi Guiseppe . To umieszcza dwukropek i cytat na stosie. Następnie zapętla dane wejściowe, zamieniając i wysyłając stos. Tylko dane wejściowe są usuwane, a dwukropek i cytat zostają zachowane.

Po osiągnięciu końca danych wejściowych IP zastanawia się nieco wokół kostki, dodając i wysyłając nawiasy. W miksie znajduje się kilka zbędnych poleceń.

MickyT
źródło