Числовые вхождения

12

Входные данные:

Список целых чисел (который никогда не будет содержать ноль)

Выход:

Список того же размера с подсчетами на основе следующего:

  • Если текущий элемент отрицательный: посмотрите на все элементы перед этим элементом и посчитайте, сколько раз цифры встречались в этих других числах
  • Если текущий элемент положительный вместо этого: посмотрите на все элементы после этого элемента и посчитайте, сколько раз цифра встречалась в этих других числах

Есть один поворот: если размер списка четный, мы подсчитываем каждое число только один раз (даже если он совпадает с несколькими цифрами), а если размер нечетный, мы считаем каждую цифру чисел для каждой цифры текущего элемента (дублируется цифры считаются несколько раз).

Давайте приведем несколько примеров, чтобы прояснить это немного:

Пример с четным списком:

Input:  [4, 10, 42, -10, -942, 8374, 728, -200]
Output: [3, 2,  4,  1,   2,    1,    1,   5   ]

Размер списка четный , поэтому мы считаем каждый номер только один раз.

  • 4: Это позитивно, поэтому мы с нетерпением ждем. Есть три номера , содержащие цифру 4( 42, -942, 8374). Итак, начнем с 3.
  • 10: Это позитивно, поэтому мы с нетерпением ждем. Есть два числа, содержащие либо цифру, 1и / или 0( -10, -200). Итак, второй вывод есть 2.
  • 42Снова позитив, так что вперед. Есть четыре номера , содержащие либо цифру 4и / или 2( -942, 8374, 728, -200). Итак, третий вывод 4.
  • -10На этот раз это отрицательно, поэтому мы смотрим назад. Существует только одно число, содержащее цифру 1и / или 0(мы игнорируем знак минус) ( 10). Итак, четвертый вывод 1.
  • и т.п.

Пример с нечетным списком:

Input:  [382, -82, -8, 381, 228, 28, 100, -28, -2]
Output: [13,  2,   2,  4,   8,   3,  0,   11,  6 ]

Размер списка нечетен , поэтому мы считаем каждую цифру.

  • 382: Это позитивно, поэтому мы с нетерпением ждем. Есть одно 3в других числах ( 381), шесть 8в других числах ( -82, -8, 381, 228, 28, -28) и шесть 2в других числах ( -82, 228, 28, -28, 2). Итак, начнем с 13.
  • -82Это отрицательно, так что задом наперед. Один 3в другом номере ( 382) и один 8в другом номере ( 382). Итак, второй вывод есть 2.
  • ...
  • 228Это позитивно, так что вперед. Есть три 2'S в других числах ( 28, -28, -2), а еще три 2-х, и два 8«S в других числах ( 28, -28). Так что этот вывод есть 8.
  • и т.п.

Правила вызова:

  • Вы можете предположить, что вход никогда не будет содержать 0как элемент, так как он не является ни положительным, ни отрицательным.
  • Можно предположить, что входной список всегда будет содержать как минимум два элемента.
  • Ввод / вывод является гибким. Ввод / вывод может быть массивом / списком целых чисел, строкой с разделителями, цифрой / символьной матрицей и т. Д.
  • Если первое число в списке является отрицательным числом или последнее число в списке является положительным числом, оно будет 0 в результирующем списке.
  • В нечетных списках числа, содержащие одну и ту же цифру несколько раз, подсчитываются несколько раз, как 228в приведенном выше нечетном примере, в результате 8(3 + 3 + 2) вместо 5(3 + 2).

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это необходимо.

Тестовые случаи:

Input:  [4, 10, 42, -10, -942, 8374, 728, -200]
Output: [3, 2,  4,  1,   2,    1,    1,   5   ]

Input:  [382, -82, -8, 381, 228, 28, 100, -28, -2]
Output: [13,  2,   2,  4,   8,   3,  0,   11,  6 ]

Input:  [10, -11, 12, -13, 14, -15, 16, -17, 18, -19]
Output: [9,  1,   7,  3,   5,  5,   3,  7,   1,  9  ]

Input:  [10, -11, 12, -13, 14, -15, 16, -17, 18, -19, 20]
Output: [11, 2,   8,  4,   5,  6,   3,  8,   1,  10,  0 ]

Input:  [88, 492, -938, 2747, 828, 84710, -29, -90, -37791]
Output: [8,  9,   3,    9,    3,   4,     5,   4,   12    ]

Input:  [-1, 11, 11, 1]
Output: [0,  2,  1,  0]

Input:  [1, 11, 11, -1]
Output: [3, 2,  1,  3 ]

Input:  [-1, 11, 1]
Output: [0,  2,  0]

Input:  [1, 11, -1]
Output: [3, 2,  3 ]
Кевин Круйссен
источник

Ответы:

3

05AB1E , 30 байтов

vy0›iNƒ¦}ëN£}€Sþyδ¢IgÈiĀ€Ù}OOˆ

Попробуйте онлайн!

Emigna
источник
δ¢, никогда не видел, чтобы двойной вектор использовался хорошо, хороший.
Волшебная Урна Осьминога
4

Java (JDK 10) , 204 байта

a->{int l=a.length,r[]=new int[l],i=0,j,x,y,b,s,t=10;for(;i<l;i++)for(j=i+(s=a[i]>0?1:-1);0<=j&j<l;j+=s)for(b=0,x=a[i];x!=0;x/=t)for(y=a[j];b<1&y!=0;y/=t)if(x%t==-y%t|x%t==y%t){r[i]++;b+=1-l%2;}return r;}

Попробуйте онлайн!

кредиты

Оливье Грегуар
источник
[1,11,-1]должен вернуться [3,2,3]. Это странный список, поэтому все цифры считаются. Первое 1: смотри вперед, всего три 1секунды 11,-1. Второе 11: ждите каждой цифры: один 1+ один 1. В- третьих -1: взгляд назад, три 1s в общей сложности: -1,11. (С нечетными списками вы должны смотреть на каждую цифру, даже на одну и ту же. Я 228
поясню это в задании
@KevinCruijssen Должен быть исправлен сейчас.
Оливье Грегуар
Это действительно так. Я уже боялся, что первоначальное объяснение, возможно, было слишком неясным, когда я его опубликовал ... Теперь я посмотрю, смогу ли я сыграть в гольф что-нибудь из твоего ответа. ;)
Кевин Круйссен
1
У меня тоже не так много времени, но одна вещь, которую вы можете сыграть в гольф, это добавить новую переменную ,tи изменить i+(a[i]>0?1:-1)ее i+(t=a[i]>0?1:-1), а затем просто использовать j+=tвместо j+=a[i]>0?1:-1.
Кевин Круйссен
1
Вы можете сохранить 2, если объявите, например, t = 10 и замените все эти 10 на t, хотя это будет менее понятно
Java Gonzar
1

JavaScript (Node.js) , 164 158 140 139 байт

a=>a.map((x,i)=>a.slice(x<0?0:i+1,x<0?i:l).map(b=>c+=[...b+""].map(X=>s+=X>=0&&(x+"").split(X).length-1,s=0)&&l%2?s:+!!s,c=0)|c,l=a.length)

Попробуйте онлайн!

DanielIndie
источник
Это похоже на JS6, а не на Node-y.
Не то, что Чарльз
это строка, сгенерированная TIO. у него есть либо Node Babel, либо SpiderMonkey JS. это все еще работает на узле, так что все в порядке
DanielIndie