Trung hòa dữ liệu


22

Để trung hòa dữ liệu, hãy thay thế đệ quy tất cả các số (không phải chữ số!) Bằng số không và tất cả các ký tự (không phải chuỗi!) Bằng dấu cách.

Bạn phải chấp nhận bất kỳ số, ký tự hoặc chuỗi nào hoặc mảng đệ quy * của dữ liệu số / ký tự hỗn hợp mà ngôn ngữ của bạn có thể xử lý. Ví dụ: bạn phải chấp nhận các chuỗi thực tế (và không giới hạn đầu vào của bạn trong danh sách các ký tự đơn) nếu ngôn ngữ của bạn có thể xử lý như vậy.

Nếu ngôn ngữ của bạn chứa một tích hợp thực hiện tất cả hoặc hầu hết nhiệm vụ này, tôi sẽ đánh giá cao một phiên bản thay thế bổ sung mà không có nó.

Bài nộp ngắn nhất trong mỗi ngôn ngữ là một người chiến thắng và sẽ nhận được một upvote từ tôi.

Trường hợp mẫu

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

* Nếu ngôn ngữ của bạn có một số loại có thể biểu thị tốt các mảng như các ví dụ trên, bạn có thể chọn chỉ hỗ trợ một loại. Hai mục có thể giành chiến thắng, mặc dù chúng đang sử dụng cùng một ngôn ngữ, bởi mỗi mục có một loại dữ liệu khác nhau.


Điều gì xảy ra nếu ngôn ngữ của chúng tôi không phân biệt giữa các ký tự và chuỗi có độ dài 1?
xnor

@xnor AFAICT hiệu ứng sẽ giống nhau.
Adám

Ồ, tôi thấy rằng bây giờ từ các trường hợp thử nghiệm, nhưng đối với tôi nó không rõ ràng có nghĩa là lấy mọi phần tử chuỗi và thay thế từng ký tự của nó bằng khoảng trắng. Trên thực tế, tôi đã không giải thích rằng việc thay thế phải được thực hiện đệ quy cả. Thông số kỹ thuật nói về việc vô hiệu hóa một mảng, nhưng có vẻ như bạn muốn các phần tử đơn lẻ không nằm trong một mảng cũng được hành động?
xnor

@xnor Đúng. Hãy chỉnh sửa câu hỏi để phản ánh tốt hơn điều này.
Adám

Câu trả lời:


17

JavaScript (ES6), 53 47 byte

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

Các trường hợp thử nghiệm


Cuối cùng, một công dụng cho big()! Mặc dù, có lẽ bạn sẽ cung cấp bằng chứng trong tương lai tốt hơn bằng cách sử dụng raw().
Xù xì

@ Shaggy Hmm. Cú pháp nào bạn sẽ sử dụng với raw()? Tôi không nghĩ String.prototype.raw()là được xác định. Chỉ String.raw()
Arnauld

Ồ, vâng, xin lỗi.
Xù xì

7

Python 2 , 52 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Python cho phép bạn so sánh các loại khác nhau. Các kiểu số luôn nhỏ hơn các lần lặp và các lần lặp được sắp xếp theo tên loại của chúng, vì vậy

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

Bằng cách này, f làm như sau.

  • Nếu x là số x<{}trả về True1-(x<{})trả về 0 . Mã sau andkhông được thực thi.

  • Nếu x là iterable, 1-(x<{})trả về 1 (trung thực), do đó mã sau khi andđược thực thi.

    • Nếu x là một danh sách, x<''là đúng và f được ánh xạ qua các mục của nó.

    • Nếu x là một chuỗi, x<''là sai và x được thay thế bằng một chuỗi các khoảng trắng có cùng độ dài.


7

Ruby, 54 53 49 byte

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

Có lẽ có một cách tốt hơn, nhưng:

  • x * 0 == 0 cho số nguyên
  • x * 0 == "" cho chuỗi
  • x * 0 == [] cho mảng

Tài giỏi! Cảm ơn vì đã cho tôi một cách để xác định các loại trong Python!
TidB

nó không hoạt động đối với các ví dụ chuỗi và số bên ngoài một mảng, nhưng nếu bạn thay đổi a.mapthành chuỗi [*a].mapnhư mong đợi
Alexis Andersen

Điều này đã được sửa chữa, cảm ơn.
GB

6

Toán học, 51 byte

