Azúcar sintáctico de matriz de elixir

17

En Elixir, las listas (vinculadas) están en el formato [head | tail]donde head puede ser cualquier cosa y tail es una lista del resto de la lista, y []la lista vacía es la única excepción a esto.

Las listas también se pueden escribir como lo [1, 2, 3]que es equivalente a[1 | [2 | [3 | []]]]

Su tarea es convertir una lista como se describe. La entrada siempre será una lista válida (en Elixir) que contiene solo números que coinciden con la expresión regular \[(\d+(, ?\d+)*)?\]. Puede tomar la entrada con (un espacio después de cada coma) o sin espacios. La salida puede ser con (un espacio antes y después de cada uno |) o sin espacios.

Para entradas con ceros a la izquierda, puede emitir sin ceros o con.

La entrada debe tomarse como una cadena (si se escribe una función), al igual que la salida.

Ejemplos

[] -> []
[5] -> [5 | []]
[1, 7] -> [1 | [7 | []]]
[4, 4, 4] -> [4 | [4 | [4 | []]]]
[10, 333] -> [10 | [333 | []]]

relacionado , no un duplicado, ya que esto en parte implica agregar modo ]al final. Además, la respuesta de Haskell aquí es bastante diferente a la de allí.

Okx
fuente
55
-1 de mi parte. Se desaconsejan los formatos de IO engorrosos . Si la entrada es una lista, tomemos como una lista en lugar de tener el 90% de nuestro código simplemente analizando la entrada
Jo King
2
¿Tenemos que admitir ceros a la izquierda? Se ajustan a la expresión regular.
Jo King
2
Posible duplicado de sintaxis sin azúcar
NoOneIsHere
55
@JoKing Yo diría que aquí el desafío en sí mismo es convertir entre dos formatos específicos, por lo que analizar la entrada es una parte fundamental del desafío y no algo extra agregado. PD: Ahora me he dado cuenta de cuál es realmente tu apodo xD
Leo
2
@MuhammadSalman: el desafío está etiquetado como "análisis", por lo que la conversión de / a una cadena es una parte sustancial de la misma con intención.
nimi

Respuestas:

9

Haskell, 50 bytes

f.read
f(a:b)='[':show(a+0)++'|':f b++"]"
f _="[]"

Pruébalo en línea!

Esto le +0permite al verificador de tipo Haskell saber que estamos tratando con listas de números, por readlo que analizará la cadena de entrada por nosotros.

nimi
fuente
1
+1, ¡me encanta el truco +0!
B. Mehta
4

Retina , 39 33 32 20 bytes

\b]
,]
+`,(.*)
|[$1]

Guardado 13 bytes gracias a H.PWiz, ovs, ASCII-only y Neil.
Pruébalo en línea!

Explicación

\b]
,]

Si no tenemos una lista vacía, agregue una coma final.

+`,(.*)
|[$1]

Si bien hay comas, envuelve las cosas con |[ thing ].


fuente
@ovs 24?
Solo ASCII
también 24?
Solo ASCII
@ Solo ASCII Puede guardar otros 4 bytes reemplazándolos \b]con ,]. (De lo contrario, había descubierto de forma independiente la misma solución.)
Neil
Oh, es cierto. Olvidé que \bera una cosa por alguna razón> _> 20 bytes @Mnemonic
solo ASCII
4

Perl 5 -pl , 31 28 bytes

