Sintaxis sin azúcar

55

En Haskell la notación de la lista:

[a,b,c]

Es solo azúcar sintáctico para:

a:b:c:[]

Y la notación de cadena:

"abc"

Es solo azúcar sintáctico para:

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

Esto significa que la cadena:

"abc"

Es lo mismo que:

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

Tarea

Dada una cadena, debe mostrar cómo se vería la versión sintaxis en Haskell.

Reglas

  • Recibirá una cadena por cualquier método de entrada válido, debe generar una cadena que termine :[]con cada carácter de la entrada rodeado 'y separado por :. La cadena vacía debería salir [].

  • Puede suponer que no recibirá ningún carácter que requiera escapar (p '. Ej. , Nuevas líneas, pestañas ...) y que la entrada estará en el rango de ASCII imprimible

  • Este es el que debe apuntar para minimizar el conteo de bytes de su respuesta

Casos de prueba

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   
Asistente de trigo
fuente
¿La entrada alguna vez tendrá valores no ASCII? Su restricción sobre los personajes que requieren escapar requiere que sepamos a qué personajes escapará Haskell o supone que su lista es exhaustiva.
FryAmTheEggman
@FryAmTheEggman Puede suponer que están en el rango ASCII
Wheat Wizard
77
@totallyhuman Esos ni siquiera son válidos Haskell. Si fueran tal vez, pero agradables no lo son, definitivamente no.
Wheat Wizard
38
Esta pregunta puede titularse alternativamente "Dieta Haskell".
Marzo Ho
1
@cairdcoinheringaahing No, "y 'son sintácticamente diferentes.
Wheat Wizard

Respuestas:

85

Haskell , 26 bytes

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

Pruébalo en línea!

Explicación:

En notación sin punto y usando en concatMaplugar de =<<, esto se convierte en

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

Dada una cadena s, asignamos cada carácter ca una cadena "'c':"usando la showfunción que devuelve una representación de cadena de la mayoría de los tipos de Haskell. Esas cadenas se concatenan y []se agrega una final .

Aunque no fue solicitado por el desafío, esta respuesta incluso funciona con un escape adecuado, porque showse encarga de ello: f "'"rendimientos "'\\'':[]".

Laikoni
fuente
25
Espera un minuto, quieres decir (++'[':']':[]).((++':':[]).show=<<), ¿no?
Adám
11
Cuando cualquier desafío tiene una respuesta de Haskell, lo voto por principio. Eso va doble para este.
Ryan Reich
43

Haskell, 33 28 26 bytes

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

Pruébalo en línea!

foldla función de punto libre dada desde la derecha en la cadena de entrada que comienza con []. La función es: mostrar char como un char de Haskell, es decir, rodeado 'y concatenar con el resultado hasta ahora después de poner un :frente.

Editar: @ Ørjan Johansen guardó dos bytes. ¡Gracias!

nimi
fuente
Supongo que eso significa (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám
1
Creo que esto es superior a la otra respuesta de Haskell (en el mismo recuento de bytes) debido al uso :para construir la lista en lugar de ++, aunque ambos tienen su propia elegancia.
CAD97
44
Esto es bastante asombroso. Dos enfoques separados que tienen el mismo número de bytes en el mismo idioma.
J Atkin
17

JavaScript ES6, 42 40 31 bytes

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

Reemplaza cada char con '<char>':, luego agrega []al final

Pruébalo en línea!

Downgoat
fuente
1
Me encanta esto de CodeGolf. Nunca lo supe $&.
Steve Bennett
16

Lisp común, 50 42 bytes

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

Pruébalo en línea!

Reducido gracias al comentario de @coredump, al usar en readlugar de definir una función.

Renzo
fuente
1
Bienvenido a PPCG!
Martin Ender
2
¡Ceceo! Bienvenido de hecho :)
Olivier Dulac
@ Renzo Hola Renzo, puedes reducirlo un poco usando un formulario lambda anónimo, o simplemente llamando a read: (format t"~{'~a':~}[]"(coerce(read)'list))(algunas otras preguntas son entradas y salidas más estrictas, pero aquí está bien)
coredump
@coredump, ¡gracias !, he actualizado el código.
Renzo
11

V , 11 bytes

Í./'&':
A[]

Pruébalo en línea!

Utiliza una expresión regular para rodear cada carácter de entrada '':y luego se Aextiende []hasta el final.

nmjcman101
fuente
10

C, 55 54 53 bytes

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}
Govind Parmar
fuente
1
puedes quitar el espacio enchar *h
Cyoce
1
En su lugar, puede hacer puts("[]");una salida con una nueva línea final para guardar algunos bytes.
Kritixi Lithos
recursivos(char*h){*h?printf("'%c':",*h++),s(h):puts("[]");}
l4m2
8

Python 3 , 41 38 36 bytes

-2 bytes gracias a ovs

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

Pruébalo en línea!

varilla
fuente
Whoops ... Olvidé que *mapexiste ...
Sr. Xcoder
Estuve perplejo por el vacío input()durante los últimos 20 minutos (literalmente), cuando podría ser un lambda @. @
Rod
@WheatWizard oh, estaba usando una entrada vacía-vacía (sin nueva línea)
Rod
Puede reemplazar "[]"con[]
ovs
8

05AB1E , 15 12 11 10 bytes

-3 bytes gracias a carusocomputing
-1 byte gracias a Adnan
-1 byte gracias a la genial idea de Erik the Outgolfer

ʒ"'ÿ':"?},

Pruébalo en línea!

ʒ          # 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
fuente
Aparentemente te vencí por 4 segundos ;-)
Digital Trauma
1
@DigitalTrauma Tuyo apareció cuando estaba presionando Publicar tu respuesta.
Riley
1
Puede imprimir la matriz global en lugar de empujar los corchetes con 3 bytes. También puede interpolar la cadena para obtener otro ahorro de bytes para un total de -3, resultado final de 12 bytes:vy"'ÿ':"?}¯?
Urna de pulpo mágico
@carusocomputing Uso el interpolador de cadenas todo el tiempo para las suites de prueba, pero olvido usarlo en el código real. ¡Gracias!
Riley
@carusocomputing Pensé vy"'ÿ':"}¯Jque funcionaría para 11, pero se June a la matriz global, no a toda la pila en esa situación.
Riley
8

