ทำให้ข้อมูลเป็นกลาง


22

ในการทำให้ข้อมูลเป็นกลางให้แทนที่ตัวเลขทั้งหมด (ไม่ใช่ตัวเลข!) ซ้ำด้วยค่าศูนย์และอักขระทั้งหมด (ไม่ใช่สตริง!) ด้วยช่องว่าง

คุณต้องยอมรับตัวเลขตัวอักษรหรือสตริงใด ๆ หรืออาเรย์แบบเรียกซ้ำ * ของข้อมูลตัวเลข / ตัวละครผสมที่ภาษาของคุณสามารถจัดการได้ ตัวอย่างเช่นคุณต้องยอมรับสตริงจริง (และไม่ จำกัด การป้อนข้อมูลของคุณไปยังรายการอักขระเดี่ยว) หากภาษาของคุณสามารถจัดการได้

หากภาษาของคุณมีอยู่แล้วภายในซึ่งทำหน้าที่ทั้งหมดหรือส่วนใหญ่ฉันจะขอบคุณรุ่นอื่นที่ไม่มีตัวเลือก

การส่งที่สั้นที่สุดในแต่ละภาษาเป็นผู้ชนะและจะได้รับ upvote จากฉัน

กรณีตัวอย่าง

  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 ถูกต้อง อย่าลังเลที่จะแก้ไขคำถามเพื่อสะท้อนสิ่งนี้ดีกว่า
อดัม

ขอให้เรายังคงอภิปรายนี้ในการแชท
Adám

คำตอบ:


17

JavaScript (ES6), 53 47 ไบต์

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

กรณีทดสอบ


ในที่สุดใช้สำหรับbig()! แม้ว่าคุณอาจจะให้การพิสูจน์อักษรในอนาคตดีขึ้นโดยใช้raw()แทน
Shaggy

@Shaggy อืม คุณจะใช้ไวยากรณ์แบบraw()ไหน ฉันไม่คิดว่าString.prototype.raw()จะมีคำจำกัดความ อย่างเดียวString.raw()คือ
Arnauld

โอ้ใช่ขอโทษ
Shaggy

7

Python 2 , 52 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

Python ให้คุณเปรียบเทียบประเภทที่แตกต่างกัน ประเภทที่เป็นตัวเลขนั้นเล็กกว่า iterables เสมอและ iterables จะเรียงตามชื่อประเภทดังนั้น

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

วิธีนี้fทำสิ่งต่อไปนี้

  • ถ้าxเป็นตัวเลขx<{}ผลตอบแทนที่แท้จริงและ1-(x<{})ผลตอบแทน0 รหัสหลังจากandไม่ได้รับการดำเนินการ

  • ถ้าxสามารถทำซ้ำได้1-(x<{})จะส่งคืน1 (ความจริง) ดังนั้นโค้ดหลังจากandเรียกใช้งาน

    • หากxคือรายการx<''เป็นจริงและ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⁶

นี่คือลิงค์ monadic การพิมพ์โดยปริยายของเยลลี่ทำรอยแตกเยอะ ŒṘเพื่อตรวจสอบว่าการส่งออกคือสิ่งที่มันควรจะเป็นคุณสามารถดูการแสดงภายในด้วย โปรดทราบว่าสิ่งนี้จะแสดงสตริงเป็นรายการของตัวละครซึ่งเป็นสิ่งที่ล่ามของเยลลี่นำมาใช้

ลองออนไลน์!

มันทำงานอย่างไร

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 ...
เดนนิส

JSON2APLexpr←⎕SE.Dyalog.Utils.repObj 7159⌶ ⋄ JSON2APLexpr'[[["H"],"e",1,1,0],[[-3],"arth"]]'((,⊂,'H') (,'e') 1 1 0) ((,¯3) 'arth')จะช่วยให้ FYI 7159⌶จะเป็น⎕JSONเวอร์ชัน 16.0
อดัม

APL สามารถใช้งาน JSON ได้ อย่างไรก็ตามข้อมูล APL มากมายไม่สามารถแสดงได้อย่างไม่น่าสงสัยใน JSON
อดัม

คุณคิดว่า code-golf ที่เกี่ยวข้องกับการแยกวิเคราะห์หรือจัดการกับอาร์เรย์ 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ที่ส่งคืนองค์ประกอบการเติมเป็นกลางที่สอดคล้องกับองค์ประกอบของโครงสร้างการเติม ที่จัดการตัวเลขและแม้กระทั่งรายการของตัวเลขซึ่งถือว่าเป็นเวกเตอร์ แต่ไม่ใช่รายการที่กำหนดเอง ดังนั้นให้เพิ่มสิ่งเหล่านี้และตัวอักษรและใช้ Strings เป็นรายการของตัวอักษร:

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

(ฉันไม่นับการขึ้นบรรทัดใหม่ในขณะที่มันไม่จำเป็นต้อง.) หลักสูตรนี้เป็นห่างไกลจากวัตถุประสงค์การใช้Zeroและ GAP จะบ่นถ้าผมไม่ได้ใช้อื่น ๆInstall Methodตอนนี้ฉันสามารถทำได้:

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

ฉันจะไม่พูดว่า builtin ทำงานได้ดีที่สุดคนหนึ่งอาจสงสัยว่าการเขียนฟังก์ชั่นปกติควรจะสั้นกว่า แต่สิ่งที่ดีที่สุดในการลองคือ 92 ไบต์:

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

2

Haskell, 115 ไบต์

ภาษาของฉันไม่สามารถจัดการกับตัวเลขและสตริงในรายการต่าง ๆ ได้ (แต่แน่นอนว่าคุณสามารถกำหนดประเภทผลรวมและใส่ลงในรายการ) และรายการมาตรฐานไม่สามารถจัดการรายการซ้อนที่แตกต่างกันได้ ดังนั้นฉันแค่ทำในสิ่งที่สามารถจัดการได้ ฉันคิดว่ามันไม่ยุติธรรมเพราะมันยังคงยาวและฉันทำเพื่อแสดงคุณสมบัติของฮาเซลที่ไม่ค่อยเห็นในโซลูชั่นกอล์ฟฮาเซล โปรดทราบว่า Strings เป็นรายการของ Chars

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

สิ่งนี้จัดการหมายเลขใด ๆ เป็นสองเท่า:

*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 ที่กำหนดจะให้คุณ
Adám

2

PHP, 91 ไบต์

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

ถ้าพารามิเตอร์เป็นอาร์เรย์: recurse array_mapใช้
อื่นถ้าพารามิเตอร์เป็นสตริง: สร้างสตริงของช่องว่างที่มีความยาวเท่ากัน อื่น
0

is_stringช่วยประหยัดหนึ่งไบต์มากกว่าis_numeric; การลบการis_array()แสดงผลในวงเล็บล้าสมัย โดยรวมแล้วมีขนาด 17 ไบต์สั้นกว่าif()recursion-loop;else x?string:numberการโทรโดยการอ้างอิง


2

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

Ungolfed

(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 Bytes

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 evel ) เป็นศูนย์

ลองออนไลน์!

โดยไม่ใช้พฤติกรรมเก่ามันคือ 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], "    "]]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.