データを無効化


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つのみをサポートすることを選択できます。同じ言語を使用している場合でも、それぞれ異なるデータ型を使用することで、2つのエントリが両方とも勝つことができます。


私たちの言語が文字と長さ-1の文字列を区別しないとどうなりますか?
-xnor

@xnor AFAICTの効果は同じです。
アダム

ああ、今はテストケースからそれを見ることができますが、すべての文字列要素を取得し、その各文字をスペースに置き換えることを意味するのは明確ではありませんでした。実際、私は置換を再帰的に行う必要があるとはまったく解釈しませんでした。仕様では配列の無効化について説明していますが、配列内にない単一の要素にも同様に作用するように見えますか?
-xnor

@xnor正しい。これをよりよく反映するために、質問を自由に編集してください。
アダム

回答:


17

JavaScript(ES6)、53 47バイト

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

テストケース


最後に、big()!ただし、raw()代わりに使用することで、将来のプルーフを改善することができます。
シャギー

@Shaggyうーん。どの構文を使用しraw()ますか?String.prototype.raw()定義されているとは思わない。のみString.raw()です。
アーナウド

ああ、はい、ごめんなさい。
シャギー

7

Python 2、52バイト

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

オンラインでお試しください!

使い方

Pythonでは、さまざまなタイプを比較できます。数値型は常にイテラブルよりも小さく、イテラブルは型名でソートされるため、

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

このようにして、fは次のことを行います。

  • xの場合数値でx<{}戻って1-(x<{})返します0。後のコードandは実行されません。

  • もし xが反復可能な、1(真)を1-(x<{})返すため、後のコードが実行されます。and

    • xがリストの場合、x<''trueであり、fはそのアイテムにマッピングされます。

    • xが文字列の場合、x<''はfalseであり、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 == []配列の場合

賢い!Pythonで型を決定する方法を提供してくれてありがとう!
TidB

配列外の文字列と数値の例では機能しませんが、変更a.mapする[*a].mapと期待どおりに動作します
アレクシスアンデルセン

この問題は修正されました、ありがとう。
GB

6

Mathematica、51バイト

現在、このバイト数で2つのソリューションがあります。

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

2番目は、無視できる警告の束を投げます。

説明

いずれの場合でも、最初に数字をゼロに変えることから始めます

#/._?NumberQ->0

次に、文字列を処理するには、2つのオプションがあります。どちらか、文字列にのみ適用される別の置換を使用します。

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

または、ネストされたリスト内のすべての要素に関数をマッピングするMapAll演算子を使用し//@ます。ここでの漁獲量は、我々が使用しようとするだろうということであるStringReplaceゼロのと同様に、シンボルList(以降//@、我々が使用する必要があるので、また、式の頭部を通過)Check(ソートのようcatchに大混乱をwreaking避けるために、他の言語での文)それらの値:

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

5

ゼリー、4バイト

nOa⁶

これは単項リンクです。Jellyの暗黙的な印刷では、大量のスプラッティングが行われます。出力が本来あるべきものであることを確認するには、で内部表現を表示できますŒṘ。これは文字列を文字のリストとして公開することに注意してください。これは、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でどのように表現するかさえわからない
デニス

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に取り組むことができます。ただし、APLデータの多くをJSONで明確に表すことはできません。
アダム

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

くそー、私はそれを見落としたにちがいない(またはタスクは後で明らかにされた)。これにより、かなり長くなります。
sml

3

GAP、91バイト

GAPにはZero、加法構造の要素に対応するニュートラル加法要素を返すメソッドがあります。それは数字とベクトルと見なされる数字のリストさえも処理しますが、任意のリストは処理しません。それでは、これらとCharを追加して、文字列がCharのリストであることを使用してみましょう。

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

(改行は必要ないので数えていません。)もちろん、これはの意図した使用からはほど遠いものでZero、GAPは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

Haskell、115バイト

私の言語は、リスト内の数字と文字列の組み合わせを処理できません(ただし、もちろん、合計タイプを定義してリストに入れることができます)。また、その標準リストは、ネストの異なるリストを処理できません。だから私はそれが処理できることをやっています。私はそれがまだ長いので不公平ではないと思います、そして私は主にhaskellゴルフソリューションでめったに見られないhaskellの特徴を示すためにそれをします。文字列はCharのリストであることに注意してください。

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]その上に再帰関数を定義する方が短いはずです。
ズガーブ

あなたはおそらく正しいと思いますが、それはあまり面白くなく、実際に問題を実際に解決していないように見えます(実際には近いと認めます)。私はそれを他の誰かに任せます。
クリスチャンジーバーズ

整数?テストケース3はどうですか?
アダム

@Adámそうですね、残念ながら私の言語にはそれらがないとは言えません。Doublesのみを処理できますか?小数点なしで入力できます。
クリスチャンシーバーズ

@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ます。
elseパラメータが文字列の場合:同じ長さのスペースの文字列を生成します。
その他0

is_string1バイト節約し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

 Common 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#、197 195バイト

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任意の組み込み数タイプと再帰アレイ。

完全なプログラム、未出力のwhit出力ヘルパー:

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 がまさにこれを行いました。古い動作を設定することによって活性化することができる⎕MLM igrationのLをゼロにEVELを)。

オンラインでお試しください!

古い動作を使用しない場合、4バイトです。

0⍴⊂

オンラインでお試しください!

 同封する

0⍴ 入力全体のコピーの長さゼロのリストを作成します(構造と型情報のみを保持します)

 その中から1つの要素を強制します(典型的な配列を作成します)


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], "    "]]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.