Ocurrencias de dígitos

12

Entrada:

Una lista de enteros (que nunca contendrá un cero)

Salida:

Una lista del mismo tamaño con recuentos basada en lo siguiente:

  • Si el elemento actual es negativo: mire todos los elementos antes de este elemento y cuente cuántas veces ocurrieron los dígitos en esos otros números
  • Si el elemento actual es positivo en su lugar: mire todos los elementos después de este elemento y cuente cuántas veces se produjo el dígito en esos otros números

Hay un giro: si el tamaño de la lista es par, solo contamos cada número una vez (incluso si coincide con varios dígitos), y si el tamaño es impar, contamos cada dígito de los números para cada dígito del elemento actual (duplicado los dígitos se cuentan varias veces).

Veamos algunos ejemplos para aclarar esto un poco:

Ejemplo con lista par:

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

El tamaño de la lista es par , por lo que solo contamos cada número una vez.

  • 4: Es positivo, así que esperamos. Hay tres números que contienen el dígito 4( 42, -942, 8374). Entonces comenzamos con a 3.
  • 10: Es positivo, así que esperamos. Hay dos números que contienen el dígito 1y / o 0( -10, -200). Entonces la segunda salida es 2.
  • 42: De nuevo positivo, muy adelante. Hay cuatro números que contienen o bien el dígito 4y / o 2( -942, 8374, 728, -200). Entonces la tercera salida es 4.
  • -10: Esta vez es negativo, así que miramos hacia atrás. Solo hay un número que contiene el dígito 1y / o 0(ignoramos el signo menos) ( 10). Entonces la cuarta salida es 1.
  • etc.

Ejemplo con lista impar:

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

El tamaño de la lista es impar , por lo que contamos cada dígito.

  • 382: Es positivo, así que esperamos. Hay uno 3en los otros números ( 381), seis 8en los otros números ( -82, -8, 381, 228, 28, -28) y seis 2en los otros números ( -82, 228, 28, -28, 2). Entonces comenzamos con a 13.
  • -82: Es negativo, así que al revés. Hay uno 3en el otro número ( 382) y uno 8en el otro número ( 382). Entonces la segunda salida es 2.
  • ...
  • 228: Es positivo, muy adelante. Hay tres 2que está en los otros números ( 28, -28, -2), y otros tres 2's, y dos 8que está en los otros números ( 28, -28). Entonces esta salida es 8.
  • etc.

Reglas de desafío:

  • Puede suponer que la entrada nunca contendrá 0como elemento, ya que no es ni positiva ni negativa.
  • Puede suponer que la lista de entrada siempre contendrá al menos dos elementos.
  • I / O es flexible. La entrada / salida puede ser una matriz / lista de enteros, una cadena delimitada, una matriz de dígitos / caracteres, etc.
  • Si el primer número en la lista es un número negativo, o el último número en la lista es un número positivo, será 0 en la lista resultante.
  • Con listas impares, los números que contienen el mismo dígito varias veces se cuentan varias veces, como 228en el ejemplo impar anterior que da como resultado 8(3 + 3 + 2) en lugar de 5(3 + 2).

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código.
  • Además, agregue una explicación si es necesario.

Casos de prueba:

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 ]
Kevin Cruijssen
fuente

Respuestas:

3

05AB1E , 30 bytes

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

Pruébalo en línea!

Emigna
fuente
δ¢, nunca visto el doble vector usado bien, bonito.
Urna mágica del pulpo
5

Python 2 , 149 148 121 116 111 107 bytes

lambda l:[sum([any,sum][len(l)%2](map(`n`.count,`abs(v)`))for n in l[:i:2*(v<0)-1])for i,v in enumerate(l)]

Pruébalo en línea!

TFeld
fuente
4

Java (JDK 10) , 204 bytes

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

Pruébalo en línea!

Créditos

Olivier Grégoire
fuente
[1,11,-1]Debería volver [3,2,3]. Es una lista extraña, por lo que todos los dígitos cuentan. Primero 1: mirar hacia adelante, tres 1s en total: 11,-1. Segundo 11: mira hacia adelante para cada dígito: uno 1+ uno 1. Tercero -1: Mire hacia atrás, tres 1s en total: -1,11. (Con las listas impares usted debe buscar en cada dígito, incluso el mismo Voy a aclarar esto en el desafío, pero el ejemplo extraña con el número. 228Aclara esto un poco.)
Kevin Cruijssen
@KevinCruijssen Debería arreglarse ahora.
Olivier Grégoire
De hecho lo hace. Ya tenía miedo de que la explicación inicial pudiera haber sido un poco confusa cuando la publiqué. Ahora veré si puedo responder algo a su respuesta. ;)
Kevin Cruijssen
1
No tengo mucho tiempo tampoco, pero una cosa que puedo campo está añadiendo una nueva variable ,ty cambiando i+(a[i]>0?1:-1)a i+(t=a[i]>0?1:-1), y luego simplemente utilizo j+=ten lugar de j+=a[i]>0?1:-1.
Kevin Cruijssen
1
Puede guardar 2 si declara, por ejemplo, t = 10 y reemplaza todos esos 10 por t, aunque será menos comprensible
Java Gonzar
3

Perl 6 , 100 85 bytes

{.kv.map:{sum map (?*,+*)[$_%2],.[grep (*-$^i)*$^v>0,^$_].map:{.comb$v.abs.comb}}}

Pruébalo en línea!

Utiliza el operador de multiplicación holgado ⊍.

nwellnhof
fuente
1

JavaScript (Node.js) , 164,158,140 139 bytes

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)

Pruébalo en línea!

DanielIndie
fuente
Esto se parece a JS6, no a nada Nodo-y.
No es que Charles
Esta es una cadena generada por tio. tiene Node Babel o SpiderMonkey JS. todavía funciona en el nodo, así que está bien
DanielIndie
1

Ruby , 126 bytes

->l{k=l.map{|i|i.abs.digits};c=-1;k.map{|n|x=k[l[c+=1]<0?0...c:c+1..-1];x.sum{|j|x=n.sum{|d|j.count d};l.size%2<1?x<1?0:1:x}}}

Pruébalo en línea!

Asone Tuhid
fuente