Нечестивые числа


11

Это испытание очень вдохновлено тем, что @Mego создал со своими номерами Holy и Holier , большое спасибо ему и его каламбурам.

Святые числа - это числа, состоящие только из цифр с отверстиями :

04689

Числа с хотя бы одной нечестивой цифрой считаются нечестивыми. Нечестивые цифры по определению являются злом, но близость к святым цифрам помогает им стать нейтральными. Следовательно, чем ближе они, тем менее нечестивым (1, когда смежно).

Нечестивость числа - это сумма нечестивости его цифр, а число, состоящее только из нечестивого числа, имеет бесконечную нечестивость.

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

Твое задание

Вы должны написать программу или функцию, которая принимает положительное целое число или строку, состоящую только из цифр, в качестве входных данных и выводит их несвободно. Если вы решили использовать целое число в качестве входных данных, вы можете предположить, что у него никогда не будет ведущего0 поскольку ваш язык может его отбросить.

В случае бесконечной нечестивости, вы можете выбрать один из трех выходов

  • Персонаж (3 байта)
  • Бесконечный вывод, содержащий не менее 1 ненулевой цифры, но только цифры.
  • Встроенная Infinityстоимость.

Это код-гольф, поэтому выигрывает самый короткий код в байтах, удачи!


Является ли возврат встроенного Infinityзначения законным?
Нил

1
@ Нейл, я позволю это, поскольку я даже не думал об этом, хороший момент там.
Катенкё

Некоторые из ваших примеров ввода начинаются с начального нуля; Предполагается ли, что мы можем написать нашу функцию с помощью ввода «положительного целого числа» только в том случае, если выбранный язык не будет автоматически опускать начальный ноль? По этой причине многие языки будут вынуждены принимать строковые данные.
Симмонс

@ASimmons Вот почему я изменил (некоторое время назад) ввод, чтобы он также мог быть «строкой, состоящей только из цифр». Кроме того, важным моментом является не то, что это просто 0святая цифра, я буду изменять пост в соответствии с разрешенным ответом, основываясь на не ведущих 0 числах.
Катенкё

@katenkyo Да, я видел, что вы можете вводить в виде строки, но было трудно воспринимать ее как целое число. Я одобряю ваше редактирование в ОП.
Симмонс

Ответы:


2

MATL , 25 24 байта

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

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

Ввод - это строка. В выводе бесконечность изначально отображается какInf .

объяснение

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  

4

Python (3), 137 131 байт

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'∞'

Полученные результаты

>>> [f(i) for i in ['85587', '012321857', '157321', '04689']]
[3, 12, '∞', 0]

Я получаю счет 131 байт. Что-то мне не хватает? Также отличный ответ :).
Катенкё

@Katenkyo Я всегда забывал, что мой редактор добавляет пустую строку в конце файла
Erwan

2

Pyth, 31 29 27 25 байт

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

Попробуйте онлайн: демонстрация или тестовый набор

Для каждой цифры я вычисляю расстояния до каждого числа. Расстояние бесконечно, если вторая цифра не святая. Из этих списков я беру минимальное расстояние и суммирую его.

Объяснение:

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

1

JavaScript (ES6), 93 байта

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

Если Infinityне является допустимой бесконечностью, то добавьте 13 байтов для ==1/0?'∞':r.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.