Os números profanos

11

Este desafiado é altamente inspirado pelo que @Mego criado com seus santos e Holier números, muitas graças a ele e seus trocadilhos.

Os números sagrados são números compostos apenas pelos dígitos com orifícios , que são:

04689

Números com pelo menos um dígito profano são considerados profanos. Dígitos profanos são maus por definição, mas estar perto dos dígitos sagrados os ajuda a se tornar neutros. Portanto, quanto mais próximos estiverem, menos profanos (1 quando adjacente).

A profanação de um número é a soma da profanidade de seus dígitos, um número composto apenas de números profanos tem uma profanidade 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

Sua tarefa

Você precisa escrever um programa ou função que use um número inteiro positivo ou uma sequência composta apenas de dígitos como entrada e produza sua profanidade. Se você optou por usar um número inteiro como entrada, pode assumir que ele nunca terá uma liderança, 0pois seu idioma pode eliminá-lo.

Em caso de profanidade infinita, você pode escolher entre três saídas

  • O caractere (3 bytes)
  • Saída infinita contendo pelo menos 1 dígito diferente de zero, mas apenas dígitos.
  • Um Infinityvalor interno.

Isso é código-golfe, então o código mais curto em byte vence, boa sorte!

Katenkyo
fonte
O retorno de um Infinityvalor interno é legal?
Neil
1
@ Neil eu vou permitir, como eu nem pensei nisso, bom ponto lá.
precisa
Algumas de suas entradas de exemplo começam com um zero à esquerda; Pretende-se que possamos escrever nossa função com a entrada "um número inteiro positivo" apenas se nossa linguagem de escolha não reduzir automaticamente o zero inicial? Muitos idiomas serão forçados a receber entrada de string por esse motivo.
A Simmons
@ ASimmons Foi por isso que modifiquei (um tempo atrás) a entrada para que ela também possa ser uma "string composta apenas por dígitos". Além disso, o ponto importante não é que seja um 0dígito sagrado, modificarei a postagem de acordo com as respostas baseadas em números 0 não principais.
precisa
@katenkyo Sim, eu vi que você podia inserir como uma string, mas parecia difícil tomá-la como um número inteiro. Eu aprovo sua edição no OP.
A Simmons

Respostas:

2

MATL , 25 24 bytes

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

Experimente online!

Entrada é uma sequência. Na saída, o infinito é exibido nativamente como Inf.

Explicação

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
fonte
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
fonte
Eu recebo uma contagem de 131 bytes , está faltando alguma coisa? Além disso, ótima resposta :).
Katenkyo
@Katenkyo eu sempre esquecia o meu editor add en linha vazia no final do arquivo
Erwan
2

Pitão, 31 29 27 25 bytes

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

Experimente on-line: Demonstration or Test Suite

Para cada dígito, calculo as distâncias para cada número. A distância é infinita, se o segundo dígito não for sagrado. A partir dessas listas, pego a distância mínima e resuma.

Explicação:

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
fonte
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

Se Infinitynão for um infinito legal, adicione 13 bytes para ==1/0?'∞':r.

Neil
fonte