中和数据


22

要中和数据,请将所有数字(非数字!)递归替换为零,并将所有字符(非字符串!)替换为空格。

您必须接受您的语言可以处理的任何单个数字,字符或字符串,或者可能是混合数字/字符数据的递归数组*。例如,如果您的语言可以处理,则必须接受实际的字符串(而不是将输入限制为单个字符的列表)。

如果您的语言包含一个内置的程序,可以完成所有或大部分任务,那么不提供该程序的话,我将不胜感激。

每种语言中提交时间最短的作品都是获胜者,我会收到我的支持。

样品盒

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

*如果您的语言有多种类型,可以像上面的示例一样很好地表示数组,则可以选择仅支持一种。即使两个条目使用相同的语言,也可以通过使用不同的数据类型来赢得两个条目。


如果我们的语言不能区分字符和长度为1的字符串怎么办?
xnor

@xnor AFAICT的效果将相同。
亚当

哦,我现在从测试用例中看到了这一点,但是我不清楚这是否意味着要获取每个字符串元素并将其每个字符替换为空格。实际上,我完全没有解释过必须以递归方式进行替换。规范讨论的是中和数组,但是您似乎希望不对数组中的单个元素也起作用?
xnor

@xnor正确。随时编辑问题以更好地反映这一点。
亚当

Answers:


17

JavaScript(ES6),53 47字节

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

测试用例


最后,用于big()!虽然,您可能会raw()改用更好的面向未来的方法。
毛茸茸的

@蓬松的嗯。您将使用哪种语法raw()?我认为String.prototype.raw()没有定义。只有String.raw()
Arnauld

哦,是的,很抱歉。
毛茸茸的

7

Python 2,52字节

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

在线尝试!

怎么运行的

Python使您可以比较不同的类型。数值类型总是小于可迭代的,并且可迭代按其类型名称排序,因此

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

这样,f执行以下操作。

  • 如果x为数字,则x<{}返回True,1-(x<{})返回0。之后的代码and不执行。

  • 如果x是可迭代的,则1-(x<{})返回1(真实),因此and执行后的代码。

    • 如果x是一个列表,x<''则为true,并且f映射到其项目上。

    • 如果x是字符串,x<''则为false,并且x被长度相同的空格替换。


7

Ruby,54 53 49字节

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

也许有更好的方法,但是:

  • x * 0 == 0表示整数
  • x * 0 ==“”表示字符串
  • x * 0 == []用于数组

聪明!感谢您也给我提供了一种确定Python类型的方法!
TidB

它不适用于数组外部的字符串和数字示例,但如果按预期进行更改a.map[*a].map则可以正常工作
Alexis Andersen

谢谢,现在已解决此问题。
GB

6

Mathematica,51个字节

我目前在此字节数下有两种解决方案:

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

第二个引发一堆警告,可以忽略。

说明

无论哪种情况,我们都先将数字变成零

#/._?NumberQ->0

然后要处理字符串,有两个选项。要么,我们使用另一个仅适用于字符串的替换:

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

或者,我们使用MapAll运算符//@,该运算符将函数映射到嵌套列表中的每个单个元素上。这里要注意的是,我们将尝试使用StringReplace零以及符号List(因为它//@也贯穿表达式的头部),因此我们需要使用Check(类似于catch其他语言中的语句)以避免对这些值:

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

5

果冻,4字节

nOa⁶

这是一个单子链接。果冻的隐式印刷会产生很多飞溅。要验证输出是否正确,可以使用查看内部表示ŒṘ。请注意,这会将字符串显示为字符列表,这是Jelly解释器实现它们的方式。

在线尝试!

怎么运行的

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.

我在等待APL的到来。现在为1字节解决方案选择一个不同的解决方案!
亚当

感谢您的单挑,但我不确定我什至不知道如何[[["H"],"e",1,1,0],[[-3],"arth"]]在APL中代表...
Dennis

JSON2APLexpr←⎕SE.Dyalog.Utils.repObj 7159⌶ ⋄ JSON2APLexpr'[[["H"],"e",1,1,0],[[-3],"arth"]]'((,⊂,'H') (,'e') 1 1 0) ((,¯3) 'arth')。仅供参考,7159⌶⎕JSON在16.0版中。
亚当

