Sintaxe sem açúcar


55

Em Haskell, a notação de lista:

[a,b,c]

É apenas açúcar sintático para:

a:b:c:[]

E a notação de string:

"abc"

É apenas açúcar sintático para:

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

Isso significa que a string:

"abc"

É o mesmo que:

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

Tarefa

Dada uma string, você deve exibir a aparência da versão des-sintaxe em Haskell.

Regras

  • Você receberá uma string por qualquer método de entrada válido. Você deve enviar uma string que termina :[]com todos os caracteres da entrada cercada 'e separada por :. A cadeia vazia deve ser exibida [].

  • Você pode assumir que não receberá caracteres que exijam escape (por exemplo ', novas linhas, guias ...) e que a entrada estará no intervalo ascii imprimível

  • Este é um você deve procurar minimizar a contagem de bytes de sua resposta

Casos de teste

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   

A entrada terá valores não-ascii? Sua restrição de caracteres que exigem escape exige que saibamos quais caracteres Haskell escapará ou pressuponha que sua lista seja completa.
FryAmTheEggman

@FryAmTheEggman Você pode supor que eles estejam na faixa ascii #
Wheat Wizard

7
@totallyhuman Esses nem são válidos Haskell. Se eles eram talvez, mas legais, não são, definitivamente não.
Wheat Wizard

38
Esta pergunta pode ser alternativamente intitulada "Diet Haskell".
March Ho

11
@cairdcoinheringaahing Não, "e 'são sintaticamente diferentes.
Assistente de trigo

Respostas:


85

Haskell , 26 bytes

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

Experimente online!

Explicação:

Em notação sem ponto e usando em concatMapvez de =<<, isso se torna

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

Dada uma string s, mapeamos cada caractere cpara uma string "'c':"usando a showfunção que retorna uma representação de string da maioria dos tipos Haskell. Essas cadeias são concatenadas e uma final []é anexada.

Embora não seja solicitada pelo desafio, essa resposta funciona até com escape adequado, pois showcuida dela: f "'"cede "'\\'':[]".


25
Espere um minuto, você quer dizer (++'[':']':[]).((++':':[]).show=<<), não?
Adám

11
Quando qualquer desafio tem uma resposta de Haskell, eu a voto por princípio. Isso vale o dobro para este.
Re

43

Haskell, 33 28 26 bytes

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

Experimente online!

folda função pointfree fornecida da direita para a string de entrada começando com []. A função é: mostrar char como um caractere Haskell, ou seja, cercado 'e concatenado com o resultado até agora, depois de colocar um :na frente dele.

Edit: @ Ørjan Johansen salvou dois bytes. Obrigado!


Suponho que isso signifique (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám

11
Eu acho que isso é superior à outra resposta de Haskell (na mesma contagem de bytes) devido ao uso :para criar a lista, e não ++, embora ambos tenham sua própria elegância.
CAD97

4
Isso é incrível. Duas abordagens separadas que têm o mesmo byte contam no mesmo idioma.
J Atkins



16

Lisp comum, 50 42 bytes

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

Experimente online!

Reduzido graças ao comentário de @coredump, usando em readvez de definir uma função.


11
Bem-vindo ao PPCG!
Martin Ender

2
Lisp! Bem-vindo, na verdade :)
Olivier Dulac

@Renzo Hi Renzo, você poderia reduzi-lo um pouco usando uma forma lambda anônimo, ou simplesmente chamando leitura: (format t"~{'~a':~}[]"(coerce(read)'list))(algumas outras perguntas são entradas wrt mais rigorosas e saídas, mas aqui isso é bom)
coredump

@ Coredump, obrigado !, Atualizei o código.
Renzo


10

C, 55 54 53 bytes

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

11
você pode remover o espaço emchar *h
Cyoce

11
Em puts("[]");vez disso, você pode fazer a saída com uma nova linha à direita para salvar alguns bytes.
Kritixi Lithos

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


8

05AB1E , 15 12 11 10 bytes

-3 bytes graças à carusocomputação
-1 byte graças a Adnan
-1 byte graças à idéia genial de Erik the Outgolfer

ʒ"'ÿ':"?},

Experimente 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

Aparentemente eu vencê-lo por 4 segundos ;-)
Digital Trauma

11
@DigitalTrauma O seu apareceu quando eu estava pressionando Postar sua resposta.
Riley

11
Você pode imprimir a matriz global em vez de pressionar os colchetes com 3 bytes. Você também pode interpolar a seqüência de caracteres para obter mais economias de bytes, para um total de -3, resultado final de 12 bytes:vy"'ÿ':"?}¯?
Magic Octopus Urn

@carusocomputing Eu uso o interpolador de strings o tempo todo para suítes de teste, mas esqueço de usá-lo no código real. Obrigado!
Riley

@carusocomputing Eu pensei vy"'ÿ':"}¯Jque funcionaria para 11, mas Jse junta à matriz global, não à pilha inteira nessa situação.
Riley

8

R, 51 bytes

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))

11
Ótima solução! Algumas maneiras de salvar alguns bytes e realmente resolver isso. A E / S padrão permite que você retorne uma função anônima ou receba a entrada de stdin, a última das quais seria muito mais curta usando em scan(,'')vez de uma função.
Giuseppe

Obrigado, sou um pouco novato em R (e código golf!), Por isso ainda não compreendi completamente funções anônimas, embora eu estivesse tentando fazê-lo sem 'function' lá. digitalização pode ser útil!
tc

ah, bem uma função anônima é apenas aquele em que você não atribuir a uma variável que você tinha acabado de deixar cair a f<-partir do início do seu código
Giuseppe