R, 51 bytes

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))
tc
fuente
1
Buena solución! Algunas maneras en que puede guardar algunos bytes y realmente obtener esto. La E / S predeterminada le permite simplemente devolver una función anónima, o incluso tomar datos de stdin, el último de los cuales sería mucho más corto usando en scan(,'')lugar de una función.
Giuseppe
Gracias, soy un poco nuevo con R (¡y code golf!), Así que todavía no he entendido las funciones anónimas, aunque estaba tratando de hacerlo sin 'función' allí. ¡el escaneo podría ser útil!
tc
ah, bueno, una función anónima es solo una en la que no la asignas a una variable, por lo que solo debes descartarla f<-desde el principio de tu código
Giuseppe
paste0 (gsub ('(.)', "'\\ 1':", scan (, "")), '[]') es 43
Zahiro Mor
8

Pyth, 14 10 8 bytes

j\:a`MQY

¡Prueba esto!

-2 bytes gracias a @isaacg

Finalmente, Pyth es bueno en algo.

explicación

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :
KarlKastor
fuente
@isaacg ¡Gracias! Me olvidé My no sé por qué no lo usé a. ¡Ahora somos al menos 2 bytes más cortos que todas las otras soluciones aquí!
KarlKastor
7

Retina, 12

  • 3 bytes guardados gracias a @FryAmTheEggman
.
PS
PS
[]

2 etapas:

  • por cada personaje restante que lo ' ':rodea
  • agregar []al final

Pruébalo en línea .

Trauma digital
fuente
Ayudé al tipo que venciste por 4 segundos a atarte;).
Magic Octopus Urn
Estaba pensando en esto!
CalculatorFeline
6

Python 2 , 48 46 44 37 bytes

-2 bytes gracias a Rod. -7 bytes gracias a Wheat Wizard.

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

Pruébalo en línea!

totalmente humano
fuente
1
Ligeramente más corto
Wheat Wizard
Oh, aseado. ¡Gracias!
Totalmente humano
1
Uno más corto como lambda s:':'.join(map(repr,[*s,[]]))o lambda s:':'.join(map(repr,s))+":[]".
xnor
@xnor El segundo ejemplo que da no parece funcionar para el caso vacío. (la respuesta original se parecía mucho a eso, pero pagó mucho para cubrir la caja de cuerdas vacía)
Wheat Wizard
6

JavaScript (ES6), 36 bytes

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

Intentalo

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

Lanudo
fuente
5

Gelatina ,  11 10  8 bytes

-1 byte gracias a Christian (elimine la concatenación ;y utilice la impresión implícita)

+0 bytes (fijos para el caso del borde de una cadena vacía - previamente el programa completo: ŒṘ€j”:“:[])

-2 gracias a Erik the Outgolfer (el uso pen lugar de ;€since ”:es efectivamente la longitud 1; el uso Ø[se ha convertido en una abreviatura de ⁾[])

ŒṘ€p”:Ø[

Pruébalo en línea!

Un programa completo que imprime el resultado (como enlace devuelve una lista de listas de caracteres).

... pero ¿hay alguna manera de ahorrar usando STDIN?

¿Cómo?

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

PHP , 41 bytes

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

Pruébalo en línea!

Jörg Hülsermann
fuente
4 bytes más corto: for(;~$c=$argn[$i++];)echo"'$c':"?>[].
user63956
@ user63956 ¿no necesita una <?opción adicional con qué opción debe ejecutarse? Hacer un enfoque propio, diría yo para obtener votos a favor y Titus han hecho algo similar mientras tanto
Jörg Hülsermann
Funciona con la -Rbandera. Las etiquetas se pueden cerrar incluso en construcciones como eval()y create_function().
user63956
4

Perl 5 , 22 bytes

19 bytes de código + -pbandera.

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

O, por el mismo ByteCount, s/./'$&':/g;s/$/[]/.

Muy sencillo: s/./'$&':/grodea a cada personaje con comillas y agrega un :después. $\se imprime de forma implícita después de cada impresión, por lo que establecer que []da salida a la final [].

Pruébalo en línea!

Dada
fuente
4

Java (OpenJDK 8) ,86 83 76 bytes

-3 bytes gracias a @KevinCruijssen
-7 bytes gracias a @FlorianSchaetz

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

Pruébalo en línea!

Bashful Beluga
fuente
Puedes soltar 4 bytes. El seguimiento ;no tiene que contarse para las respuestas lambda, ;después de }eso no es necesario en absoluto, y el {y }puede eliminarse alrededor del ciclo for. Y podría guardar 4 bytes más en Java 10 cambiando tanto el Stringcomo chara var.
Kevin Cruijssen
4

brainfuck, 68 bytes

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

Pruébalo en línea!

daniero
fuente
No funciona del todo con la cadena vacía: me devolvió dos caracteres no válidos en su prueba en línea. Muy bien, de lo contrario.
NoseKnowsTodo el
@NoseKnowsAll Parece que no puedo replicar eso; Sin entrada no obtengo salida. ¿Podría proporcionar un enlace actualizado con esa entrada?
daniero
Esto es lo que obtuve cuando lo ejecuté :. Con una entrada vacía, debería devolver "[]" sin las comillas.
NoseKnowsTodo el
@NoseKnowsAll Su enlace va a la entrada "hello world" (obtenga un enlace actualizado presionando ese botón de enlace / cadena), pero sí, entiendo lo que quiere decir. Lo investigaré
daniero
1
@NoseKnowsAll Allá tienes, lo arreglé;)
daniero
3

Brain-Flak , 135 , 131 bytes

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

Pruébalo en línea!

+1Byte para la -cbandera.

Gracias a WheatWizard por eliminar los NOOP muy obvios que tenía sin ninguna razón XD.

DJMcMayhem
fuente
@WheatWizard> _> Sí, solo te estaba probando ... Jajaja, gracias por señalarlo. Intentaré jugar al golf más tarde, pero
agregaré
3

ML estándar , 52 50 bytes

¡Ahorré 2 bytes gracias a @Laikoni!

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

Pruébalo en línea!

String.translatees un nombre por desgracia mucho tiempo, pero fue 5 bytes más corto que el uso concat, mapy explode.

musicman523
fuente
@Laikoni gracias! Siempre olvido que los operadores tienen menor prioridad que las funciones.
musicman523
3

Cubix , 31 29 bytes

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

Atambién se puede sustituir por i; tratando de averiguar si hay una buena manera de exprimir otro byte o dos de esto. -2 bytes gracias a MickyT! ¡También superado por MickyT !

Se adapta a un cubo 3x3x3:

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

¡Míralo en línea!

Pruébalo en línea!

Giuseppe
fuente
Puede guardar un par de bytes utilizando un par de incrementos para el último paréntesis. Esto permite que el resultado final se comprima un pocouo@[)o'U);!A?ro;o;o;os:'/u:''
MickyT
2

Python 2 , 47 bytes

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

Pruébalo en línea!

varilla
fuente
Tuve el mismo enfoque, pero no descubrí la [1:-1]parte, por lo que fue más largo que totalmente humanos. +1
Wheat Wizard
Es extraño que la solución trivial sea ​​solo 3 bytes más (en Python 3).
Sr. Xcoder
2

APL (Dyalog) , 21 19 bytes

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

Pruébalo en línea!

'[]',⍨ los soportes anexados a

'.' cada personaje

⎕R PCRE R reemplazado por

'''&'':' una cita, el partido, una cita y dos puntos

Adán
fuente
2

PHP, 39 bytes

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

Ejecutar como tubería con -F.

Titus
fuente
2

Cubix , 27 bytes

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

Pruébalo en línea!

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

Míralo correr

Una variación ligeramente diferente de la respuesta de Guiseppe . Esto pone los dos puntos y la cita en la pila. Luego recorre la entrada, intercambia y emite la pila. Solo se desecha la entrada y se retienen los dos puntos y la cita.

Una vez que se alcanza el final de la entrada, la IP se pregunta un poco alrededor del cubo, agregando y sacando los corchetes. Hay un par de comandos redundantes en la mezcla.

MickyT
fuente