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':[]   

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 "'\\'':[]".


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!


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,



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.


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


10

C, 55 54 53 bajtów

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}

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

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

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),'[]'))

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 :

@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



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!



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>


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): []

4

PHP , 41 bajtów

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

Wypróbuj online!


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!


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!


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!


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.


@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.


@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!


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

PHP, 39 bajtów

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

Uruchom jako potok z -F.



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ń.

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.