Daten neutralisieren


22

Um Daten zu neutralisieren, ersetzen Sie rekursiv alle Zahlen (keine Ziffern!) Durch Nullen und alle Zeichen (keine Zeichenketten!) Durch Leerzeichen.

Sie müssen eine einzelne Zahl, ein Zeichen oder eine Zeichenfolge oder möglicherweise ein rekursives Array * gemischter Zahlen- / Zeichendaten akzeptieren, die Ihre Sprache verarbeiten kann. Beispielsweise müssen Sie tatsächliche Zeichenfolgen akzeptieren (und Ihre Eingabe nicht auf Listen mit einzelnen Zeichen beschränken), wenn Ihre Sprache eine solche verarbeiten kann.

Wenn Ihre Sprache ein eingebautes Programm enthält, das alle oder die meisten dieser Aufgaben erledigt, würde ich eine zusätzliche alternative Version ohne dieses Programm begrüßen.

Die kürzeste Einsendung in jeder Sprache ist ein Gewinner und wird von mir positiv bewertet.

Beispielfälle

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

* Wenn Ihre Sprache über mehrere Typen verfügt, die Arrays wie die obigen Beispiele darstellen können, können Sie sich dafür entscheiden, nur einen zu unterstützen. Zwei Einträge können beide gewinnen, obwohl sie dieselbe Sprache verwenden, indem sie jeweils einen anderen Datentyp verwenden.


Was ist, wenn unsere Sprache nicht zwischen Zeichen und Zeichenfolgen der Länge 1 unterscheidet?
16.

@xnor AFAICT wäre der Effekt der gleiche.
Adám

Oh, das sehe ich jetzt an den Testfällen, aber mir war nicht klar, dass jedes Zeichenkettenelement durch Leerzeichen ersetzt werden sollte. Eigentlich habe ich nicht ausgelegt, dass die Ersetzungen überhaupt rekursiv erfolgen müssen. In der Spezifikation wird über die Neutralisierung eines Arrays gesprochen, aber es sieht so aus, als ob einzelne Elemente in einem Array nicht auch bearbeitet werden sollen.
16.

@xnicht korrekt. Sie können die Frage auch bearbeiten, um dies besser widerzuspiegeln.
Adám

Antworten:


17

JavaScript (ES6), 53.47 Byte

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

Testfälle


Endlich eine Verwendung für big()! Obwohl Sie raw()stattdessen wahrscheinlich eine bessere Zukunftssicherheit bieten würden .
Shaggy

@ Shaggy Hmm. Mit welcher Syntax würden Sie arbeiten raw()? Ich glaube nicht, dass String.prototype.raw()es definiert ist. Nur String.raw()ist.
Arnauld

Oh ja, entschuldigung.
Shaggy

7

Python 2 , 52 Bytes

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

Probieren Sie es online!

Wie es funktioniert

Mit Python können Sie verschiedene Typen vergleichen. Numerische Typen sind immer kleiner als iterables, und iterables werden nach ihren Typnamen sortiert

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

Auf diese Weise führt f Folgendes aus.

  • Wenn x numerisch x<{}kehrt Wahr und 1-(x<{})kehrt 0 . Der Code danach andwird nicht ausgeführt.

  • Wenn x ist iterable, 1-(x<{})kehrt 1 (truthy), so dass der Code nach andwird ausgeführt.

    • Wenn x eine Liste ist, x<''ist es wahr und f wird über seine Elemente abgebildet.

    • Wenn x eine Zeichenkette ist, x<''ist es false und x wird durch eine Zeichenkette mit der gleichen Länge ersetzt.


7

Ruby, 54 53 49 Bytes

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

Vielleicht gibt es einen besseren Weg, aber:

  • x * 0 == 0 für ganze Zahlen
  • x * 0 == "" für Zeichenfolgen
  • x * 0 == [] für Arrays

Klug! Vielen Dank, dass Sie mir die Möglichkeit gegeben haben, Typen auch in Python zu bestimmen!
Dienstag,

Es funktioniert nicht für die String- und Number-Beispiele außerhalb eines Arrays, aber wenn Sie es ändern a.map, [*a].mapfunktioniert es wie erwartet
Alexis Andersen

Dies wurde jetzt behoben, danke.
GB

6