Hiện tại tôi đã có hai giải pháp về số byte này:

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

Cái thứ hai ném ra một loạt các cảnh báo có thể bỏ qua.

Giải trình

Trong cả hai trường hợp, chúng tôi bắt đầu bằng cách biến số thành số không với

#/._?NumberQ->0

Sau đó, để xử lý chuỗi, có hai tùy chọn. Hoặc, chúng tôi sử dụng một sự thay thế khác chỉ áp dụng cho chuỗi:

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

Hoặc, chúng tôi sử dụng MapAlltoán tử //@ánh xạ một hàm trên mỗi phần tử trong danh sách lồng nhau. Điều hấp dẫn ở đây là chúng ta sẽ cố gắng sử dụng các StringReplacesố không cũng như biểu tượng List(vì //@cũng đi qua các đầu của biểu thức), vì vậy chúng ta cần sử dụng Check(giống như một catchcâu trong các ngôn ngữ khác) để tránh gây ra sự tàn phá với những giá trị đó:

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

5

Thạch , 4 byte

nOa⁶

Đây là một liên kết đơn nguyên. In ấn ngầm của Jelly có rất nhiều hoạt động nối; để xác minh rằng đầu ra là như vậy, bạn có thể xem biểu diễn bên trong bằngŒṘ . Lưu ý rằng điều này hiển thị các chuỗi dưới dạng danh sách các ký tự, đó là cách trình thông dịch Jelly thực hiện chúng.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Tôi đã chờ đợi một APL xuất hiện. Bây giờ đã chọn một cái khác cho giải pháp 1 byte!
Adám

Cảm ơn vì đã ngẩng cao đầu, nhưng tôi không chắc mình thậm chí còn biết cách đại diện [[["H"],"e",1,1,0],[[-3],"arth"]]trong APL ...
Dennis

JSON2APLexpr←⎕SE.Dyalog.Utils.repObj 7159⌶ ⋄ JSON2APLexpr'[[["H"],"e",1,1,0],[[-3],"arth"]]'cho ((,⊂,'H') (,'e') 1 1 0) ((,¯3) 'arth'). FYI, 7159⌶sẽ có ⎕JSONtrong phiên bản 16.0.
Adám

APL có thể giải quyết bất kỳ JSON. Tuy nhiên, nhiều dữ liệu APL không thể được trình bày rõ ràng trong JSON.
Adám

Bạn có nghĩ rằng một golf-code bao gồm phân tích cú pháp hoặc có thể thao túng các mảng APL sẽ thú vị không?
Adám

5

Perl 6, 34 48 byte

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

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

Mở rộng:

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

Các .deepmap không hoạt động một cách chính xác cho các đầu vào số ít như "X"hoặc 7, bởi vì nó luôn luôn trả về một danh sách.
Brad Gilbert b2gills

Chết tiệt, tôi phải bỏ qua điều đó (hoặc nhiệm vụ đã được làm rõ sau). Điều này làm cho nó khá lâu hơn một chút.
cười

3

GAP , 91 byte

GAP có một phương thức Zerotrả về phần tử phụ gia trung tính tương ứng với một phần tử của cấu trúc phụ gia. Điều đó xử lý các số và thậm chí danh sách các số được coi là vectơ, nhưng không phải là danh sách tùy ý. Vì vậy, hãy thêm các ký tự này và sử dụng Chuỗi đó là danh sách các ký tự:

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

(Tôi không tính dòng mới vì nó không cần thiết.) Tất nhiên điều này khác xa với mục đích sử dụng Zerovà GAP sẽ khiếu nại nếu tôi không sử dụng InstallKhácMethod . Bây giờ tôi có thể làm:

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

Tôi sẽ không nói rằng phần mềm dựng sẵn thực hiện hầu hết công việc, người ta có thể nghi ngờ rằng việc viết một hàm bình thường nên ngắn hơn, nhưng cố gắng tốt nhất của tôi là nó dài 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

Ngôn ngữ của tôi không thể xử lý bất kỳ kết hợp số và chuỗi nào trong danh sách (nhưng tất nhiên bạn có thể xác định loại tổng và đưa nó vào danh sách) và danh sách tiêu chuẩn của nó không thể xử lý các danh sách lồng nhau khác nhau. Vì vậy, tôi chỉ làm những gì nó có thể xử lý. Tôi nghĩ điều đó không bất công vì nó vẫn còn dài và tôi chủ yếu làm điều đó để thể hiện các tính năng của haskell mà hiếm thấy trong các giải pháp chơi golf haskell. Lưu ý rằng Chuỗi là danh sách các ký tự.

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

