Los números impíos

11

Este desafío está muy inspirado por lo que @Mego creó con sus números Holy y Holier , muchas gracias a él y sus juegos de palabras.

Los números sagrados son números compuestos solo por los dígitos con agujeros , que son:

04689

Los números con al menos un dígito impío se consideran impíos. Los dígitos impíos son malos por definición, pero estar cerca de los dígitos sagrados los ayuda a volverse neutrales. Por lo tanto, cuanto más cerca estén, menos profano (1 cuando está adyacente).

La impiedad de un número es la suma de la impiedad de sus dígitos, un número compuesto solo por un número impío tiene una impiedad infinita.

Number            :8 5 5 8 7
Digital Unholiness:0+1+1+0+1
Total Unholiness  :3

Number            :0 1 7 5 5 2 8 5 7 
Digital Unholiness:0+1+2+3+2+1+0+1+2
Total Unholiness  :12

Number            :1 5 7 3 2 1
Digital Unholiness:∞+∞+∞+∞+∞+∞
Total Unholiness  :∞

Number            :0 4 6 8 9
Digital Unholiness:0+0+0+0+0
Total Unholiness  :0

Tu tarea

Tiene que escribir un programa o función que tome un entero positivo o una cadena compuesta solo de dígitos como entrada, y genere su impiedad. Si elige usar un número entero como entrada, puede suponer que nunca tendrá un encabezado, 0ya que su idioma puede descartarlo.

En caso de impiedad infinita, puede elegir entre tres salidas

  • El caracter (3 bytes)
  • Salida infinita que contiene al menos 1 dígito distinto de cero, pero solo dígitos.
  • Un Infinityvalor incorporado .

Este es el código de golf, por lo que gana el código más corto en bytes, ¡buena suerte!

Katenkyo
fuente
¿Es Infinitylegal devolver un valor incorporado ?
Neil
1
@Neil Lo permitiré, ya que ni siquiera lo pensé, buen punto allí.
Katenkyo
Algunas de sus entradas de ejemplo comienzan con un cero inicial; ¿Se pretende que podamos escribir nuestra función con la entrada "un entero positivo" solo si nuestro lenguaje de elección no eliminará automáticamente el cero inicial? Muchos idiomas se verán obligados a tomar la entrada de cadena por este motivo.
Un Simmons
@ASimmons Es por eso que modifiqué (hace un tiempo) la entrada para que también pueda ser una "cadena compuesta solo por dígitos". Además, el punto importante no es que es un 0dígito sagrado, sino que modificaré la publicación para permitir la respuesta en función de los números 0 no iniciales.
Katenkyo
@katenkyo Sí, vi que podías ingresar como una cadena pero parecía difícil tomarlo como un número entero. Apruebo tu edición en el OP.
Un Simmons

Respuestas:

2

MATL , 25 24 bytes

7Zq1hVmt~f!wf-|X<st~?xYY

Pruébalo en línea!

La entrada es una cadena. En la salida, el infinito se muestra de forma nativa como Inf.

Explicación

7         % number literal                                 
Zq        % prime numbers up to a 7: [2 3 5 7]
1         % number literal                        
h         % horizontal concatenation                       
V         % convert numbers to string: '2  3  5  7  1'
m         % take input implicitly. Determine which digits are 1,2,3,5,7
t         % duplicate
~         % element-wise negate: which digits are 4,6,8,9,0
f         % indices of occurrences of digits 4,6,8,9,0
!         % transpose into column array
w         % swap elements in stack           
f         % indices of occurrences of digits 1,2,3,5,7  
-         % element-wise subtraction with broadcast. Gives 2D array
|         % element-wise absolute value                          
X<        % minimum of each column
s         % sum of elements of array
t         % duplicate                       
~         % element-wise negate
?         % if all elements are true                            
  x       %   delete                                         
  YY      %   push infinity                                       
          % (implicit) end if
          % (implicit) convert to string and display  
Luis Mendo
fuente
4

Python (3), 137 131 bytes

def f(s):
 l=range(len(s))
 r=[min(i)for i in zip(*[[abs(j-i)for j in l]for i in l if s[i]in'46890'])]
 return sum(r)if r else'∞'

Resultados

>>> [f(i) for i in ['85587', '012321857', '157321', '04689']]
[3, 12, '∞', 0]
Erwan
fuente
Tengo un conteo de 131 Bytes , ¿hay algo que me falta? Además, gran respuesta :).
Katenkyo
@Katenkyo Siempre olvidé que mi editor agregaba una línea vacía al final del archivo
Erwan
2

Pyth, 31 29 27 25 bytes

smhS.e?}b"04689"akd.n4zUz

Pruébelo en línea: Demostración o conjunto de pruebas

Para cada dígito calculo las distancias a cada número. Una distancia es infinita, si el segundo dígito no es sagrado. De estas listas tomo la distancia mínima y la resumen.

Explicación:

smhS.e?}b"04689"akd.n4zUz  implicit: z = input string of numbers
 m                     Uz  map each d in [0, 1, ..., len(z)-1] to:
    .e                z      map each k (index), b (value) of b to:
                akd            absolute difference between k and d

      ?}b"04689"               if b in "04689" else
                   .n4         infinity
   S                           sort
  h                            take the first element (=minimum)
s                              print the sum
Jakube
fuente
1

JavaScript (ES6), 93 bytes

s=>[...s].map(n=>/[12357]/.test(n)?++u:u=0,u=1/0).reverse().map(n=>r+=n?n<++u?n:u:u=0,r=0)&&r

Si Infinityno es un infinito legal, entonces agregue 13 bytes para ==1/0?'∞':r.

Neil
fuente