Netralkan data


22

Untuk menetralkan data, ganti semua angka (bukan angka!) Secara rekursif dengan nol dan semua karakter (bukan string!) Dengan spasi.

Anda harus menerima nomor tunggal, karakter, atau string, atau mungkin array * rekursif dari data numerik / karakter campuran yang dapat ditangani oleh bahasa Anda. Misalnya, Anda harus menerima string aktual (dan tidak membatasi input Anda ke daftar karakter tunggal) jika bahasa Anda dapat menangani hal itu.

Jika bahasa Anda berisi built-in yang melakukan semua atau sebagian besar tugas ini, saya akan menghargai versi alternatif tambahan tanpa itu.

Pengajuan terpendek dalam setiap bahasa adalah pemenang, dan akan menerima upvote dari saya.

Contoh kasus

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

* Jika bahasa Anda memiliki beberapa jenis yang dapat mewakili array dengan baik seperti contoh di atas, Anda dapat memilih untuk mendukung satu saja. Dua entri dapat keduanya menang, meskipun mereka menggunakan bahasa yang sama, masing-masing dengan tipe data yang berbeda.


Bagaimana jika bahasa kita tidak membedakan antara karakter dan string panjang-1?
xnor

@xnatau AFAICT efeknya akan sama.
Adám

Oh, saya melihat itu sekarang dari test case, tetapi tidak jelas bagi saya bahwa itu berarti mengambil setiap elemen string dan mengganti masing-masing karakter dengan spasi. Sebenarnya, saya tidak menafsirkan bahwa penggantian harus dilakukan secara rekursif sama sekali. Spek berbicara tentang menetralkan array, tetapi sepertinya Anda ingin elemen tunggal tidak dalam array yang akan ditindaklanjuti juga?
xnor

@ xnor Benar. Jangan ragu untuk mengedit pertanyaan untuk mencerminkan hal ini dengan lebih baik.
Adám

Jawaban:


17

JavaScript (ES6), 53 47 byte

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

Uji kasus


Akhirnya, gunakan untuk big()! Meskipun demikian, Anda mungkin akan menggunakan pemeriksaan kedepan yang lebih baik raw().
Shaggy

@Shaggy Hmm. Sintaks mana yang akan Anda gunakan raw()? Saya tidak berpikir String.prototype.raw()didefinisikan. Hanya String.raw()itu.
Arnauld

Oh, ya, maaf.
Shaggy

7

Python 2 , 52 byte

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

Cobalah online!

Bagaimana itu bekerja

Python memungkinkan Anda membandingkan berbagai jenis. Tipe numerik selalu lebih kecil dari iterables, dan iterables diurutkan berdasarkan nama tipenya

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

Dengan cara ini, f melakukan yang berikut.

  • Jika x adalah numerik x<{}mengembalikan Benar dan 1-(x<{})mengembalikan 0 . Kode setelah anditu tidak dieksekusi.

  • Jika x iterable, 1-(x<{})mengembalikan 1 (benar), jadi kode setelahand dieksekusi.

    • Jika x adalah daftar, x<''itu benar dan f dipetakan di atas item-itemnya.

    • Jika x adalah string, x<''salah dan x diganti dengan string spasi dengan panjang yang sama.


7

Ruby, 54 53 49 byte

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

Mungkin ada cara yang lebih baik, tetapi:

  • x * 0 == 0 untuk bilangan bulat
  • x * 0 == "" untuk string
  • x * 0 == [] untuk array

Pintar! Terima kasih telah memberi saya cara untuk menentukan jenis Python juga!
TidB

itu tidak bekerja untuk string dan nomor contoh luar array, tetapi jika Anda mengubah a.mapuntuk [*a].mapbekerja seperti yang diharapkan
Alexis Andersen

Ini sudah diperbaiki sekarang, terima kasih.
GB

6

Mathematica, 51 byte

Saat ini saya punya dua solusi pada hitungan byte ini:

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

