Neutralizar dados


22

Para neutralizar os dados, substitua recursivamente todos os números (não dígitos!) Por zeros e todos os caracteres (não cadeias!) Por espaços.

Você deve aceitar qualquer número único, caractere ou sequência ou, possivelmente, matriz recursiva * de dados numéricos / caracteres misturados que seu idioma possa manipular. Por exemplo, você deve aceitar cadeias de caracteres reais (e não restringir sua entrada a listas de caracteres únicos) se o seu idioma puder lidar com isso.

Se o seu idioma contiver um componente interno que faça toda ou a maior parte dessa tarefa, eu apreciaria uma versão alternativa adicional sem ele.

O envio mais curto em cada idioma é um vencedor e receberá um voto positivo de mim.

Casos de amostra

  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]," "]]

* Se seu idioma possui vários tipos que podem igualmente representar matrizes como os exemplos acima, você pode optar por oferecer suporte a apenas um. Duas entradas podem vencer, mesmo que estejam usando o mesmo idioma, cada uma com um tipo de dados diferente.


E se nossa linguagem não distingue entre caracteres e seqüências de caracteres de comprimento 1?
Xnor

@xnor AFAICT o efeito seria o mesmo.
Adám 16/01/19

Oh, eu vejo isso agora nos casos de teste, mas não estava claro para mim que significava pegar todos os elementos de string e substituir cada um de seus caracteres por espaços. Na verdade, não interpretei que as substituições devam ser feitas recursivamente. A especificação fala sobre a neutralização de uma matriz, mas parece que você deseja que elementos únicos que não estão em uma matriz também atuem?
Xnor

@xnor Correto. Sinta-se livre para editar a pergunta para refletir melhor isso.
Adám 16/01/19

Respostas:


17

JavaScript (ES6), 53 47 bytes

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

Casos de teste


Finalmente, um uso para big()! No entanto, você provavelmente forneceria melhor proteção para o futuro usando raw().
Shaggy

@Shaggy Hmm. Com qual sintaxe você usaria raw()? Eu não acho que String.prototype.raw()está definido. Somente String.raw()é.
Arnauld

Ah, sim, desculpe.
Shaggy

7

Python 2 , 52 bytes

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

Experimente online!

Como funciona

O Python permite comparar diferentes tipos. Os tipos numéricos são sempre menores que os iteráveis, e iterables são classificados por seus nomes de tipo, portanto

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

Dessa forma, f faz o seguinte.

  • Se x for numérico, x<{}retorna True e 1-(x<{})retorna 0 . O código depois andnão é executado.

  • Se x é iterável, 1-(x<{})retorna 1 (verdade), portanto o código após andé executado.

    • Se x é uma lista, x<''é verdadeiro ef é mapeado sobre seus itens.

    • Se x é uma sequência, x<''é falso ex é substituído por uma sequência de espaços do mesmo comprimento.


7

Ruby, 54 53 49 bytes

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

Talvez haja uma maneira melhor, mas:

  • x * 0 == 0 para números inteiros
  • x * 0 == "" para cadeias
  • x * 0 == [] para matrizes

Inteligente! Obrigado por me dar uma maneira de determinar tipos em Python também!
TidB

ele não funciona para os exemplos de string e número fora de uma matriz, mas se você mudar a.mappara [*a].mapela, funciona como esperado #
Alexis Andersen

Isso foi corrigido agora, obrigado.
GB

6

Mathematica, 51 bytes

Atualmente, tenho duas soluções nessa contagem de bytes:

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

O segundo lança um monte de avisos que podem ser ignorados.

Explicação

Em ambos os casos, começamos transformando números em zeros com

#/._?NumberQ->0

Depois, para processar a sequência, existem duas opções. Ou usamos outra substituição que se aplica apenas a strings:

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

Ou então, usamos o MapAlloperador //@que mapeia uma função sobre cada elemento em uma lista aninhada. O problema aqui é que estaremos tentando usar StringReplacezeros e também o símbolo List(já que //@também passa pelas cabeças das expressões), então precisamos usar Check(como uma catchdeclaração em outras línguas) para evitar causar estragos com esses valores:

StringReplace[#,_->" "]~Check~#&//@...

5

Gelatina , 4 bytes

nOa⁶

Este é um link monádico. A impressão implícita de Jelly causa muitos respingos; para verificar se a saída é o que deveria ser, é possível visualizar a representação interna com ŒṘ. Observe que isso expõe as strings como listas de caracteres, e é assim que o interpretador Jelly as implementa.

Experimente online!

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

Eu estava esperando um APL aparecer. Agora, escolha um diferente para uma solução de 1 byte!
Adám 16/01/19

Graças a cabeça para cima, mas eu não tenho certeza se eu mesmo sei como representar [[["H"],"e",1,1,0],[[-3],"arth"]]em APL ...
Dennis

JSON2APLexpr←⎕SE.Dyalog.Utils.repObj 7159⌶ ⋄ JSON2APLexpr'[[["H"],"e",1,1,0],[[-3],"arth"]]'((,⊂,'H') (,'e') 1 1 0) ((,¯3) 'arth'). Para sua informação, 7159⌶estará ⎕JSONna versão 16.0.
Adám 16/01/19

O APL pode enfrentar qualquer JSON. No entanto, muitos dados da APL não podem ser representados sem ambiguidade no JSON.
Adám 16/01/19

Você acha que um código-golfe que envolve analisar ou talvez manipular matrizes de APL seria interessante?
Adám 17/01/19

5

Perl 6, 34 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
}

