Liczby bezbożne

11

To wyzwanie jest wysoce zainspirowane tym, co @Mego stworzył za pomocą Holy i Holier liczb, wiele dzięki niemu i jego kalambury.

Liczby święte to liczby składające się wyłącznie z cyfr z dziurami , które są:

04689

Liczby z co najmniej jedną bezbożną cyfrą są uważane za bezbożne. Bezbożne cyfry są z definicji złe, ale przebywanie w pobliżu świętych cyfr pomaga im stać się neutralnymi. Dlatego im bliżej się znajdują, tym mniej są bezbożne (1 w sąsiedztwie).

Bezbożność liczby jest sumą bezbożności jej cyfr, liczba złożona tylko z bezbożnej liczby ma nieskończoną nieskończoność.

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

Twoje zadanie

Musisz napisać program lub funkcję, która przyjmuje na wejściu dodatnią liczbę całkowitą lub ciąg złożony tylko z cyfr i wypisuje jej nieświętość. Jeśli zdecydujesz się użyć liczby całkowitej jako danych wejściowych, możesz założyć, że nigdy nie będzie miała ona wiodącej pozycji, 0ponieważ Twój język może ją upuścić.

W przypadku nieskończonej bezbożności możesz wybrać pomiędzy trzema wyjściami

  • Znak (3 bajty)
  • Nieskończony wynik zawierający co najmniej 1 niezerową cyfrę, ale tylko cyfry.
  • Wbudowana Infinitywartość.

To jest golf golfowy, więc wygrywa najkrótszy kod w bajcie, powodzenia!

Katenkyo
źródło
Czy zwracanie wbudowanej Infinitywartości jest legalne?
Neil
1
@Neil Pozwolę na to, bo nawet o tym nie myślałem, dobra uwaga.
Katenkyo,
Niektóre z przykładowych danych wejściowych zaczynają się od wiodącego zera; czy zamierzone jest, abyśmy mogli napisać naszą funkcję z wprowadzeniem „dodatniej liczby całkowitej” tylko wtedy, gdy wybrany przez nas język nie będzie automatycznie upuszczał początkowego zera? Z tego powodu wiele języków będzie zmuszonych do wprowadzania ciągów znaków.
A Simmons
@ASimmons Właśnie dlatego zmodyfikowałem (jakiś czas temu) dane wejściowe, aby mógł być również „ciągiem złożonym wyłącznie z cyfr”. Ważną kwestią nie jest to, że jest to 0święta cyfra, zmodyfikuję post, aby zezwolić na odpowiedź w oparciu o nie wiodące cyfry 0.
Katenkyo,
@katenkyo Tak, widziałem, że możesz wpisać jako ciąg, ale wydawało się trudne do przyjęcia jako liczby całkowitej. Akceptuję twoją zmianę w PO.
A Simmons

Odpowiedzi:

2

MATL , 25 24 bajtów

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

Wypróbuj online!

Dane wejściowe to ciąg znaków. Na wyjściu nieskończoność jest natywnie wyświetlana jako Inf.

Wyjaśnienie

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
źródło
4

Python (3), 137 131 bajtów

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

Wyniki

>>> [f(i) for i in ['85587', '012321857', '157321', '04689']]
[3, 12, '∞', 0]
Erwan
źródło
Dostaję liczbę 131 bajtów. Czy czegoś mi brakuje? Również świetna odpowiedź :).
Katenkyo,
@Katenkyo Zawsze zapomniałem, że mój edytor dodał en pustą linię na końcu pliku
Erwan
2

Pyth, 31 29 27 25 bajtów

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

Wypróbuj online: pakiet demonstracyjny lub testowy

Dla każdej cyfry obliczam odległości do każdej liczby. Odległość jest nieskończona, jeśli druga cyfra nie jest święta. Z tych list biorę minimalny dystans i podsumowuję go.

Wyjaśnienie:

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
źródło
1

JavaScript (ES6), 93 bajty

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

Jeśli Infinitynie jest to prawna nieskończoność, dodaj 13 bajtów dla ==1/0?'∞':r.

Neil
źródło