Нейтралізуйте дані


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 Правильно. Не соромтесь редагувати питання, щоб краще відобразити це.
Adám

Відповіді:


17

JavaScript (ES6), 53 47 байт

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

Тестові кейси


Нарешті, використання big()! Хоча, напевно, ви можете забезпечити кращу надійність у майбутньому, використовуючи raw()натомість.
Кудлатий

@Shaggy Hmm. Який синтаксис ви б використовували 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<{}повертає True та 1-(x<{})повертає 0 . Код після andне виконується.

  • Якщо x є ітерабельним, 1-(x<{})повертає 1 (truthy), тому код після 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нього, він працює так, як очікувалося
Алексіс Андерсен

Це вже виправлено, спасибі.
ГБ

6

Математика, 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-байтового рішення!
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'). FYI, 7159⌶буде ⎕JSONу версії 16.0.
Adám

APL може вирішити будь-який JSON. Однак велика кількість даних APL не може бути однозначно представлена ​​в JSON.
Adám

Чи вважаєте ви, що кодовий гольф, який передбачає розбір чи, можливо, маніпулювання масивами 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який повертає нейтральний елемент добавки, відповідний елементу структури добавки. Це обробляє числа і навіть списки чисел, які вважаються векторами, але не довільними списками. Тож давайте додамо ці та символи та використовуємо, що рядки - це списки символів:

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

Я б не сказав, що вбудований виконує більшу частину роботи, можна скоріше підозрювати, що запис нормальної функції повинен бути коротшим, але я найкраще намагаюся робити це на 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

Це обробляє будь-яке число подвійним:

*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 О, ти правий, і, на жаль, я не можу стверджувати, що моя мова не має таких. Чи можу я впоратися лише з парними? Я можу ввести їх без десяткової крапки.
Крістіан Сіверс

@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()робить дужки застарілими. Загалом це на 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)

використовує спосіб ГБ для визначення типів


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

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

Це більше не працює, оскільки оновлення зробило це таким чином, що фальсифікації інших типів, де є тритії, автоматично перетворюються на фальси трифти.


Це, звичайно, прийнятно.
Адам

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

Ця функція обробляє 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, монадік робив саме це. Стару поведінку можна активувати, встановивши ⎕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], "    "]]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.