Mathematica, 51 Bytes

Ich habe derzeit zwei Lösungen bei dieser Byteanzahl:

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

Der zweite löst eine Reihe von Warnungen aus, die ignoriert werden können.

Erläuterung

In beiden Fällen beginnen wir damit, die Zahlen mit Nullen zu versehen

#/._?NumberQ->0

Dann gibt es zwei Möglichkeiten, um die Zeichenfolge zu verarbeiten. Entweder verwenden wir eine andere Ersetzung, die nur für Zeichenfolgen gilt:

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

Oder wir verwenden den MapAllOperator, //@der eine Funktion über jedes einzelne Element in einer verschachtelten Liste abbildet. Der Haken hier ist, dass wir versuchen werden, sowohl StringReplaceNullen als auch das Symbol zu verwenden List(da dies //@auch durch die Köpfe der Ausdrücke geht), also müssen wir Check(eine Art catchAussage in anderen Sprachen) verwenden, um zu verhindern, dass Chaos entsteht diese Werte:

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

5

Gelee , 4 Bytes

nOa⁶

Dies ist eine monadische Verbindung. Jellys implizites Drucken macht viel Spaß; Um zu überprüfen, ob die Ausgabe so ist, wie sie sein sollte, können Sie die interne Darstellung mit anzeigen ŒṘ. Beachten Sie, dass auf diese Weise Zeichenfolgen als Listen von Zeichen verfügbar gemacht werden, wie sie vom Jelly-Interpreter implementiert werden.

Probieren Sie es online!

Wie es funktioniert

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.

Ich wartete darauf, dass eine APL auftauchte. Wählen Sie jetzt eine andere für eine 1-Byte-Lösung!
Adám

Vielen Dank für das Heads-up, aber ich bin mir nicht sicher, wie ich es [[["H"],"e",1,1,0],[[-3],"arth"]]in APL darstellen soll ...
Dennis

JSON2APLexpr←⎕SE.Dyalog.Utils.repObj 7159⌶ ⋄ JSON2APLexpr'[[["H"],"e",1,1,0],[[-3],"arth"]]'gibt ((,⊂,'H') (,'e') 1 1 0) ((,¯3) 'arth'). Zu Ihrer Information, 7159⌶wird ⎕JSONin Version 16.0 sein.
Adám

APL kann jeden JSON anpacken. Viele APL-Daten können jedoch in JSON nicht eindeutig dargestellt werden.
Adám

Denken Sie, dass ein Code-Golf, der das Parsen oder vielleicht das Manipulieren von APL-Arrays beinhaltet, interessant wäre?
Adám

5

Perl 6, 34 48 Bytes

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

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

Erweitert:

{                          # 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
}

Das .deepmap funktioniert bei singulären Eingaben wie "X"oder nicht richtig 7, da es immer eine Liste zurückgibt.
Brad Gilbert b2gills

Verdammt, ich muss das übersehen haben (oder die Aufgabe wurde später geklärt). Das macht es ziemlich viel länger.
smls

3

SPALT , 91 Bytes

GAP verfügt über eine Methode Zero, die das neutrale additive Element zurückgibt, das einem Element einer additiven Struktur entspricht. Das behandelt Zahlen und gerade Listen von Zahlen, die als Vektoren betrachtet werden, aber keine willkürlichen Listen. Also lassen Sie uns diese und Zeichen hinzufügen und verwenden, dass Strings Listen von Zeichen sind:

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

(Ich zähle den Zeilenumbruch nicht, da er nicht benötigt wird.) Natürlich ist dies weit entfernt von der beabsichtigten Verwendung von Zero, und GAP würde sich beschweren, wenn ich nicht InstallOther verwendet hätteMethod . Jetzt kann ich tun:

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

Ich würde nicht sagen, dass das eingebaute Programm den größten Teil der Arbeit erledigt, man könnte eher vermuten, dass das Schreiben einer normalen Funktion kürzer sein sollte, aber mein bester Versuch, dies zu tun, war 92 Bytes lang:

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

2

Haskell, 115 Bytes