s/\d\K]/,]/;$\=']'x s/,/|[/g

Pruébalo en línea!

¿Cómo?

-p                    # (command line) Implicit input/output via $_ and $\
s/\d\K]/,]/;          # insert a comma at the end if the list is not empty
$\=']'x s/,/|[/g      # At the end of the run, output as many ']' as there are
                      # commas in the input.  Replace the commas with "|["
Xcali
fuente
3

Elixir , 111 85 bytes

f=fn[h|t],f->"[#{h}|#{f.(t,f)}]"
[],_->"[]"
h,f->f.(elem(Code.eval_string(h),0),f)end

Pruébalo en línea!

Nunca he usado Elixir antes. Define una función que toma una cadena y una referencia a sí misma y devuelve una cadena.

Jo King
fuente
3

Ceilán , 113 bytes

String p(String s)=>s.split(" ,[]".contains).select((x)=>!x.empty).reversed.fold("[]")((t,h)=>"[``h`` | ``t``]");

Pruébalo en línea!

Aquí está escrito:

// define a function p mapping Strings to Strings.
String p(String s) =>
    // we split the string at all characters which are brackets, comma or space.
    s.split(" ,[]".contains)    // → {String+}, e.g.  { "", "1", "7", "" }
    // That iterable contains empty strings, so let's remove them.
    // Using `select` instead of `filter` makes the result a sequential instead of
    // an Iterable.
     .select((x)=>!x.empty)    // → [String*], e.g.   [1, 7]
    // now invert the order.
    // (This needs a Sequential (or at least a List) instead of an Iterable.)
     .reversed                 // → [String*], e.g.   [7, 1]
    // Now iterate over the list, starting with "[]", and apply a function
    // to each element with the intermediate result.
     .fold("[]")                       // → String(String(String, String))
    //    This function takes the intermediate result `t` (for tail) and an element
    //    `h` (for head), and puts them together into brackets, with a " | " in the
    //    middle. This uses String interpolation, I could have used `"+` and `+"`
    //    instead for the same length.
          ((t,h)=>"[``h`` | ``t``]");  // → String

Pruébalo en línea!

Como lo señalan los ovs en un comentario (ahora eliminado): si se seleccionan las opciones "sin espacios" para entrada y salida indicadas en la pregunta, se pueden guardar 3 bytes más (los obvios con espacios en ellos).

Si no necesitamos analizar la entrada, pero podríamos obtener una secuencia como entrada, se acortará mucho (69 bytes).

String p(Object[]s)=>s.reversed.fold("[]")((t,h)=>"[``h`` | ``t``]");

Pruébalo en línea!

Paŭlo Ebermann
fuente
2

SNOBOL4 (CSNOBOL4) , 114 bytes

	I =INPUT
S	N =N + 1	
	I SPAN(1234567890) . L REM . I	:F(O)
	O =O '[' L ' | '	:(S)
O	OUTPUT =O '[' DUPL(']',N)
END

Pruébalo en línea!

	I =INPUT				;* read input
S	N =N + 1				;* counter for number of elements (including empty list)
	I SPAN(1234567890) . L REM . I	:F(O)	;* get value matching \d until none left
	O =O '[' L ' | '	:(S)		;* build output string
O	OUTPUT =O '[' DUPL(']',N)		;* print O concatenated with a '[' and N copies of ']'
END
Giuseppe
fuente
2

Stax , 19 bytes

É▲²:WlÖ└%ï╪☺╒▓"We↨Φ

Ejecutar y depurarlo

Mi primera publicación de Stax, por lo que probablemente no sea óptima.

Desempaquetado y comentado:

U,                      Put -1 under input
  {                     Block
   i                      Push loop index, needed later
    '[a$'|++              Wrap the element in "[...|"
            m           Map
             '[+        Add another "["
                s2+     Get the latest loop index + 2
                   ']*+ Add that many "]"

Ejecute y depure este

wastl
fuente
2

Befunge-98 (PyFunge) , 22 21 bytes

'[,1;@j,]';#$&." |",,

Pruébalo en línea!

Si no hubiera restricciones extrañas en la producción, podríamos hacer esto en 18:

'[,1;@j,]';#$&.'|,

Dato curioso, este es técnicamente un programa que no hace nada en Python.

Jo King
fuente
2

R , 84 71 69 bytes

function(x){while(x<(x=sub('(,|\\d\\K(?=]))(.+)','|[\\2]',x,,T)))1;x}

Pruébalo en línea!

  • -15 bytes gracias a @KirillL.
digEmAll
fuente
1
71 bytes con una sola sustitución basada en mi respuesta de Ruby.
Kirill L.
@KirillL. : gracias, estaba seguro de que había una expresión regular más corta para hacer eso, pero siempre me equivoco con las búsquedas: D
digEmAll
-2 más , me olvidé por completo de una \Kmirada atrás más corta
Kirill L.
1

Jalea , 18 bytes

ŒVµ⁾[]jj⁾|[ṫ3;”]ṁ$

Un programa completo que imprime el resultado (como enlace monádico acepta una lista de caracteres pero devuelve una lista de caracteres y enteros).

Pruébalo en línea!

¿Cómo?

ŒVµ⁾[]jj⁾|[ṫ3;”]ṁ$ - Main link: list of characters  e.g. "[10,333]"
ŒV                 - evaluate as Python code              [10,333]
  µ                - start a new monadic chain, call that X
   ⁾[]             - list of characters                   ['[',']']
      j            - join with X                          ['[',10,333,']']
        ⁾|[        - list of characters                   ['|','[']
       j           - join                                 ['[','|','[',10,'|','[',333,'|','[',']']
           ṫ3      - tail from index three                ['[',10,'|','[',333,'|','[',']']
                 $ - last two links as a monad (f(X)):
              ”]   -   character                          ']'
                ṁ  -   mould like X                       [']',']'] (here 2 because X is 2 long)
             ;     - concatenate                          ['[',10,'|','[',333,'|','[',']',']',']']
                   - implicit (and smashing) print        [10|[333|[]]]
Jonathan Allan
fuente
1

Java 10, 107 bytes

s->{var r="[]";for(var i:s.replaceAll("[\\[\\]]","").split(","))r="["+i+"|"+r+"]";return s.length()<3?s:r;}

Pruébalo en línea.

Explicación:

s->{                       // Method with String as both parameter and return-type
  var r="[]";              //  Result-String, starting at "[]"
  for(var i:s.replaceAll("[\\[\\]]","") 
                           //  Removing trailing "[" and leading "]"
             .split(","))  //  Loop over the items
    r="["+i+"|"+r+"]";     //   Create the result-String `r`
  return s.length()<3?     //  If the input was "[]"
          s                //   Return the input as result
         :                 //  Else:
          r;}              //   Return `r` as result
Kevin Cruijssen
fuente
1

ML estándar , 71 bytes

fun p[_]="]|[]]"|p(#","::r)="|["^p r^"]"|p(d::r)=str d^p r;p o explode;

Pruébalo en línea! Utiliza el formato sin espacios. Ej. it "[10,333,4]"Rendimientos"[10|[333|[4]|[]]]]" .

sin golf

fun p [_]       = "]|[]]"          (* if there is only one char left we are at the end *)
  | p (#","::r) = "|[" ^ p r ^ "]" (* a ',' in the input is replaced by "|[" and an closing "]" is added to the end *)
  | p (d::r)    = str d ^ p r      (* all other chars (the digits and the initial '[') are converted to a string and concatenated to recursive result *)

val f = p o explode  (* convert string into list of chars and apply function p *)

Pruébalo en línea!

Laikoni
fuente
1

R , 140 136 bytes

Abajo 4 bytes según el consejo de sonido de Giuseppe

function(l,x=unlist(strsplit(substr(l,2,nchar(l)-1),", ")))paste(c("[",paste0(c(x,"]"),collapse=" | ["),rep("]",length(x))),collapse="")

Pruébalo en línea!

JayCe
fuente
substres más corto y el primero paste0puede ser pastellegar a 136 bytes.
Giuseppe
1
Usando eval, parsey en sublugar de unlist, strsplity substrtambién solo administré 136 bytes (pensé que podría ser más corto pero no lo fue)
Giuseppe
@Giuseppe ¡Gracias por los -4 bytes! Ojalá tuviéramos algo más corto. ¿Solución recursiva tal vez?
JayCe
1

R , 108 bytes

function(l)Reduce(function(x,y)paste0("[",x,"|",y,"]"),eval(parse(t=sub("]",")",sub("\\[","c(",l)))),"[]",T)

Pruébalo en línea!

Tardó casi un año en encontrar una solución R mejor que la anterior ... ¡debería haber sabido Reduceque sería la respuesta! Salidas sin espacios, la entrada puede ser con o sin espacios.

Giuseppe
fuente
0

sed + -E, 46 bytes

:
s/\[([0-9]+)(, ?([^]]*)|())\]/[\1 | [\3]]/
t

Un enfoque bastante sencillo. La segunda línea toma [\d+, ...]y lo cambia a [\d | [...]]. La tercera línea vuelve a la primera línea, si la sustitución fue exitosa. La sustitución se repite hasta que falla y luego el programa termina. Corre con sed -E -f filename.sed, pasando la entrada a través de stdin.

Silvio Mayolo
fuente
0

Rojo , 110 bytes

func[s][if s ="[]"[return s]replace append/dup replace/all b: copy s",""|[""]"(length? b)- length? s"]""|[]]"]

Pruébalo en línea!

Explicación de la versión sin golf:

f: func[s][                      
    if s = "[]" [return s]                    ; if the list is empty, return it    
    b: copy s                                 ; save a copy of the input in b 
    replace/all b "," "|["                    ; replace every "," with "|["  
    append/dup b "]" (length? b) - length? s  ; append as many "]" as there were ","
    replace b "]" "|[]]"                      ; replace the first "]" with "|[]]"     
]                                             ; the last value is returned implicitly

El rojo es tan fácil de leer, que dudo que necesite agregar los comentarios anteriores :)

Galen Ivanov
fuente