데이터 중화


22

데이터를 무효화하려면 모든 숫자 (숫자가 아님)를 0으로, 문자열이 아닌 모든 문자를 공백으로 재귀 적으로 바꿉니다.

언어에서 처리 할 수있는 단일 숫자, 문자 또는 문자열 또는 혼합 된 숫자 / 문자 데이터의 재귀 배열 *을 허용해야합니다. 예를 들어, 언어에서 처리 할 수있는 경우 실제 문자열을 수락하고 입력을 단일 문자 목록으로 제한하지 않아야합니다.

귀하의 언어에이 작업의 전부 또는 대부분을 수행하는 내장 기능이 포함되어 있다면, 추가 기능이없는 다른 대체 버전에 감사하겠습니다.

각 언어로 된 가장 짧은 제출물은 승자이며 나에게 찬성표를받습니다.

샘플 사례

  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 효과는 동일합니다.
Adám

오, 나는 지금 테스트 사례에서 그것을 보았지만 모든 문자열 요소를 가져 와서 각 문자를 공백으로 바꾼다는 것이 분명하지 않았습니다. 실제로 교체를 재귀 적으로 수행해야한다는 것을 해석하지 못했습니다. 사양은 배열을 중화하는 것에 대해 이야기하지만 배열에없는 단일 요소가 작동하는 것처럼 보입니까?
xnor

@xnor 맞습니다. 이를 반영하기 위해 질문을 자유롭게 편집하십시오.
Adám

답변:


17

자바 스크립트 (ES6), 53 47 바이트

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

테스트 사례


마지막으로 big()! 그러나 raw()대신에 더 나은 미래 보장 기능을 제공 할 것입니다 .
Shaggy

@Shaggy Hmm. 어떤 구문을 사용 raw()하시겠습니까? 나는 String.prototype.raw()정의 되지 않았다고 생각 합니다. 만 String.raw()입니다.
Arnauld

오, 미안
얽히고 설킨 Shake

7

파이썬 2 , 52 바이트

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

온라인으로 사용해보십시오!

작동 원리

파이썬을 사용하면 다른 유형을 비교할 수 있습니다. 숫자 형은 항상 이터 러블보다 작으며 이터 러블은 타입 이름별로 정렬되므로

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

이런 식으로 f 는 다음을 수행합니다.

  • 경우 X는 숫자입니다 x<{}반환 진정한1-(x<{})반환 0 . 이후 코드 and는 실행되지 않습니다.

  • x 가 반복 가능한 경우 1 (truthy)을 1-(x<{})반환 하므로 이후 코드 가 실행됩니다.and

    • 경우 x는 목록입니다, x<''사실 및 F는 해당 항목에 매핑됩니다.

    • 경우 X는 문자열이며, x<''거짓이고 , X는 동일한 길이의 공간의 스트링으로 대체된다.


7

루비, 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 == []

영리한! 파이썬에서 유형을 결정할 수있는 방법을 주셔서 감사합니다!
TidB

이 배열의 문자열과 숫자 예제 외부에하지 작업을 수행하지만 변경하는 경우 a.map[*a].map그 예상대로 작동
알렉시스 안데르센

이것은 이제 고쳐졌습니다.
GB

6

수학, 51 바이트

현재이 바이트 수에 두 가지 솔루션이 있습니다.

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

두 번째 경고는 무시할 수있는 많은 경고를 발생시킵니다.

설명

어쨌든, 우리는 숫자를 0으로 바꾸는 것으로 시작합니다.

#/._?NumberQ->0

그런 다음 문자열을 처리하기 위해 두 가지 옵션이 있습니다. 문자열에만 적용되는 다른 대체 방법을 사용합니다.

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

또는 중첩 목록의 모든 단일 요소에 함수를 매핑하는 MapAll연산자 //@를 사용 합니다. 여기 캐치는 우리가 사용하려고 할 것이 오 StringReplace뿐만 아니라 상징으로 제로에 List(이후 //@또한 표현의 장 통과) 우리가 사용할 필요가 있으므로, Check(일종의 유사한의 catch와 혼란을 wreaking 피하기 위해 다른 언어 문) 그 값들 :

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 바이트 솔루션으로 다른 것을 선택했습니다!
Adám