APL可以处理任何JSON。但是,不能在JSON中明确表示很多APL数据。
亚当

您认为涉及解析或操纵APL数组的代码高尔夫球会有趣吗?
亚当

5

Perl 6,34 48字节

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

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

展开:

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

.deepmap 像奇异的投入不能正常工作"X"或者7,因为它总是返回一个列表。
布拉德·吉尔伯特b2gills

达恩,我一定忽略了这一点(或稍后对任务进行了澄清)。这使得它更长。
smls

3

GAP,91字节

GAP具有一种Zero返回与添加结构元素相对应的中性添加元素的方法。处理数字,甚至是被视为向量的数字列表,但不能处理任意列表。因此,让我们将这些和Chars相加,并使用Strings作为Chars的列表:

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

(由于不需要,所以我不算换行符。)当然,这与的预期用途相去甚远Zero,如果我未使用InstallOther,GAP会抱怨Method。现在我可以做:

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

我不会说内置函数可以完成大部分工作,而您可能会怀疑编写普通函数应该更短,但是我的最佳尝试是将其写成92个字节长:

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

2

Haskell,115个字节

我的语言无法处理列表中数字和字符串的任何混合(但是您当然可以定义一个求和类型并将其放入列表中),并且它的标准列表不能处理不同的嵌套列表。所以我只是在尽力而为。我认为这并不公平,因为它仍然很长,我主要是为了显示haskell高尔夫球解决方案中很少见的haskell功能。请注意,字符串是字符列表。

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

这可以将任何数字作为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
定义具有data N=S[Char]|I Int|L[N]和递归函数的数据结构应该更短一些。
Zgarb

我猜您可能是对的,但这没那么有趣,而且看起来仍然无法真正解决问题(我承认它实际上更接近)。我会留给别人。
Christian Sievers

整数?测试用例3怎么样?
亚当

@Adám哦,您是对的,很遗憾,我不能声称我的语言没有这些。我只能处理双打吗?我可以输入不带小数点的数字。
Christian Sievers

@ChristianSievers是的,很好。基本上,您应该能够处理从给定JSON提供的任何导入(如果可能)。
亚当

2

PHP,91字节

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

如果参数是数组:使用递归array_map
否则,如果参数是字符串:生成具有相同长度的空格字符串。
否则0

is_string节省一个字节is_numeric; 取反is_array()会导致括号过时。总共比if()recursion-loop;else x?string:number引用调用短17个字节。


2

Python 2,59个字节

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

使用GB的方法确定类型


2

 常见的Lisp,87

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

不打高尔夫球

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

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

1

Groovy,53个字节

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

这是一个未命名的闭包。 在这里尝试!

说明

Groovy具有此方法.collectNested,可以像遍历列表一样迭代列表。

要处理仅传递整数或字符串而没有列表的特殊情况,只需将每个输入包装到列表中并输出第一个元素。


1

Pyke,8个字节 (旧版本)

.FZ*0+d&

说明:

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

这不再作为更新工作,从而使存在真相的其他类型的虚假自动转换为真类型的假。


当然可以接受。
亚当

1

C#,197195字节

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

这个函数处理charstring任何内置数字类型和递归数组。

完整程序,无高尔夫的白色输出帮助器:

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

using语句仅用于输出帮助器,而对于实际功能则不需要。

在线尝试


1

APL(Dyalog) 13.2和更早版本,1字节

直到并包括13.2版,monadic 才做到这一点。旧的行为可以通过设置来激活⎕ML中号 igration 大号伊维尔基尼)到零。

在线尝试!

如果不使用旧行为,则为4个字节:

0⍴⊂

在线尝试!

 括

0⍴ 创建整个输入的副本的零长度列表(仅保留结构和类型信息)

 从中强制一个元素(创建一个原型数组)


0

Javascript ES6,81个字符

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

测试:

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)个字节

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用于添加\"'漂亮地打印字符串和字符。

说明:

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

测试代码:

在这里尝试。

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

输出:

""
0
0
' '
"  "
"   "
[]
[0]
["   "]
[' ', ' ', ' ']
[' ', 0, ' ', 0]
["   ", [0]]
[' ', ' ', ' ', [0]]
[[[' '], ' ', 0, 0, 0], [[0], "    "]]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.