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

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


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!


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



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.


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


10

C, 55 54 53 bytes

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

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

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

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

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 :

@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



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!



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>


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

4

PHP , 41 bytes

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

Pruébalo en línea!


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!


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!


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!


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.


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


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


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

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



2

PHP, 39 bytes

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

Ejecutar como tubería con -F.



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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.