Yang kedua melempar banyak peringatan yang bisa diabaikan.

Penjelasan

Dalam kedua kasus, kita mulai dengan mengubah angka menjadi nol

#/._?NumberQ->0

Kemudian untuk memproses string, ada dua opsi. Baik, kami menggunakan subtitusi lain yang hanya berlaku untuk string:

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

Atau, kami menggunakan MapAlloperator //@yang memetakan fungsi pada setiap elemen dalam daftar bersarang. Tangkapan di sini adalah bahwa kita akan mencoba untuk menggunakan StringReplacepada nol serta simbol List(karena //@juga melewati kepala ekspresi), jadi kita perlu menggunakan Check(semacam seperti catchpernyataan dalam bahasa lain) untuk menghindari menimbulkan kekacauan dengan nilai-nilai itu:

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

5

Jelly , 4 byte

nOa⁶

Ini adalah tautan monadik. Pencetakan tersirat Jelly melakukan banyak percikan; untuk memverifikasi bahwa output adalah apa yang seharusnya, Anda dapat melihat representasi internal ŒṘ. Perhatikan bahwa ini memperlihatkan string sebagai daftar karakter, yang adalah bagaimana penerjemah Jelly mengimplementasikannya.

Cobalah online!

Bagaimana itu bekerja

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.

Saya sedang menunggu APL untuk muncul. Sekarang pilih yang berbeda untuk solusi 1-byte!
Adám

Terima kasih untuk yang hadir, tetapi saya tidak yakin saya tahu bagaimana cara mewakili [[["H"],"e",1,1,0],[[-3],"arth"]]dalam APL ...
Dennis

JSON2APLexpr←⎕SE.Dyalog.Utils.repObj 7159⌶ ⋄ JSON2APLexpr'[[["H"],"e",1,1,0],[[-3],"arth"]]'memberi ((,⊂,'H') (,'e') 1 1 0) ((,¯3) 'arth'). FYI, 7159⌶akan berada ⎕JSONdi versi 16.0.
Adám

APL dapat menangani JSON apa pun. Namun, banyak data APL tidak dapat diwakili secara jelas di JSON.
Adám

Apakah Anda pikir kode-golf yang melibatkan parsing atau memanipulasi array APL akan menarik?
Adám

5

Perl 6, 34 48 byte

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

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

Diperluas:

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

Tidak .deepmap berfungsi dengan benar untuk input tunggal seperti "X"atau 7, karena selalu mengembalikan Daftar.
Brad Gilbert b2gills

Sial, saya harus mengabaikan itu (atau tugas itu diklarifikasi nanti). Ini membuatnya sedikit lebih lama.
smls

3

GAP , 91 byte

GAP memiliki metode Zeroyang mengembalikan elemen aditif netral yang sesuai dengan elemen struktur aditif. Itu menangani angka dan bahkan daftar angka yang dianggap vektor, tetapi bukan daftar arbitrer. Jadi mari kita tambahkan ini dan Chars dan gunakan bahwa Strings adalah daftar Chars:

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

(Saya tidak menghitung baris baru karena tidak diperlukan.) Tentu saja ini jauh dari penggunaan yang dimaksudkan Zero, dan GAP akan mengeluh jika saya tidak menggunakanInstall LainMethod . Sekarang saya bisa melakukan:

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

Saya tidak akan mengatakan bahwa builtin melakukan sebagian besar pekerjaan, orang mungkin lebih curiga bahwa menulis fungsi normal harus lebih pendek, tetapi upaya terbaik saya adalah 92 byte:

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

2

Haskell, 115 byte

Bahasa saya tidak dapat menangani campuran angka dan string dalam daftar (tetapi tentu saja Anda dapat menentukan jenis penjumlahan dan memasukkannya ke dalam daftar), dan daftar standarnya tidak dapat menangani daftar bersarang yang berbeda. Jadi saya hanya melakukan apa yang bisa ditangani. Saya pikir itu tidak adil karena masih panjang, dan saya terutama melakukannya untuk menunjukkan fitur haskell yang jarang terlihat dalam solusi golf haskell. Perhatikan bahwa String adalah daftar Chars.

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

