Angka-angka tidak suci

11

Tertantang ini sangat terinspirasi oleh apa yang @Mego ciptakan dengan angka Suci dan Holier-nya , banyak terima kasih kepadanya dan permainan kata-katanya.

Bilangan suci adalah angka yang hanya terdiri dari digit berlubang , yaitu:

04689

Angka dengan setidaknya satu digit tidak suci dianggap tidak suci. Digit yang tidak suci itu jahat menurut definisi, tetapi dekat dengan angka suci membantu mereka menjadi netral. Oleh karena itu, semakin dekat mereka, semakin tidak suci (1 ketika berdekatan).

Ketidakjujuran suatu bilangan adalah jumlah dari ketidakjujuran dari digit-digitnya, suatu angka yang hanya terdiri dari angka yang tidak kudus memiliki ketidakjujuran yang tak terbatas.

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

Tugas Anda

Anda harus menulis sebuah program atau fungsi yang mengambil bilangan bulat positif atau string yang hanya terdiri dari digit sebagai input, dan menampilkan kekasarannya. Jika Anda memilih untuk menggunakan bilangan bulat sebagai input, Anda dapat menganggapnya tidak akan memiliki arahan 0karena bahasa Anda akan menjatuhkannya.

Dalam hal ketidaktaatan yang tak terbatas, Anda dapat memilih di antara tiga output

  • Karakter (3 byte)
  • Output tak terbatas mengandung setidaknya 1 digit bukan nol, tetapi hanya digit.
  • Nilai bawaan Infinity.

Ini adalah kode-golf, jadi kode terpendek dalam byte menang, semoga berhasil!

Katenkyo
sumber
Apakah mengembalikan Infinitynilai bawaan menjadi legal?
Neil
1
@Neil saya akan membiarkannya, karena saya bahkan tidak memikirkannya, poin bagus di sana.
Katenkyo
Beberapa input contoh Anda mulai dengan nol di depan; apakah ini dimaksudkan agar kita dapat menulis fungsi kita dengan input "bilangan bulat positif" hanya jika bahasa pilihan kita tidak secara otomatis menjatuhkan nol di depannya? Banyak bahasa akan dipaksa untuk mengambil input string karena alasan ini.
A Simmons
@ ASimmons Itu sebabnya saya memodifikasi (beberapa waktu lalu) input sehingga bisa menjadi "string hanya terdiri dari angka" juga. Juga, poin penting bukanlah bahwa itu adalah 0digit suci, saya akan mengubah posting sesuai untuk memungkinkan jawaban berdasarkan angka 0 yang tidak terkemuka.
Katenkyo
@katenkyo Ya saya melihat Anda bisa memasukkan sebagai string tetapi tampaknya sulit untuk menganggapnya sebagai bilangan bulat. Saya menyetujui hasil edit Anda ke OP.
A Simmons

Jawaban:

2

MATL , 25 24 byte

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

Cobalah online!

Input adalah sebuah string. Dalam output, infinity ditampilkan sebagai Inf.

Penjelasan

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
sumber
4

Python (3), 137 131 byte

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

Hasil

>>> [f(i) for i in ['85587', '012321857', '157321', '04689']]
[3, 12, '∞', 0]
Erwan
sumber
Saya mendapatkan hitungan 131 Bytes , Apakah ada sesuatu yang saya lewatkan? Juga, jawaban yang bagus :).
Katenkyo
@Katenkyo Saya selalu lupa editor saya menambahkan baris kosong di akhir file
Erwan
2

Pyth, 31 29 27 25 byte

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

Cobalah online: Demonstrasi atau Test Suite

Untuk setiap digit saya menghitung jarak ke setiap angka. Jarak adalah sangat kecil, jika digit kedua tidak suci. Dari daftar ini saya mengambil jarak minimal dan menjumlahkannya.

Penjelasan:

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
sumber
1

JavaScript (ES6), 93 byte

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

Jika Infinitybukan merupakan batas hukum, tambahkan 13 byte untuk ==1/0?'∞':r.

Neil
sumber