Zneutralizuj dane

22

Aby zneutralizować dane, rekurencyjnie zamień wszystkie liczby (nie cyfry!) Zerami i wszystkie znaki (nie ciągi znaków!) Spacjami.

Musisz zaakceptować dowolny pojedynczy numer, znak lub ciąg znaków lub ewentualnie tablicę rekurencyjną * mieszanych danych liczbowych / znaków, które Twój język może obsłużyć. Na przykład musisz zaakceptować rzeczywiste ciągi znaków (i nie ograniczać wprowadzania danych do list pojedynczych znaków), jeśli Twój język to obsługuje.

Jeśli twój język zawiera wbudowaną funkcję, która wykonuje całość lub większość tego zadania, byłbym wdzięczny za dodatkową alternatywną wersję bez niego.

Najkrótsze zgłoszenie w każdym języku jest zwycięzcą i otrzyma ode mnie opinię.

Przykładowe przypadki

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

* Jeśli twój język ma kilka typów, które równie dobrze mogą reprezentować tablice jak powyższe przykłady, możesz wybrać obsługę tylko jednego. Dwa wpisy mogą wygrać, nawet jeśli używają tego samego języka, każdy z innym typem danych.

Adám
źródło
Co jeśli nasz język nie rozróżnia znaków od łańcuchów o długości 1?
xnor
@ xnor AFAICT efekt byłby taki sam.
Adám
Och, teraz to widzę z przypadków testowych, ale nie było dla mnie jasne, że chodziło o pobranie każdego elementu łańcucha i zastąpienie każdego z jego znaków spacjami. Właściwie nie zinterpretowałem, że zamiany należy w ogóle wykonywać rekurencyjnie. Specyfikacja mówi o zneutralizowaniu tablicy, ale wygląda na to, że chcesz, aby działały również pojedyncze elementy poza tablicą?
xnor
@xnor Prawidłowe. Edytuj pytanie, aby lepiej to odzwierciedlić.
Adám

Odpowiedzi:

17

JavaScript (ES6), 53 47 bajtów

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

Przypadki testowe

Arnauld
źródło
Wreszcie zastosowanie big()! Chociaż prawdopodobnie zapewniłbyś raw()zamiast tego lepsze zabezpieczenie na przyszłość .
Kudłaty
@Shaggy Hmm. Jakiej składni byś użył raw()? Nie sądzę, że String.prototype.raw()jest zdefiniowane. Tylko String.raw()jest.
Arnauld
O tak, przepraszam.
Kudłaty
7

Python 2 , 52 bajty

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

Wypróbuj online!

Jak to działa

Python pozwala porównywać różne typy. Typy liczbowe są zawsze mniejsze niż iterowalne, a iterowalne są sortowane według nazw typów, więc

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

W ten sposób f wykonuje następujące czynności.

  • Jeśli x jest liczbą, x<{}zwraca True i 1-(x<{})zwraca 0 . Kod po andnie zostanie wykonany.

  • Jeśli x jest iterowalny, 1-(x<{})zwraca 1 (prawda), więc kod po andwykonaniu zostaje wykonany.

    • Jeśli x jest listą, x<''jest prawdziwe, a f jest mapowane na jej elementy.

    • Jeśli x jest ciągiem, x<''oznacza fałsz, a x jest zastępowany ciągiem spacji o tej samej długości.

Dennis
źródło
7

Rubin, 54 53 49 bajtów

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

Może jest lepszy sposób, ale:

  • x * 0 == 0 dla liczb całkowitych
  • x * 0 == "" dla ciągów
  • x * 0 == [] dla tablic
GB
źródło
Sprytny! Dzięki, że dałeś mi również sposób na określenie typów w Pythonie!
TidB
nie działa dla przykładów ciągów i liczb spoza tablicy, ale jeśli zmienisz a.mapna [*a].mapto, działa zgodnie z oczekiwaniami
Alexis Andersen
Zostało to teraz naprawione, dzięki.
GB
6

Mathematica, 51 bajtów

Obecnie mam dwa rozwiązania w tej liczbie bajtów:

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

Drugi generuje kilka ostrzeżeń, które można zignorować.

Wyjaśnienie

W obu przypadkach zaczynamy od zamiany liczb na zera za pomocą

