Verileri nötrleştir


22

Verileri etkisiz hale getirmek için, tüm sayıları (rakam değil!) Sıfırlarla ve tüm karakterleri (karakter dizileri değil!) Boşluklarla tekrar tekrar değiştirin.

Dilinizin işleyebileceği karışık sayısal / karakter verilerinin tek bir sayı, karakter veya dize veya muhtemelen özyinelemeli dizisini * kabul etmelisiniz. Örneğin, diliniz böyle yapabilirse gerçek dizeleri kabul etmelisiniz (ve girişinizi tek karakterli listelerle sınırlamamalısınız).

Diliniz, bu görevin tamamını veya çoğunu yapan yerleşik bir dil içeriyorsa, onsuz ek bir alternatif sürüm için teşekkür ederim.

Her dilde en kısa teslim bir kazanan ve benden bir oy alacak.

Örnek vaka

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

* Dilinizde, yukarıdaki örneklere benzer dizileri eşit derecede iyi temsil edebilen birkaç tür varsa, yalnızca birini desteklemeyi seçebilirsiniz. Her ikisi de farklı bir veri türüne göre aynı dili kullanmasına rağmen iki giriş kazanabilir.


Dilimiz karakterlerle uzunluk-1 dizeleri arasında ayrım yapmazsa ne olur?
xnor

@xnor AFAICT etkisi aynı olacaktır.
Adám

Oh, şimdi test senaryolarından anlıyorum, ancak her string elemanını alıp karakterlerinin her birini boşluklarla değiştirmek olduğu açık değildi. Aslında, değiştirmelerin tekrarlı bir şekilde yapılması gerektiğini yorumlamadım. Teknik özellikler bir diziyi etkisiz hale getirmekten bahsediyor, ancak bir dizideki olmayan tek öğelerin de etkilenmesini istiyor gibisiniz?
xnor

@xnor Doğru. Bunu daha iyi yansıtmak için soruyu düzenlemek için çekinmeyin.
09

Yanıtlar:


17

JavaScript (ES6), 53 47 bayt

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

Test durumları


Sonunda, bir kullanım big()! Bununla birlikte, muhtemelen raw()bunun yerine daha iyi bir gelecek geçirmezlik sağlarsınız .
Shaggy

@Shaggy Hmm. Hangi sözdizimini kullanırsınız raw()? String.prototype.raw()Tanımlanmış olduğunu sanmıyorum . Sadece String.raw().
Arnauld,

Evet, özür dilerim.
Shaggy

7

Python 2 , 52 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Python farklı türleri karşılaştırmanıza izin verir. Sayısal türler her zaman yinelemelerden daha küçüktür ve yinelemeler tür adlarına göre sıralanır;

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

Bu şekilde, f aşağıdakileri yapar.

  • Eğer x sayısal ise x<{}, True1-(x<{}) döndürür ve 0 döndürür . Sonra kod andyürütülemez.

  • Eğer x yinelenebilirse, 1 (truthy) 1-(x<{})döndürür , yani sonraki kodand çalıştırılır.

    • Eğer x bir liste ise x<'', true olur ve f , ögeleri üzerinde eşlenir.

    • Eğer x bir string ise x<'', false olur ve x aynı uzunluktaki boşluklardan oluşan bir string ile değiştirilir.


7

Ruby, 54 53 49 bayt

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

Belki daha iyi bir yol vardır, ama:

  • tamsayılar için x * 0 == 0
  • dizeler için x * 0 == ""
  • x * 0 == [] diziler için

Zeki! Python'da da türler belirlemenin bir yolunu verdiğiniz için teşekkür ederiz!
TidB

Bir dizinin dize ve sayı örnekleri dışarıdan değil çalışır, ancak değiştirme eğer a.mapiçin [*a].mapkendisine beklendiği gibi çalıştığını
Alexis Andersen

Bu şimdi düzeltildi, teşekkürler.
TR

6

Mathematica, 51 bayt

Şu anda bu bayt sayısında iki çözüm var:

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

İkincisi ise ihmal edilebilecek bir sürü uyarı atıyor.

açıklama