Ini menangani angka berapa pun sebagai Dobel:

*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
Seharusnya lebih pendek untuk mendefinisikan struktur data dengan data N=S[Char]|I Int|L[N]dan fungsi rekursif.
Zgarb

Anda mungkin benar saya kira, tapi itu kurang menarik dan masih terlihat tidak benar-benar menyelesaikan masalah (saya akui itu sebenarnya lebih dekat). Saya akan meninggalkan itu untuk orang lain.
Christian Sievers

bilangan bulat ? Bagaimana dengan test case 3.?
Adám

@ Adám Oh Anda benar, dan sayangnya saya tidak bisa mengklaim bahasa saya tidak memilikinya. Bisakah saya menangani Doubles saja? Saya dapat memasukkannya tanpa titik desimal.
Christian Sievers

@ChristianSievers Ya, tidak apa-apa. Pada dasarnya, Anda harus dapat menangani impor apa pun (jika mungkin) dari JSON yang diberikan.
Adám

2

PHP, 91 byte

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

jika parameter array: menggunakan berulang array_map.
lain jika parameter adalah string: menghasilkan string spasi dengan panjang yang sama.
lain 0.

is_stringmenghemat satu byte lebih is_numeric; meniadakan is_array()menjadikan tanda kurung sudah usang. Secara keseluruhan 17 byte lebih pendek dari if()recursion-loop;else x?string:numberdengan panggilan dengan referensi.


2

Python 2, 59 byte

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

menggunakan cara GB untuk menentukan jenis


2

 Common Lisp, 87

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

Tidak disatukan

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

Contoh

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

1

Groovy, 53 byte

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

Ini adalah penutupan tanpa nama. Coba di sini!

Penjelasan :

Groovy memiliki metode ini .collectNested yang membantu untuk beralih melalui daftar seolah-olah itu diratakan.

Untuk menangani kasus khusus di mana hanya bilangan bulat atau string dilewatkan tanpa daftar, cukup bungkus setiap input ke dalam daftar dan output elemen pertama.


1

Pyke, 8 byte (Versi lama)

.FZ*0+d&

Penjelasan:

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

Ini tidak lagi berfungsi sebagai pembaruan yang membuatnya sangat palsu dari jenis lain di mana ada kebenaran yang secara otomatis dikonversi ke jenis kesalahan dari kebenaran.


Itu tentu saja bisa diterima.
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;};

Fungsi ini menangani char,, stringsemua tipe angka bawaan dan array rekursif.

Program lengkap, helper output tidak ungolfed:

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

The usingpernyataan hanya diperlukan untuk penolong output, bukan untuk fungsi sebenarnya.

Coba Online


1

APL (Dyalog) 13.2 dan sebelumnya, 1 byte

Sampai dan termasuk versi 13.2, monadik melakukan ini. Perilaku lama dapat diaktifkan dengan menetapkan ⎕ML( M igration L Evel) ke nol.

Cobalah online!

Tanpa menggunakan perilaku lama, 4 byte:

0⍴⊂

Cobalah online!

 melampirkan

0⍴ buat daftar panjang-nol salinan dari seluruh input (hanya mempertahankan struktur dan jenis info)

 memaksa satu elemen dari itu (membuat array prototipikal)


0

Javascript ES6, 81 karakter

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

Uji:

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

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 untuk ditambahkan \"dan 'untuk mencetak String dan karakter.

Penjelasan:

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

Kode uji:

Coba di sini.

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

Keluaran:

""
0
0
' '
"  "
"   "
[]
[0]
["   "]
[' ', ' ', ' ']
[' ', 0, ' ', 0]
["   ", [0]]
[' ', ' ', ' ', [0]]
[[[' '], ' ', 0, 0, 0], [[0], "    "]]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.