Meine Sprache kann keine Mischung aus Zahlen und Zeichenfolgen in Listen verarbeiten (aber Sie können natürlich einen Summentyp definieren und diesen in eine Liste einfügen), und ihre Standardlisten können keine unterschiedlich verschachtelten Listen verarbeiten. Also mache ich einfach, was es kann. Ich denke, das ist nicht unfair, weil es immer noch lang ist, und ich mache es hauptsächlich, um Features von Haskell zu zeigen, die in Haskell-Golflösungen selten zu finden sind. Beachten Sie, dass Strings Listen von Zeichen sind.

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

Dies behandelt eine beliebige Zahl als 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!"]
["     ","      "]

1
Es sollte kürzer sein, eine Datenstruktur mit data N=S[Char]|I Int|L[N]und eine rekursive Funktion darauf zu definieren.
Zgarb

Vermutlich haben Sie recht, aber das ist weniger interessant und scheint das Problem nicht wirklich zu lösen (ich gebe zu, es ist tatsächlich näher). Ich überlasse das jemand anderem.
Christian Sievers

ganze Zahlen ? Wie wäre es mit Testfall 3.?
Adám

@ Adám Oh du hast recht, und ich kann leider nicht behaupten, dass meine Sprache diese nicht hat. Kann ich nur mit Doppel umgehen? Ich kann sie ohne Komma eingeben.
Christian Sievers

@ ChristianSievers Ja, das ist in Ordnung. Grundsätzlich sollten Sie in der Lage sein, jeden Import (wenn möglich) von der angegebenen JSON-Version durchzuführen.
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);}

Wenn der Parameter ein Array ist: rekursiv mit array_map.
sonst, wenn der Parameter string ist: Erzeugt eine Folge von Leerzeichen mit der gleichen Länge.
sonst 0.

is_stringspart ein Byte mehr is_numeric; Negieren is_array()macht Klammern überflüssig. Insgesamt sind es 17 Bytes kürzer als if()recursion-loop;else x?string:numberbei einem Call by Reference.


2

Python 2, 59 Bytes

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

Verwendet die Methode von GB, um Typen zu bestimmen


2

 Common Lisp, 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))))

Beispiel

> (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]}

Dies ist eine namenlose Schließung. Probieren Sie es hier aus!

Erläuterung :

Groovy verfügt über diese Methode, mit .collectNestedder Sie eine Liste durchlaufen können, als wäre sie reduziert.

Um spezielle Fälle zu behandeln, in denen nur eine Ganzzahl oder eine Zeichenfolge ohne Liste übergeben wird, müssen Sie einfach jede Eingabe in eine Liste einschließen und das erste Element ausgeben.


1

Pyke, 8 Bytes (Alte Version)

.FZ*0+d&

Erläuterung:

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

Dies funktioniert nicht mehr, da ein Update dazu geführt hat, dass Falschdarstellungen anderer Typen, bei denen es Wahrheiten gibt, automatisch in die Falschdarstellung des Wahrheitstyps konvertiert werden.


Das ist natürlich akzeptabel.
Adám

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

Diese Funktion verarbeitet char, stringjeder builtin Nummerntyp und rekursive Arrays.

Volles Programm, ungolfed mit Ausgabehilfe:

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

Die usingAnweisung wird nur für die Ausgabehilfe benötigt, nicht für die eigentliche Funktion.

Versuchen Sie es online


1

APL (Dyalog) 13.2 und früher, 1 Byte

Bis einschließlich Version 13.2 hat monadic genau dies getan. Das alte Verhalten kann durch Setzen aktiviert werden ⎕ML( M igration L evel) auf Null.

Probieren Sie es online!

Ohne altes Verhalten sind es 4 Bytes:

0⍴⊂

Probieren Sie es online!

 umschließen

0⍴ Erstellt eine Liste der Kopien der gesamten Eingabe mit der Länge Null (behält nur Struktur- und Typinformationen bei)

 ein Element daraus erzwingen (ein prototypisches Array erstellen)


0

Javascript ES6, 81 Zeichen

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

Prüfung:

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 für das hinzugefügte \"und' hübschen Ausdruck der Zeichenfolge und der Zeichen.

Erläuterung:

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

Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

""
0
0
' '
"  "
"   "
[]
[0]
["   "]
[' ', ' ', ' ']
[' ', 0, ' ', 0]
["   ", [0]]
[' ', ' ', ' ', [0]]
[[[' '], ' ', 0, 0, 0], [[0], "    "]]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.