Her iki durumda da, rakamları sıfırla sıfırlayarak başlıyoruz.

#/._?NumberQ->0

Sonra dizeyi işlemek için iki seçenek vardır. Her iki durumda da, yalnızca dizeler için geçerli olan başka bir değişiklik kullanıyoruz:

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

Ya da iç içe geçmiş bir listede her bir öğenin üzerinde bir işlev haritalayan MapAllişleci kullanırız //@. Burada yakalamak Kullandığımız çalışıyor olacağım olmasıdır StringReplaceyanı sembolü olarak sıfırı List(beri //@de ifadelerin başları geçer) biz kullanımına gerek bu yüzden, Check(çeşit bir benzeri catchile tahribata neden önlemek için diğer dillerde açıklamada) bu değerler:

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

5

Jöle , 4 bayt

nOa⁶

Bu monadik bir bağlantıdır. Jelly'in örtülü baskısı çok fazla sıçrama yapıyor; Çıktının olması gerektiği gibi olduğunu doğrulamak için iç gösterimi ile görüntüleyebilirsiniz ŒṘ. Bunun, dizeleri karakter listeleri olarak gösterdiğini ve Jelly yorumlayıcısının bunları nasıl uyguladığını not edin.

Çevrimiçi deneyin!

Nasıl çalışır

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.

Bir APL'nin gelmesini bekliyordum. Şimdi 1 baytlık bir çözüm için farklı bir tane seçtim!
17’de

Başınız için teşekkürler, ama [[["H"],"e",1,1,0],[[-3],"arth"]]APL'de nasıl temsil edileceğimi bile bildiğimden emin değilim ...
Dennis

JSON2APLexpr←⎕SE.Dyalog.Utils.repObj 7159⌶ ⋄ JSON2APLexpr'[[["H"],"e",1,1,0],[[-3],"arth"]]'verir ((,⊂,'H') (,'e') 1 1 0) ((,¯3) 'arth'). Bilginize, 7159⌶olacak ⎕JSONsürümü 16.0 yılında.
Adám

APL herhangi bir JSON ile başa çıkabilir. Bununla birlikte, bol miktarda APL verisi JSON'da açıkça gösterilemez.
Adám

APL dizilerini ayrıştırma veya belki de manipüle etmeyi içeren bir kod golfünün ilginç olacağını düşünüyor musunuz?
09

5

Perl 6, 34 48 bayt

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

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

Expanded:

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

Her zaman bir Listeyi döndürdüğü için, veya .deepmap gibi tekil girişler için doğru çalışmaz . "X"7
Brad Gilbert

Kahretsin, bunu göz ardı etmiş olmalıyım (veya görev daha sonra açıklığa kavuşturuldu). Bu biraz daha uzun yapar.
17'de sml

3

GAP , 91 bayt

GAP, Zerobir katkı yapısının bir elemanına karşılık gelen nötr katkı elemanını geri döndüren bir yönteme sahiptir. Bu sayıları ve hatta vektör olarak kabul edilen sayıları listeler, ancak isteğe bağlı listeleri değil. Öyleyse bunları ve Karakterleri ekleyelim ve Dizelerin Karakter listesi olarak kullanalım:

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