#/._?NumberQ->0

Następnie, aby przetworzyć ciąg, istnieją dwie opcje. Albo używamy innego podstawienia, które dotyczy tylko ciągów:

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

Lub używamy MapAlloperatora, //@który mapuje funkcję na każdy element na zagnieżdżonej liście. Problem polega na tym, że będziemy próbować używać zarówno StringReplacezer, jak i symbolu List(ponieważ //@również przechodzą przez głowy wyrażeń), więc musimy użyć Check(coś w rodzaju catchwyrażenia w innych językach), aby uniknąć spustoszenia te wartości:

StringReplace[#,_->" "]~Check~#&//@...
Martin Ender
źródło
5

Galaretka , 4 bajty

nOa⁶

To jest link monadyczny. Utajone drukowanie Jelly powoduje wiele rozprysków; aby sprawdzić, czy dane wyjściowe są takie, jakie powinny być, możesz wyświetlić wewnętrzną reprezentację za pomocą ŒṘ. Zauważ, że to odsłania ciągi jako listy znaków, i tak interpretuje je Jelly.

Wypróbuj online!

Jak to działa

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
źródło
Czekałem na pojawienie się APL. Teraz wybierz inne rozwiązanie 1-bajtowe!
Adám
Dzięki za heads-upy, ale nie jestem pewien, czy nawet wiem, jak reprezentować [[["H"],"e",1,1,0],[[-3],"arth"]]w APL ...
Dennis
JSON2APLexpr←⎕SE.Dyalog.Utils.repObj 7159⌶ ⋄ JSON2APLexpr'[[["H"],"e",1,1,0],[[-3],"arth"]]'daje ((,⊂,'H') (,'e') 1 1 0) ((,¯3) 'arth'). FYI, 7159⌶będzie ⎕JSONw wersji 16.0.
Adam
APL może poradzić sobie z dowolnym JSON. Jednak wiele danych APL nie może być jednoznacznie reprezentowanych w JSON.
Adám
Czy uważasz, że golf kodowy polegający na analizie składni lub manipulowaniu tablicami APL byłby interesujący?
Adám
5

Perl 6, 34 48 bajtów

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

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

Rozszerzony:

{                          # 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
źródło
.deepmap Nie działa poprawnie dla pojedynczych wejść podobnych "X"lub 7, ponieważ zawsze zwraca listę.
Brad Gilbert b2gills 16.01.17
Cholera, musiałem przeoczyć to (lub zadanie zostało wyjaśnione później). To sprawia, że ​​jest nieco dłuższy.
smls
3

GAP , 91 bajtów

GAP ma metodę, Zeroktóra zwraca neutralny element addytywny odpowiadający elementowi struktury addytywnej. To obsługuje liczby, a nawet listy liczb, które są uważane za wektory, ale nie listy arbitralne. Dodajmy więc te i Znaki i użyjmy, że Ciągi to listy Znaków:

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

(Nie liczę nowej linii, ponieważ nie jest potrzebna.) Oczywiście jest to dalekie od zamierzonego użycia Zero, a GAP narzekałby, gdybym nie użył InstallInnegoMethod . Teraz mogę zrobić:

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

Nie powiedziałbym, że wbudowane wykonuje większość zadań, można raczej podejrzewać, że pisanie normalnej funkcji powinno być krótsze, ale moja najlepsza próba zrobienia tego miała długość 92 bajtów:

f:=function(x)if IsInt(x)then return 0;elif IsList(x)then return List(x,f);fi;return' ';end;
Christian Sievers
źródło
2

Haskell, 115 bajtów

Mój język nie obsługuje żadnej kombinacji liczb i ciągów na listach (ale oczywiście możesz zdefiniować typ sumy i umieścić go na liście), a jego standardowe listy nie mogą obsługiwać list zagnieżdżonych w różny sposób. Więc robię to, co da się poradzić. Myślę, że to nie jest niesprawiedliwe, ponieważ wciąż jest długie i robię to głównie, aby pokazać cechy haskell, które rzadko są spotykane w rozwiązaniach golfowych haskell. Zauważ, że ciągi to listy znaków.

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

To obsługuje dowolną liczbę jako Double:

*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
źródło
1
Definiowanie struktury danych za data N=S[Char]|I Int|L[N]pomocą funkcji rekurencyjnej powinno być krótsze .
Zgarb
Chyba masz rację, ale jest to mniej interesujące i nadal wygląda na to, że tak naprawdę nie rozwiązuje problemu (przyznaję, że tak naprawdę jest bliżej). Zostawię to komuś innemu.
Christian Sievers
liczby całkowite ? Co powiesz na przypadek testowy 3.?
Adám
@ Adám Och, masz rację i niestety nie mogę twierdzić, że mój język ich nie ma. Czy mogę obsługiwać tylko gry podwójne? Mogę wprowadzić je bez kropki dziesiętnej.
Christian Sievers
@ChristianSievers Tak, w porządku. Zasadniczo powinieneś być w stanie obsłużyć wszystko, co da import (jeśli to możliwe) z podanego JSON.
Adám
2

PHP, 91 bajtów

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

jeśli parametrem jest tablica: użyj rekurencji array_map.
w przeciwnym razie, jeśli parametr jest łańcuchem: wygeneruj ciąg spacji o tej samej długości.
indziej 0.

is_stringoszczędza jeden bajt is_numeric; negowanie is_array()powoduje, że nawiasy stają się przestarzałe. W sumie jest 17 bajtów krótszych niż if()recursion-loop;else x?string:numberw przypadku wywołania przez odniesienie.

Tytus
źródło
2

Python 2, 59 bajtów

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

używa sposobu GB do określania typów

ovs
źródło
2

 Common Lisp, 87

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

Nie golfił

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

Przykład

> (c '((("H") "e" 1 1 0) ((-3) "arth")))
(((" ") " " 0 0 0) ((0) "    "))
rdzeń rdzeniowy
źródło
1

Groovy, 53 bajty

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

To jest nienazwane zamknięcie. Wypróbuj tutaj!

Objaśnienie :

Groovy ma tę metodę, .collectNestedktóra pomaga iterować listę tak, jakby była spłaszczona.

Aby obsłużyć specjalne przypadki, w których przekazywana jest tylko liczba całkowita lub ciąg znaków bez listy, po prostu zawiń wszystkie dane wejściowe do listy i wyślij pierwszy element.

Gurupad Mamadapur
źródło
1

Pyke, 8 bajtów (stara wersja)

.FZ*0+d&

Wyjaśnienie:

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

To nie działa już jako aktualizacja, dlatego falsi innych typów, w których istnieją prawdy, automatycznie przekształcają się w falsey typu prawdomównego.

niebieski
źródło
To oczywiście dopuszczalne.
Adám
1

C #, 197 195 bajtów

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

Funkcja ta obsługuje char, stringkażdy rodzaj i numer wbudowane rekurencyjne tablice.

Pełny program, pomocnik bez wyjściowego 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();
    }
};

usingOświadczenie jest potrzebne tylko dla pomocnika wyjściowej, a nie do rzeczywistej funkcji.

Wypróbuj online

raznagul
źródło
1

APL (Dyalog) 13.2 i wcześniejsze, 1 bajt

Aż do wersji 13.2 włącznie, monadic robił dokładnie to. Stary zachowanie może być aktywowany przez ustawienie ⎕ML( M igration L PECJALNOŚĆ) do zera.

Wypróbuj online!

Bez użycia starego zachowania ma 4 bajty:

0⍴⊂

Wypróbuj online!

 ująć

0⍴ sporządzić listę kopii całego wejścia o zerowej długości (zachowuje tylko informacje o strukturze i typie)

 wymuś z tego jeden element (tworzy tablicę prototypową)

Adám
źródło
0

JavaScript ES6, 81 znaków

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

Test:

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
źródło
0

Java 7, 262 (268) bajtów

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 dla dodanych \" i 'ładnie wydrukować Łańcuch i znaki.

Wyjaśnienie:

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

Kod testowy:

Wypróbuj tutaj.

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

Wydajność:

""
0
0
' '
"  "
"   "
[]
[0]
["   "]
[' ', ' ', ' ']
[' ', 0, ' ', 0]
["   ", [0]]
[' ', ' ', ' ', [0]]
[[[' '], ' ', 0, 0, 0], [[0], "    "]]
Kevin Cruijssen
źródło