O .deepmap não funciona corretamente para entradas singulares como "X"ou 7, porque sempre retorna uma lista.
precisa saber é o seguinte

Droga, devo ter esquecido isso (ou a tarefa foi esclarecida mais tarde). Isso torna um pouco mais longo.
SMLS

3

GAP , 91 bytes

O GAP possui um método Zeroque retorna o elemento aditivo neutro correspondente a um elemento de uma estrutura aditiva. Que lida com números e até listas de números que são considerados vetores, mas não listas arbitrárias. Então, vamos adicionar esses e Chars e usar que Strings são listas de Chars:

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

(Não estou contando a nova linha, pois ela não é necessária.) É claro que isso está longe do uso pretendido Zeroe o GAP reclamaria se eu não tivesse usado o InstallOtherMethod . Agora eu posso fazer:

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

Eu não diria que o builtin faz a maior parte do trabalho; pode-se suspeitar que a escrita de uma função normal seja mais curta, mas minha melhor tentativa foi de 92 bytes:

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

2

Haskell, 115 bytes

Meu idioma não pode lidar com nenhuma combinação de números e seqüências de caracteres em listas (mas é claro que você pode definir um tipo de soma e colocá-lo em uma lista), e suas listas padrão não podem lidar com listas aninhadas de maneira diferente. Então, eu estou apenas fazendo o que ele pode suportar. Eu acho que isso não é injusto porque ainda é longo, e eu o faço principalmente para mostrar recursos de haskell que raramente são vistos em soluções de golfe com haskell. Observe que Strings são 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

Isso lida com qualquer número como Duplo:

*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!"]
["     ","      "]

1
Deve ser mais curto definir uma estrutura de dados com data N=S[Char]|I Int|L[N]uma função recursiva nela.
Zgarb 16/01/19

Você provavelmente está certo, eu acho, mas isso é menos interessante e ainda parece que realmente não está resolvendo o problema (eu admito que realmente esteja mais próximo). Vou deixar isso para outra pessoa.
Christian Sievers

inteiros ? E o caso de teste 3.?
Adám 16/01/19

@ Adám Oh, você está certo e, infelizmente, não posso afirmar que meu idioma não possui esse. Só posso lidar com duplas? Eu posso inseri-los sem ponto decimal.
Christian Sievers

@ChristianSievers Sim, tudo bem. Basicamente, você deve poder lidar com o que uma importação (se possível) do JSON fornecido fornecer.
Adám 16/01/19

2

PHP, 91 bytes

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

se o parâmetro for array: recurs usando array_map.
caso contrário, se o parâmetro for string: gere uma sequência de espaços com o mesmo comprimento.
mais 0.

is_stringeconomiza um byte is_numeric; negar is_array()torna parênteses obsoletos. Ao todo, são 17 bytes mais curtos do que if()recursion-loop;else x?string:numbercom uma chamada por referência.


2

Python 2, 59 bytes

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

usa a maneira do GB para determinar os tipos


2

 Lisp comum, 87

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

Ungolfed

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

Exemplo

> (c '((("H") "e" 1 1 0) ((-3) "arth")))
(((" ") " " 0 0 0) ((0) "    "))

1

Groovy, 53 bytes

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

Este é um fechamento sem nome. Experimente aqui!

Explicação :

O Groovy possui esse método .collectNestedque ajuda a percorrer uma lista como se ela fosse achatada.

Para lidar com casos especiais em que apenas um número inteiro ou uma string é passada sem uma lista, basta agrupar todas as entradas em uma lista e gerar o primeiro elemento.


1

Pyke, 8 bytes (versão antiga)

.FZ*0+d&

Explicação:

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

Isso não funciona mais como uma atualização, tornando-se falsificações de outros tipos em que há verdades convertidas automaticamente para o falsey do tipo verdade.


Claro que isso é aceitável.
Adám 16/01/19

1

C #, 197 195 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;};

Essa função manipula char, string, qualquer tipo de número builtin e matrizes recursiva.

Programa completo, auxiliar de saída ungolfed whit:

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();
    }
};

A usinginstrução é necessária apenas para o auxiliar de saída, não para a função real.

Experimente on-line


1

APL (Dyalog) 13.2 e anterior, 1 byte

Até e incluindo a versão 13.2, o monadic fazia exatamente isso. O comportamento antigo pode ser activada ajustando o ⎕ML( M igration L ível) a zero.

Experimente online!

Sem usar o comportamento antigo, são 4 bytes:

0⍴⊂

Experimente online!

 anexar

0⍴ faça uma lista de cópias com comprimento zero de toda a entrada (preserva apenas informações de estrutura e tipo)

 coagir um elemento disso (cria uma matriz prototípica)


0

Javascript ES6, 81 caracteres

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

Teste:

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)))


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 o adicionado \" e 'para imprimir de forma bonita a String e os caracteres.

Explicação:

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 do teste:

Experimente aqui.

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");}});}}));
  }
}

Saída:

""
0
0
' '
"  "
"   "
[]
[0]
["   "]
[' ', ' ', ' ']
[' ', 0, ' ', 0]
["   ", [0]]
[' ', ' ', ' ', [0]]
[[[' '], ' ', 0, 0, 0], [[0], "    "]]
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.