Điều này xử lý bất kỳ số nào là 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
Nó nên ngắn hơn để xác định cấu trúc dữ liệu data N=S[Char]|I Int|L[N]và hàm đệ quy trên đó.
Zgarb

Tôi đoán có lẽ đúng, nhưng điều đó ít thú vị hơn và vẫn có vẻ như không thực sự giải quyết vấn đề (tôi thừa nhận nó thực sự gần hơn). Tôi sẽ để lại cho người khác.
Christian Sievers

số nguyên ? Làm thế nào về trường hợp thử nghiệm 3.?
Adám

@ Adám Oh bạn nói đúng, và thật không may, tôi không thể khẳng định ngôn ngữ của mình không có những thứ đó. Tôi chỉ có thể xử lý Đôi? Tôi có thể nhập chúng mà không có dấu thập phân.
Christian Sievers

@ChristianSievers Vâng, điều đó tốt. Về cơ bản, bạn sẽ có thể xử lý bất kỳ việc nhập nào (nếu có thể) từ JSON đã cho sẽ cung cấp cho bạn.
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);}

if tham số là mảng: recurse bằng cách sử dụng array_map.
khác nếu tham số là chuỗi: tạo một chuỗi các khoảng trắng có cùng độ dài.
khác0 .

is_stringtiết kiệm hơn một byte is_numeric; phủ định is_array()làm cho dấu ngoặc đơn lỗi thời. Hoàn toàn, nó ngắn hơn 17 byte so if()recursion-loop;else x?string:numbervới cuộc gọi bằng tham chiếu.


2

Python 2, 59 byte

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

sử dụng cách của GB để xác định loại


2

 Lisp thường gặp, 87

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

Bị đánh cắp

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

Thí dụ

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

Đây là một đóng cửa không tên. Hãy thử nó ở đây!

Giải trình :

Groovy có phương pháp này .collectNested này giúp lặp lại thông qua một danh sách như thể nó được làm phẳng.

Để xử lý các trường hợp đặc biệt khi chỉ có một số nguyên hoặc chuỗi được truyền mà không có danh sách, chỉ cần bọc mọi đầu vào vào danh sách và xuất phần tử đầu tiên.


1

Pyke, 8 byte (Phiên bản cũ)

.FZ*0+d&

Giải trình:

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

Điều này không còn hoạt động như một bản cập nhật làm cho nó trở nên giả tạo của các loại khác, nơi có những sự thật tự động chuyển thành chim ưng của loại sự thật.


Điều đó tất nhiên có thể chấp nhận được.
Adám

1

C #, 197 195 byte

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

Hàm này xử lý char, stringbất kỳ loại số dựng sẵn và mảng đệ quy.

Chương trình đầy đủ, trình trợ giúp đầu ra whit vô căn cứ:

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

Câu usinglệnh chỉ cần thiết cho trình trợ giúp đầu ra, không phải cho hàm thực tế.

Thử trực tuyến


1

APL (Dyalog) 13.2 trở về trước, 1 byte

Cho đến và bao gồm cả phiên bản 13.2, monadic đã làm chính xác điều này. Hành vi cũ có thể được kích hoạt bằng cách đặt ⎕ML( M igration L evel ) về 0.

Hãy thử trực tuyến!

Không sử dụng hành vi cũ, nó là 4 byte:

0⍴⊂

Hãy thử trực tuyến!

 kèm theo

0⍴ tạo một danh sách dài các bản sao của toàn bộ đầu vào (chỉ giữ lại thông tin cấu trúc và loại)

 ép buộc một yếu tố từ đó (tạo ra một mảng nguyên mẫu)


0

Javascript ES6, 81 ký tự

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

Kiểm tra:

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 cho thêm \"' in đẹp Chuỗi và ký tự.

Giải trình:

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

Mã kiểm tra:

Hãy thử nó ở đây.

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

Đầu ra:

""
0
0
' '
"  "
"   "
[]
[0]
["   "]
[' ', ' ', ' ']
[' ', 0, ' ', 0]
["   ", [0]]
[' ', ' ', ' ', [0]]
[[[' '], ' ', 0, 0, 0], [[0], "    "]]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.