머리를 내밀어 주셔서 감사합니다.하지만 [[["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'). 참고로 16.0 버전 7159⌶이 될 것 ⎕JSON입니다.
Adám

APL은 모든 JSON을 처리 할 수 ​​있습니다. 그러나 많은 APL 데이터가 JSON으로 명확하게 표현 될 수는 없습니다.
Adám

APL 배열을 파싱하거나 조작하는 코드 골프가 흥미로울 것이라고 생각하십니까?
Adám

5

펄 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

Darn, 나는 그것을 간과 했어야했다 (또는 그 과제는 나중에 명확 해졌다). 이것은 꽤 길어집니다.
smls

3

간격 , 91 바이트

GAP에는 Zero첨가제 구조의 요소에 해당하는 중립 첨가제 요소를 반환 하는 방법 이 있습니다. 이것은 숫자로 간주되며 임의의 목록이 아닌 벡터로 간주되는 숫자 목록을 처리합니다. 이것들과 Chars를 추가하고 그 문자열을 Chars의 목록으로 사용합시다 :

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

(필요하지 않기 때문에 줄 바꿈을 세지 않습니다.) 물론 이것은 의도 된 용도와는 거리가 멀고 ZeroGAP는 InstallOther를 사용하지 않으면 불평 할 것 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

하스켈, 115 바이트

내 언어는 목록에서 숫자와 문자열의 혼합을 처리 할 수 ​​없습니다 (물론 합계 유형을 정의하고 목록에 넣을 수 있음) 표준 목록은 다르게 중첩 된 목록을 처리 할 수 ​​없습니다. 그래서 나는 처리 할 수있는 일을하고 있습니다. 나는 그것이 여전히 길기 때문에 불공평하지 않다고 생각하며, 주로 하스켈 골프 솔루션에서 거의 보이지 않는 하스켈의 기능을 보여주기 위해 수행합니다. 문자열은 문자 목록입니다.

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

@ Adám 아, 맞다. 불행히도 나는 내 언어에 그런 언어가 없다고 주장 할 수 없다. 복식 만 처리 할 수 ​​있습니까? 소수점없이 입력 할 수 있습니다.
Christian Sievers

@ChristianSievers 네, 좋습니다. 기본적으로 주어진 JSON에서 가져 오기 (가능한 경우)가 제공하는 모든 것을 처리 할 수 ​​있어야합니다.
Adám

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_string1 바이트를 절약합니다 is_numeric. 부정 is_array()하면 괄호가 더 이상 사용되지 않습니다. 전체적으로 if()recursion-loop;else x?string:number참조에 의한 호출 보다 17 바이트가 짧습니다 .


2

파이썬 2, 59 바이트

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

GB의 방법을 사용하여 유형을 결정합니다.


2

 커먼 리스프, 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

그루비, 53 바이트

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

이것은 이름이없는 폐쇄입니다. 여기 사용해보십시오!

설명 :

Groovy에는 .collectNested목록이 평평한 것처럼 목록을 반복하는 데 도움 이 되는 이 방법 이 있습니다.

목록없이 정수 또는 문자열 만 전달되는 특수한 경우를 처리하려면 모든 입력을 목록으로 랩핑하고 첫 번째 요소를 출력하십시오.


1

파이크, 8 바이트 (이전 버전)

.FZ*0+d&

설명:

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

이것은 더 이상 업데이트로 작동하지 않으므로 진실이있는 다른 유형의 거짓이 자동으로 진실 유형의 거짓으로 변환됩니다.


물론 허용됩니다.
Adám

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

이 기능은 핸들 char, string어떤 내장 번호 유형 및 순환 배열.

전체 프로그램, 골프화되지 않은 오순절 출력 도우미 :

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( M igration의 L의 제로 레벨 레벨을).

온라인으로 사용해보십시오!

이전 동작을 사용하지 않으면 4 바이트입니다.

0⍴⊂

온라인으로 사용해보십시오!

 넣다

0⍴ 전체 입력 사본의 길이가 0 인 목록을 작성합니다 (구조 및 유형 정보 만 유지).

 그것으로부터 하나의 요소를 강요하다 (원형 배열을 만든다)


0

자바 스크립트 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], "    "]]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.