Neutralizar datos

22

Para neutralizar los datos, reemplace recursivamente todos los números (¡no dígitos!) Con ceros y todos los caracteres (¡no cadenas!) Con espacios.

Debe aceptar cualquier número, carácter o cadena, o posiblemente una matriz * recursiva de datos numéricos / caracteres mixtos que su idioma pueda manejar. Por ejemplo, debe aceptar cadenas reales (y no restringir su entrada a listas de caracteres individuales) si su idioma puede manejarlas.

Si su idioma contiene una función integrada que realiza toda o la mayor parte de esta tarea, agradecería una versión alternativa adicional sin ella.

El envío más corto en cada idioma es un ganador, y recibiré un voto positivo de mi parte.

Casos de muestra

  1. """"

  2. 70

  3. 123.4560

  4. "X"" "

  5. " "" "

  6. "Yo!"" "

  7. [][]

  8. [-1.2E3][0]

  9. ["Hey"][" "]

  10. ["H","e","y"][" "," "," "]

  11. ["R",2,"D",2][" ",0," ",0]

  12. ["C","3","P",0][" "," "," ",0]

  13. ["THX",[1138]][" ",[0]]

  14. ["T","H","X",[1138]][" "," "," ",[0]]

  15. [[["H"],"e",1,1,0],[[-3],"arth"]][[[" "]," ",0,0,0],[[0]," "]]

* Si su idioma tiene varios tipos que pueden representar igualmente matrices como los ejemplos anteriores, puede optar por admitir solo uno. Dos entradas pueden ganar, aunque estén usando el mismo idioma, cada una con un tipo de datos diferente.

Adán
fuente
¿Qué pasa si nuestro lenguaje no distingue entre caracteres y cadenas de longitud 1?
xnor
@xnor AFAICT el efecto sería el mismo.
Adám
Oh, ahora veo eso en los casos de prueba, pero no estaba claro para mí que eso significara tomar cada elemento de cadena y reemplazar cada uno de sus caracteres con espacios. En realidad, no interpreté que los reemplazos tienen que hacerse recursivamente. La especificación habla de neutralizar una matriz, pero parece que también desea que se actúen elementos individuales que no están en una matriz.
xnor
@xnor Correcto. Siéntase libre de editar la pregunta para reflejar mejor esto.
Adám
Continuemos esta discusión en el chat .
Adám

Respuestas:

17

JavaScript (ES6), 53 47 bytes

f=o=>o.big?o.replace(/./g,' '):o.map?o.map(f):0

Casos de prueba

Arnauld
fuente
Finalmente, un uso para big()! Sin raw()embargo , es probable que en su lugar proporcione mejores pruebas de futuro .
Shaggy
@Shaggy Hmm. ¿Con qué sintaxis usarías raw()? No creo que String.prototype.raw()esté definido. Solo String.raw()es
Arnauld
Oh si, lo siento.
Shaggy
7

Python 2 , 52 bytes

f=lambda x:1-(x<{})and map(f,x)if x<''else' '*len(x)

Pruébalo en línea!

Cómo funciona

Python te permite comparar diferentes tipos. Los tipos numéricos siempre son más pequeños que los iterables, y los iterables se ordenan por sus nombres de tipo, por lo que

0 < {} < [] < '' < ()

De esta manera, f hace lo siguiente.

  • Si x es numérico, x<{}devuelve True y 1-(x<{})devuelve 0 . El código posterior andno se ejecuta.

  • Si x es iterable, 1-(x<{})devuelve 1 (verdadero), por lo que el código posterior andse ejecuta.

    • Si x es una lista, x<''es verdadero y f se asigna sobre sus elementos.

    • Si x es una cadena, x<''es falsa y x se reemplaza con una cadena de espacios de la misma longitud.

Dennis
fuente
7

Ruby, 54 53 49 bytes

f=->a{a*0==0?0:a*0==[]?a.map{|x|f[x]}:" "*a.size}

Tal vez hay una mejor manera, pero:

  • x * 0 == 0 para enteros
  • x * 0 == "" para cadenas
  • x * 0 == [] para matrices
GB
fuente
¡Inteligente! ¡Gracias por darme una manera de determinar los tipos en Python también!
TidB
no funciona para los ejemplos de cadenas y números fuera de una matriz, pero si cambias a.mapa [*a].mapél funciona como se esperaba
Alexis Andersen
Esto se ha solucionado ahora, gracias.
GB
6

Mathematica, 51 bytes

Actualmente tengo dos soluciones en este recuento de bytes:

#/._?NumberQ->0/.x_String:>StringReplace[x,_->" "]&
StringReplace[#,_->" "]~Check~#&//@#/._?NumberQ->0&

El segundo arroja un montón de advertencias que pueden ignorarse.

Explicación

En cualquier caso, comenzamos convirtiendo los números en ceros con

#/._?NumberQ->0

Luego, para procesar la cadena, hay dos opciones. O bien, usamos otra sustitución que solo se aplica a cadenas:

.../.x_String:>StringReplace[x,_->" "]

O bien, utilizamos el MapAlloperador //@que asigna una función sobre cada elemento individual en una lista anidada. El problema aquí es que intentaremos usar tanto StringReplaceen ceros como en el símbolo List(ya que //@también pasa por las cabezas de las expresiones), por lo que debemos usar Check(algo así como una catchdeclaración en otros idiomas) para evitar causar estragos en esos valores:

StringReplace[#,_->" "]~Check~#&//@...
Martin Ender
fuente
5

Jalea , 4 bytes

nOa⁶

Este es un enlace monádico. La impresión implícita de Jelly hace mucho ruido; para verificar que la salida es lo que debería ser, puede ver la representación interna con ŒṘ. Tenga en cuenta que esto expone las cadenas como listas de caracteres, que es cómo los implementa el intérprete Jelly.

Pruébalo en línea!

Cómo funciona

nOa⁶  Monadic link. Argument: z

 O    Ordinal; replace all characters with the code points.
      This does not affect numbers.
n     Vectorizing not-equal; compare z with the result to the right, replacing
      characters with 1 and numbers with 0.
  a⁶  Logical AND space; replace all 1's with spaces.
Dennis
fuente
Estaba esperando que apareciera un APL. ¡Ahora elija uno diferente para una solución de 1 byte!
Adám
Gracias por el aviso, pero no estoy seguro de saber siquiera cómo representar [[["H"],"e",1,1,0],[[-3],"arth"]]en APL ...
Dennis
JSON2APLexpr←⎕SE.Dyalog.Utils.repObj 7159⌶ ⋄ JSON2APLexpr'[[["H"],"e",1,1,0],[[-3],"arth"]]'da ((,⊂,'H') (,'e') 1 1 0) ((,¯3) 'arth'). FYI, 7159⌶estará ⎕JSONen la versión 16.0.
Adám
APL puede abordar cualquier JSON. Sin embargo, muchos datos APL no se pueden representar de forma inequívoca en JSON.
Adám
¿Crees que un código de golf que implica analizar o tal vez manipular matrices APL sería interesante?
Adám
5

Perl 6, 34 48 bytes

{.deepmap:{$_~~Str??" "x.comb!!0}}

{$_~~List??$_».&?BLOCK!!$_~~Str??" "x .comb!!0}

Expandido:

{                          # block-based lambda
    $_ ~~ List             # if argument is a list/array
        ?? $_».&?BLOCK     # then recurse for each element (&?BLOCK is a compile-time var)
        !! $_ ~~ Str       # else if argument is a string
            ?? " "x .comb  # then use space repeated by the string's length,
            !! 0           # else use the number 0
}
smls
fuente
El .deepmap no funciona correctamente para entradas singulares como "X"o 7, porque siempre devuelve una Lista.
Brad Gilbert b2gills
Maldición, debo haber pasado por alto eso (o la tarea se aclaró más tarde). Esto lo hace un poco más largo.
sonríe el
3

GAP , 91 bytes

GAP tiene un método Zeroque devuelve el elemento aditivo neutral correspondiente a un elemento de una estructura aditiva. Eso maneja números e incluso listas de números que se consideran vectores, pero no listas arbitrarias. Así que agreguemos estos y Chars y usemos que las cadenas son listas de Chars:

InstallOtherMethod(Zero,[IsChar],c->' ');
InstallOtherMethod(Zero,[IsList],l->List(l,Zero));

(No estoy contando la nueva línea ya que no es necesaria). Por supuesto, esto está muy lejos del uso previsto de Zero, y GAP se quejaría si no hubiera usado InstallOtroMethod . Ahora puedo hacer:

gap> Zero([[["H"],"e",1,1,0],[[-3],"arth"]]);
[ [ [ " " ], " ", 0, 0, 0 ], [ [ 0 ], "    " ] ]

No diría que la mayoría de los trabajos incorporados, uno podría sospechar que escribir una función normal debería ser más corta, pero mi mejor intento fue de 92 bytes:

f:=function(x)if IsInt(x)then return 0;elif IsList(x)then return List(x,f);fi;return' ';end;
Christian Sievers
fuente
2

Haskell, 115 bytes

Mi idioma no puede manejar ninguna combinación de números y cadenas en las listas (pero, por supuesto, puede definir un tipo de suma y ponerlo en una lista), y sus listas estándar no pueden manejar listas anidadas de manera diferente. Así que solo estoy haciendo lo que puede manejar. Creo que no es injusto porque todavía es largo, y lo hago principalmente para mostrar características de Haskell que rara vez se ven en las soluciones de golf de Haskell. Tenga en cuenta que las cadenas son listas de caracteres.

class N a where n::a->a
instance N Double where n _=0
instance N Char where n _=' '
instance N a=>N[a]where n=map n

Esto maneja cualquier número como Doble:

*Main> n 42
0.0
*Main> n 123.456
0.0
*Main> n "hi"
"  "
*Main> n [[1,2],[3,4,5]]
[[0.0,0.0],[0.0,0.0,0.0]]
*Main> n ["hello","world!"]
["     ","      "]
Christian Sievers
fuente
1
Debería ser más corto definir una estructura de datos con data N=S[Char]|I Int|L[N]una función recursiva sobre eso.
Zgarb
Probablemente tenga razón, supongo, pero eso es menos interesante y todavía parece que realmente no está resolviendo el problema (admito que en realidad está más cerca). Lo dejaré para alguien más.
Christian Sievers
enteros ? ¿Qué tal el caso de prueba 3.?
Adám
@ Adám Oh, tienes razón, y desafortunadamente no puedo afirmar que mi idioma no tiene esos. ¿Solo puedo manejar dobles? Puedo ingresarlos sin punto decimal.
Christian Sievers
@ChristianSievers Sí, está bien. Básicamente, debería poder manejar cualquier importación (si es posible) del JSON dado que le daría.
Adám
2

PHP, 91 bytes

function f($a){return!is_array($a)?is_string($a)?str_pad("",strlen($a)):0:array_map(f,$a);}

si el parámetro es array: recurse usando array_map.
de lo contrario, si el parámetro es una cadena: genera una cadena de espacios con la misma longitud.
otra cosa 0.

is_stringahorra un byte is_numeric; Negar is_array()hace que los paréntesis sean obsoletos. En total, es 17 bytes más corto que if()recursion-loop;else x?string:numbercon una llamada por referencia.

Tito
fuente
2

Python 2, 59 bytes

g=lambda d:0if d*0==0else " "*len(d)if d*0==""else map(g,d)

usa la forma de GB para determinar tipos

ovs
fuente
2

 Lisp común, 87

(defun c(e)(typecase e(list(mapcar'c e))(number 0)(string(map'string(lambda(u)#\ )e))))

Sin golf

(defun c(e)
  (typecase e
    (list (mapcar #'c e))
    (number 0)
    (string (map 'string (lambda(u) #\space) e))))

Ejemplo

> (c '((("H") "e" 1 1 0) ((-3) "arth")))
(((" ") " " 0 0 0) ((0) "    "))
volcado de memoria
fuente
1

Groovy, 53 bytes

{[it].collectNested{it in String?" "*it.size():0}[0]}

Este es un cierre sin nombre. Pruébalo aquí!

Explicacion :

Groovy tiene este método .collectNestedque ayuda a recorrer una lista como si estuviera aplanada.

Para manejar casos especiales donde solo se pasa un número entero o una cadena sin una lista, simplemente ajuste cada entrada en una lista y envíe el primer elemento.

Gurupad Mamadapur
fuente
1

Pyke, 8 bytes (versión anterior)

.FZ*0+d&

Explicación:

.FZ*0+d& - for i in deep_for(input):
  Z*     -    i*0
    0+   -   ^ + 0
      d& -  ^ and " "

Esto ya no funciona como una actualización, por lo que las falsificaciones de otros tipos donde hay verdades se convierten automáticamente en falsey del tipo de verdad.

Azul
fuente
Eso es, por supuesto, aceptable.
Adám
1

C #, 197195 bytes

a=>{if(a is string||a is char)return new string(' ',(a as string)?.Length??1);try{System.Convert.ToDecimal(a);return 0;}catch{}var b=(object[])a;for(int i=0;i<b.Length;)b[i]=n(b[i++]);return b;};

Esta función maneja char, stringcualquier tipo de número incorporado y matrices recursivas.

Programa completo, ayudante de salida sin problemas:

using System.Linq;    
class Class
{
    public static void Main()
    {
        System.Func<object, object> n = null;
        n = a => 
        {
            if (a is string || a is char)
                return new string(' ', (a as string)?.Length ?? 1);
            try
            {
                System.Convert.ToDecimal(a);
                return 0;
            }
            catch { }

            var b = (object[])a;
            for (int i = 0; i < b.Length;)
                b[i] = n(b[i++]);
            return b;
        };

        var result = n(new object[] { new object[] { new object[] { "H" }, 'e', 1.5, 1, 0 }, new object[] { new object[] { -3 }, "arth" } });
        System.Console.WriteLine(Output(result));
        System.Console.Read();
    }

    static string Output(object x)
    {
        var arr = x as object[];
        if (arr != null)
            return "[" + string.Join(",", arr.Select(Output)) + "]";
        else
            return x.ToString();
    }
};

La usingdeclaración solo es necesaria para el asistente de salida, no para la función real.

Probar en línea

raznagul
fuente
1

APL (Dyalog) 13.2 y anterior, 1 byte

Hasta e incluyendo la versión 13.2, monadic hizo exactamente esto. El comportamiento anterior se puede activar mediante el establecimiento ⎕ML( M igraci L evel) a cero.

Pruébalo en línea!

Sin usar el comportamiento anterior es de 4 bytes:

0⍴⊂

Pruébalo en línea!

 encerrar

0⍴ hacer una lista de longitud cero de copias de toda la entrada (conserva solo la estructura y la información de tipo)

 coaccionar un elemento a partir de eso (crea una matriz prototípica)

Adán
fuente
0

Javascript ES6, 81 caracteres

f=(x,t)=>(t=g=>eval(`try{x.${g}}catch(e){}`))`replace(/./g,' ')`||t`map(f)`||x&&0

Prueba:

f=(x,t)=>(t=g=>eval(`try{x.${g}}catch(e){}`))`replace(/./g,' ')`||t`map(f)`||x&&0

console.log(
`""  ""
7  0
123.456  0
"X"  " "
"  "  "  "
"Yo!"  "   "
[]  []
[-1.2E3]  [0]
["Hey"]  ["   "]
["H","e","y"]  [" "," "," "]
["R",2,"D",2]  [" ",0," ",0]
["C","3","P",0]  [" "," "," ",0]
["THX",[1138]]  ["   ",[0]]
["T","H","X",[1138]]  [" "," "," ",[0]]
[[["H"],"e",1,1,0],[[-3],"arth"]]  [[[" "]," ",0,0,0],[[0],"    "]]`
.split`
`.map(s => s.split`  `.map(eval))
.every(([s,k]) => JSON.stringify(f(s))==JSON.stringify(k)))

Qwertiy
fuente
0

Java 7, 262 (268) bytes

import java.util.*;Object c(Object o){if(o instanceof List){List r=new ArrayList();for(Object x:(List)o)r.add(c(x));return r;}if(o instanceof String){String r="\"";for(int i=((String)o).length();i-->0;r+=" ");return r+"\"";}return o instanceof Number?0:o instanceof Character?"' '":"";}

282 + 6 para el agregado \"y 'para imprimir bonitas las Cadenas y los caracteres.

Explicación:

import java.util.*;            // Required import for List and ArrayList
Object c(Object o){            // Method with Object parameter and Object return-type
  if(o instanceof List){       //  If the input is a List
    List r=new ArrayList();    //   Create a result-list
    for(Object x:(List)o)      //   Loop over the items of the input-list
      r.add(c(x));             //    And add all items with a recursive-call to this method
                               //   End of loop (implicit / single-line body)
    return r;                  //   Return result-list
  }if(o instanceof String){    //  If the input is a String instead
    String r="\"";             //   Create a result-String (starting with `"`
    for(int i=((String)o).length();i-->0;r+=" ");
                               //   Replace all characters in the String with a space
    return r+"\"";             //   Return the result within double-quotes
  }
  return o instanceof Number?  //  If the input is an integer or decimal instead:
    0                          //   Return 0
   :o instanceof Character?    //  If the input is a character instead:
    "' '"                      //   Return ' '
   :                           //  Else:
    "";                        //   Return an empty String
}                              // End of method

Código de prueba:

Pruébalo aquí

import java.util.*;
class M{
  static Object c(Object o){if(o instanceof List){List r=new ArrayList();for(Object x:(List)o)r.add(c(x));return r;}if(o instanceof String){String r="\"";for(int i=((String)o).length();i-->0;r+=" ");return r+"\"";}return o instanceof Number?0:o instanceof Character?"' '":"";}

  public static void main(String[] a){
    System.out.println(c(""));
    System.out.println(c(7));
    System.out.println(c(123.456));
    System.out.println(c('X'));
    System.out.println(c("  "));
    System.out.println(c("Yo!"));
    System.out.println(c(new ArrayList()));
    System.out.println(c(new ArrayList(){{add(-1.2e3);}}));
    System.out.println(c(new ArrayList(){{add("Hey");}}));
    System.out.println(c(new ArrayList(){{add('H');add('e');add('y');}}));
    System.out.println(c(new ArrayList(){{add('R');add(2);add('D');add(2);}}));
    System.out.println(c(new ArrayList(){{add("THX");add(new ArrayList(){{add(1138);}});}}));
    System.out.println(c(new ArrayList(){{add('T');add('H');add('X');add(new ArrayList(){{add(1138);}});}}));
    System.out.println(c(new ArrayList(){{add(new ArrayList(){{add(new ArrayList(){{add('H');}});add('e');add(1);add(1);add(0);}});add(new ArrayList(){{add(new ArrayList(){{add(-3);}});add("arth");}});}}));
  }
}

Salida:

""
0
0
' '
"  "
"   "
[]
[0]
["   "]
[' ', ' ', ' ']
[' ', 0, ' ', 0]
["   ", [0]]
[' ', ' ', ' ', [0]]
[[[' '], ' ', 0, 0, 0], [[0], "    "]]
Kevin Cruijssen
fuente