(Newline'ı gerekmediği gibi saymıyorum.) Elbette bu kullanım amacından çok uzakta Zerove GAP, InstallOther kullanmamış olsaydı şikayet ederdi Method. Şimdi yapabilirim:

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

Yerleşimin işin çoğunu yaptığını söyleyemem, normal bir işlev yazmanın daha kısa olması gerektiğinden şüphelenebilirim, ama en iyi denemem 92 bayt uzunluğundaydı:

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

2

Haskell, 115 bayt

Dilim, listelerdeki sayıların ve dizelerin herhangi bir karışımını işleyemez (ancak elbette bir toplam türü tanımlayabilir ve bunu bir listeye koyabilirsiniz) ve standart listeleri farklı iç içe geçmiş listeleri işleyemez. Bu yüzden sadece elinden geleni yapıyorum. Bunun haksızlık olduğunu düşünüyorum çünkü hala uzun ve haskell golf çözümlerinde nadiren görülen haskell özelliklerini göstermek için yapıyorum. Dizelerin Karakterlerin listesi olduğunu unutmayın.

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

Bu, herhangi bir sayıyı Çift olarak işler:

*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
Bununla bir veri yapısını data N=S[Char]|I Int|L[N]ve özyinelemeli bir işlevi tanımlamak daha kısa olmalıdır .
Zgarb

Muhtemelen haklısın sanırım, ama bu daha az ilginç ve hala sorunu çözmüyor gibi görünüyor (aslında daha yakın olduğunu kabul ediyorum). Bunu başkası için bırakacağım.
Christian Sievers

tamsayılar ? Test durum 3 hakkında nasıl?
Ad

@ Adám Oh haklısınız ve maalesef dilimin olmadığını söyleyemem. Sadece çiftleri idare edebilir miyim? Onları ondalık sayı olmadan girebilirim.
Christian Sievers

@HristiyanSievers Evet, sorun değil. Temel olarak, verilen JSON’dan alacağınız bir ithalatı (mümkünse) size ne olursa olsun halledebilmelisiniz.
Ad

2

PHP, 91 bayt

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

Parametre dizi ise: kullanarak tekrar array_map.
else parametresi string ise: aynı uzunlukta boşluk dizeleri oluşturur.
Başka 0.

is_stringbir bayttan daha fazla tasarruf sağlar is_numeric; olumsuzlayan is_array(), parantezin kullanılmasını engeller. Toplamda 17 bayt if()recursion-loop;else x?string:numberreferanstan daha kısadır .


2

Python 2, 59 bayt

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

GB türlerini belirlemek için yolunu kullanır


2

 Common Lisp, 87

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

Ungolfed

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

Örnek

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

1

Groovy, 53 bayt

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

Bu isimsiz bir kapanış. Burada dene!

Açıklama :

Groovy bu yönteme sahiptir .collectNested , düzleştirilmiş gibi bir listede yinelenmeye yardımcı olan sahiptir.

Yalnızca bir tamsayı veya bir dize liste olmadan iletilen özel durumları ele almak için, her girişi bir listeye sarın ve ilk öğeyi çıktılayın.


1

Pyke, 8 bayt (Eski versiyon)

.FZ*0+d&

Açıklama:

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

Bu artık bir güncelleme olarak işe yaramaz, böylece gerçeklerin olduğu diğer türlerin sahteciliği otomatik olarak gerçeğin türünün sahteliğine dönüşür.


Bu elbette kabul edilebilir.
18’de

1

C #, 197 195 Bayt

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

Bu fonksiyon char,string yerleşik sayı türlerini ve özyinelemeli dizileri .

Tam program, ungolfed katiyen çıkış yardımcısı:

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İfadesi sadece gerçek fonksiyonu için, çıkış yardımcı için gereklidir.

Çevrimiçi dene


1

APL (Dyalog) 13.2 ve önceki, 1 bayt

13.2 versiyonuna kadar ve monadiç bunu aynen yaptı. Eski davranış konumu ile aktive edilebilir ⎕ML( M igration L sıfıra evel).

Çevrimiçi deneyin!

Eski davranış kullanmadan 4 bayttır:

0⍴⊂

Çevrimiçi deneyin!

 kuşatmaktadırlar

0⍴ girişin tamamının kopyalarının uzunluk-sıfır listesini yapın (sadece yapı ve tip bilgisini korur)

 ondan bir elementi zorla (prototipik bir dizi oluşturur)


0

Javascript ES6, 81 karakter

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

Ölçek:

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

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?"' '":"";}

Katma için + 6 282 \"ve 'Dize ve karakterleri oldukça bastırabilecek.

Açıklama:

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

Test kodu:

Burada dene.

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

Çıktı:

""
0
0
' '
"  "
"   "
[]
[0]
["   "]
[' ', ' ', ' ']
[' ', 0, ' ', 0]
["   ", [0]]
[' ', ' ', ' ', [0]]
[[[' '], ' ', 0, 0, 0], [[0], "    "]]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.