paste0 (gsub ('(.)', "'\\ 1':", scan (, "")), '[]') tem 43 anos
Zahiro Mor

8

Pitão, 14 10 8 bytes

j\:a`MQY

Tente isso!

-2 bytes graças a @isaacg

Finalmente, pyth é bom em alguma coisa.

explicação

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :

@isaacg Obrigado! Esqueci Me não sei por que não usei a. Agora somos pelo menos 2 bytes mais curtos que todas as outras soluções aqui!
KarlKastor



6

Python 2 , 48 46 44 37 bytes

-2 bytes graças a Rod. -7 bytes graças ao Assistente de Trigo.

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

Experimente online!



Oh, legal. Obrigado!
totallyhuman

11
Um mais curto como lambda s:':'.join(map(repr,[*s,[]]))ou lambda s:':'.join(map(repr,s))+":[]".
xnor

@xnor O segundo exemplo que você dá parece não funcionar para o caso vazio. (a resposta original parecia muito semelhante a isso, mas pago muito para cobrir o caso string vazia)
Assistente de trigo


6

JavaScript (ES6), 36 bytes

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

Tente

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


5

Geléia ,  11 10  8 bytes

-1 byte graças a Christian (remova a concatenação ;e utilize impressão implícita)

+0 bytes (corrigido para o caso limite de uma cadeia vazia - anteriormente o programa completo: ŒṘ€j”:“:[])

-2 graças a Erik, o Outgolfer (use pno lugar de ;€desde que ”:é efetivamente comprimento 1; use Ø[desde que se tornou abreviado para ⁾[])

ŒṘ€p”:Ø[

Experimente online!

Um programa completo que imprime o resultado (como um link, ele retorna uma lista de listas de caracteres).

... mas existe uma maneira de economizar usando o STDIN?

Quão?

ŒṘ€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

Perl 5 , 22 bytes

19 bytes de código + -psinalizador.

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

Ou, pelo mesmo bytecount s/./'$&':/g;s/$/[]/,.

Para a frente: s/./'$&':/genvolve cada caractere entre aspas e adicione um :depois. $\é impresso implicitamente após cada impressão, portanto, defina-o como []saída final [].

Experimente online!


4

Java (OpenJDK 8) ,86 83 76 bytes

-3 bytes graças a @KevinCruijssen
-7 bytes graças a @FlorianSchaetz

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

Experimente online!


Você pode soltar 4 bytes. O final ;não precisa ser contado para respostas lambda, o ;depois do }não é necessário e o {e }pode ser removido em torno do loop for. E você poderia economizar mais 4 bytes em Java 10 mudando tanto o Stringe chara var.
Kevin Cruijssen

4

brainfuck, 68 bytes

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

Experimente online!


Não funciona bem com a sequência vazia - retornou dois caracteres inválidos no seu teste online. Muito bom, caso contrário.
NoseKnowsAll

@NoseKnowsAll Parece que não consigo replicar isso; Sem entrada, não recebo saída. Você poderia fornecer um link atualizado com essa entrada?
Daniero 15/06

Isto é o que recebi quando o executo :. Com uma entrada vazia, ele deve retornar "[]" sem as aspas.
NoseKnowsAll

@NoseKnowsAll Seu link vai para a entrada "olá mundo" (obtenha um link atualizado pressionando o botão de link / cadeia), mas sim, entendi o que você quer dizer. Vou dar uma olhada nisso #
daniero 15/06

11
@NoseKnowsAll Lá vai você, eu o
consertei

3

Flak cerebral , 135 , 131 bytes

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

Experimente online!

+1byte para a -cbandeira.

Agradeço ao WheatWizard por remover NOOPs muito óbvios que eu tinha sem motivo XD.


@WheatWizard> _> Sim, eu estava apenas testando você ... Hahaha, obrigado por apontar isso. Vou tentar golf-lo mais tarde, mas vou acrescentar que agora lol
DJMcMayhem

3

ML padrão , 52 50 bytes

Guardado 2 bytes graças a @Laikoni!

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

Experimente online!

String.translateé um nome infelizmente muito tempo, mas foi de 5 bytes menor do que usando concat, mape explode.


@Laikoni thanks! Eu sempre esqueço que os operadores têm menor precedência do que funções.
musicman523

3

Cubix , 31 29 bytes

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

Atambém pode ser substituído i; tentando descobrir se há uma boa maneira de extrair outro byte ou dois disso. -2 bytes graças ao MickyT! Também superado por MickyT !

Encaixa em um cubo 3x3x3:

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

Assista online!

Experimente online!


Você pode salvar alguns bytes, usando alguns incrementos para o último colchete. Isso permite que a linha de fundo para ser comprimido um poucouo@[)o'U);!A?ro;o;o;os:'/u:''
MickyT


2

APL (Dyalog) , 21 19 bytes

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

Experimente online!

'[]',⍨ os colchetes anexados a

'.' todo personagem

⎕R PCRE R substituído com

'''&'':' uma citação, a correspondência, uma citação e dois pontos



2

PHP, 39 bytes

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

Corra como cano com -F.



2

Cubix , 27 bytes

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

Experimente online!

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

Assista correr

Uma variação ligeiramente diferente da resposta de Guiseppe . Isso coloca dois pontos e aspas na pilha. Em seguida, percorre a entrada, trocando e produzindo a pilha. Somente a entrada é descartada e os dois pontos e as aspas são mantidos.

Quando o final da entrada é alcançado, o IP se pergunta um pouco ao redor do cubo, adicionando e produzindo os colchetes. Existem alguns comandos redundantes no mix.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.