Cetak akar digital


19

Ini berbeda dengan My Word yang dapat mengalahkan Word Anda karena kurang kompleks dan hanya mengharuskan Anda untuk menghitungnya, dan tidak membandingkannya.

Untuk menemukan akar digital, ambil semua digit angka, tambahkan, dan ulangi sampai Anda mendapatkan nomor satu digit. Sebagai contoh, jika jumlah itu 12345, Anda akan menambahkan 1, 2, 3, 4, dan 5, mendapatkan 15. Anda kemudian akan menambahkan 1dan 5memberi Anda 6.

Tugas Anda

Mengingat integer N (0 <= N <= 10000) melalui STDIN , mencetak akar digital N .

Uji kasus

1 -> 1
45 -> 9
341 -> 8
6801 -> 6
59613 -> 6
495106 -> 7

Ingat, ini adalah , jadi kode dengan jumlah byte terkecil menang.


1
Mungkin subtugas dari tantangan ini .
nimi

3
Sangat erat kaitannya dengan tantangan ini ... mungkin cukup dekat untuk korban penipuan.
AdmBorkBork

8
Harap lebih tepat saat mengatakan number. Khususnya. haruskah input 0didukung?
Ton Hospel

2
@TimmyD Saya pikir ini adalah tantangan yang jauh lebih bersih tanpa menambahkan huruf ke konversi integer, menghitung fungsi untuk dua nilai dan termasuk literal STALEMATE. Mungkin lebih baik untuk menutup yang lain sebagai korban penipuan ini.
Martin Ender

3
@ MartinEnder Saya menarik kembali suara dekat saya, saya pikir itu tidak adil untuk menutup tantangan yang baik sebagai pembohong dari tantangan lain yang lebih kompleks.
Erik the Outgolfer

Jawaban:



17

Jelly , 7 5 4 3 byte

ḃ9Ṫ

TryItOnline! atau semua kasus uji

Bagaimana?

The akar digital dikenal untuk mematuhi rumus (n-1)% 9 + 1.
Ini sama dengan digit terakhir dalam bijective base 9
(dan karena implementasi itu 0ḃ9=[]dan []Ṫ=0ini menangani kasus tepi nol).

ḃ9Ṫ - Main link: n
ḃ9  - convert to bijective base 9 digits (a list)
  Ṫ - tail (get the last digit)

13

JavaScript (ES6), 16 10 byte

n=>--n%9+1

Uji kasus


6

MATL , 3 byte

9X\

Cobalah online!

Banyak (sekarang dihapus jawaban) mencoba menggunakan modulo 9 untuk mendapatkan hasilnya. Ini adalah jalan pintas yang bagus, tetapi sayangnya tidak berfungsi untuk kelipatan 9. MATL memiliki fungsi untuk modulo pada intervalnya [1, n]. Menggunakan modulo ini, kita miliki 1 % 3 == 1, 2 % 3 == 2, 3 % 3 == 3, 4 % 3 == 1, dll. Jawaban ini hanya membutuhkan modulo input sembilan menggunakan modulo kustom ini.


6

Mathematica, 27 11 byte

Mod[#,9,1]&

Mathematica Modmengambil parameter ketiga sebagai offset dari rentang modulo yang dihasilkan. Ini menghindari mengurangi input dan menambah output.


6

Python, 16 20 byte

+4 byte untuk menangani kasus tepi nol.

lambda n:n and~-n%9+1

repl.it


1
Wow. Ini sangat mudah sehingga dapat diporting ke bahasa apa pun. Anda bahkan dapat~-input()%9+1
Karl Napf

1
Sayangnya, tidak berfungsi untuk 0.
Emigna

@ KarlNapf Bukankah itu perlu print?
Jonathan Allan

@ Jonathan Allan Ah, mungkin. Saya baru saja mengujinya di lingkungan REPL dan itu berhasil.
Karl Napf

1
@ pengguna anonim yang mencoba mengedit - itu akan benar-benar memecahkan kode (membuat input 0hasil 9daripada 0, yang merupakan apa yang dipenuhi oleh n andbagian dari kode) selanjutnya akan dihitung sebagai 19 byte bukan 13 ( karena printdan ruang harus dihitung).
Jonathan Allan

4

Julia, 12 byte

!n=mod1(n,9)

atau

n->mod1(n,9)

mod1adalah sebuah alternatif untuk modyang memetakan ke kisaran [1, n]bukan [0, n).


4

PHP, 15 Bytes

<?=--$argn%9+1;

PHP versi sebelumnya, 55 Bytes

$n=$argn;while($n>9)$n=array_sum(Str_split($n));echo$n;

Persis bagaimana saya melakukannya!
CT14.IT

@ CT14.IT Saya bisa menghapus posting ini jika Anda mau. Posting yang dihapus adalah 1 menit sebelumnya dan Anda hanya lupa loop sementara
Jörg Hülsermann

Nah jawaban yang dihapus salah karena saya tidak membaca pertanyaan dengan benar untuk memulai, saya tidak mencoba untuk menjumlahkan nomor yang dihasilkan
CT14.IT

2
Anda dapat menambahkan trik jawaban lain<?=--$argv[1]%9+1?>
Crypto

3

Haskell, 35 34 byte

until(<10)$sum.map(read.pure).show

Cobalah di Ideone.

Penjelasan:

until(<10)$sum.map(read.pure).show
                              show  -- convert int to string
               map(         ).      -- turn each char (digit) into
                        pure        --    a string 
                   read.            --    and then a number
           sum.                     -- sum up the list of numbers
until(<10)$                         -- repeat until the result is < 10

3

Perl, 15 byte

Termasuk +2 untuk -lp

Berikan masukan pada STDIN

root.pl <<< 123

root.pl

#!/usr/bin/perl -lp
$_&&=~-$_%9+1

Ini adalah solusi membosankan yang telah diberikan dalam banyak bahasa, tetapi setidaknya versi ini 0juga mendukung

Lebih menarik melakukan penambahan berulang nyata (meskipun dalam urutan lain) sebenarnya hanya 1 byte lebih lama:

#!/usr/bin/perl -p
s%%$_+=chop%reg

3

R, 72 67 29 byte

Sunting: Terima kasih kepada @rturnbull karena telah memangkas dua byte.

n=scan();`if`(n%%9|!n,n%%9,9)

Baru-baru ini saya belajar bahwa ifelsedapat digantikan oleh `if`, dengan perilaku yang identik, yang menghemat beberapa byte.
rturnbull

@rturnbull Saya selalu bertanya-tanya bagaimana cara ifkerjanya. Bisakah Anda memberi contoh atau mungkin menambahkannya ke Tips untuk bermain golf?
Billywob

Cara paling sederhana untuk memahaminya adalah non-vektor ifelse. Dalam hal ini, `if`(n%%9|!n,n%%9,9)berikan perilaku yang identik dengan kode yang Anda poskan. Sejauh yang saya tahu, perilaku ini tidak berdokumen! Saya akan menambahkan komentar ke utas kiat.
rturnbull

3

Retina , 7 byte

{`.
*
.

Cobalah online!

Saya melihat banyak solusi matematis, tetapi di Retina pendekatan langsung tampaknya menjadi yang terbaik.

Penjelasan

{`membuat seluruh program berjalan dalam satu lingkaran sampai string tidak berubah lagi. Loop terdiri dari dua tahap:

.
*

Ubah setiap digit menjadi unary.

.

Hitung jumlah karakter (= konversi angka unary ke desimal).

Ini berfungsi karena mengonversi setiap digit ke unary tanpa pemisah antara digit menciptakan satu angka unary yang sama dengan jumlah semua digit.


2

Brachylog , 9 byte

#0|@e+:0&

Cobalah online!

Penjelasan

#0            Input = Output = a digit
  |           OR
   @e         Split the input into a list of digits
     +        Sum
      :0&     Call this predicate recursively

Pendekatan alternatif, 11 byte

: I: {@ e +} i # 0

Yang ini menggunakan meta-predikat i - Iterateuntuk memanggil Ikali predikat {@e+}pada input. Ini akan mencoba nilai Idari 0hingga tak terbatas hingga satu membuatnya sehingga output dari iadalah satu digit yang membuat #0benar.


2

JavaScript (ES6), 41 38 byte

Disimpan 3 byte, terima kasih kepada Bassdrop Cumberwubwubwub

Mengambil dan mengembalikan string.

f=s=>s[1]?f(''+eval([...s].join`+`)):s

Uji kasus


4
Anda dapat mengubah s.split``ke[...s]
Bassdrop Cumberwubwubwub

2

CJam , 19 13 byte

r{:~:+_s\9>}g

Penerjemah

Penjelasan:

r{:~:+_s\9>}g Code
r             Get token
 {:~:+_s\9>}  Block: :~:+_s\9>
   ~          Eval
  :           Map
     +        Add
    :         Map
      _       Duplicate
       s      Convert to string
        \     Swap
         9    9
          >   Greater than
            g Do while (pop)

Terima kasih untuk 8478 (Martin Ender) untuk -6 byte.


CJam, 6 byte

ri(9%)

Disarankan oleh 8478 (Martin Ender). Penerjemah

Saya sedang memikirkannya, tetapi Martin baru saja mendapatkannya sebelum saya. Penjelasan:

ri(9%) Code
r      Get token
 i     Convert to integer
  (    Decrement
   9   9
    %  Modulo
     ) Increment

Peta perintah tunggal dan pengurangan keduanya bisa ditulis dengan awalan :, jadi Anda bisa melakukannya :~:+. Juga tidak ada salahnya untuk menjalankan blok setidaknya sekali sehingga Anda dapat menggunakan gloop, bukan wloop.
Martin Ender

@ MartinEnder r{_,1>}{:~:+`}wberfungsi, tapi saya tidak tahu bagaimana bisa saya gunakan di gsini.
Erik the Outgolfer

Contohnya seperti ini: r{:~:+_s\9>}g(tentu saja solusi bentuk tertutup ri(9%)jauh lebih pendek.
Martin Ender

@ MartinEnder Ya ampun, sungguhan, aku pemula sekali ...
Erik the Outgolfer

Yang kedua tidak bekerja pada kelipatan 9
ThePlasmaRailgun

2

Java 7, 63 byte

int f(int n){int s=0;for(;n>0;n/=10)s+=n%10;return s>9?f(s):s;}

Fungsi rekursif yang hanya mendapat digit dengan mod / div. Tidak ada yang mewah.

Pelabuhan murah

dari Jonathan Allan akan menjadi sangat sedikit 28 byte:

int f(int n){return~-n%9+1;}

1

Python 2, 54 51 byte

i=input()
while~-len(i):i=`sum(map(int,i))`
print i 

Terima kasih kepada Oliver dan Karl Napf karena membantu saya menghemat 3 byte


Anda dapat mengubah while len(i)>1ke while~-len(i)untuk menyimpan satu byte.
Oliver Ni

Saya pikir Anda dapat menghilangkan tanda centang di sekitar input()dan memaksa input yang dilampirkan dalam tanda kutip untuk menghemat 2 byte.
Karl Napf

@ KarlNapf Saya tidak berpikir Anda bisa melakukan ini ketika input bilangan bulat.
Erik the Outgolfer

@EriktheGolfer, op mengatakan bahwa input dapat diambil sebagai string
Daniel

1

Python, 45 byte

f=lambda x:x[1:]and f(`sum(map(int,x))`)or x

Membawa argumen sebagai string.



1

C, 64 29 byte

Port C dari jawaban Jonathan Allan (dengan kasus khusus 0).

f(i){return i>0?~-i%9+1:0;}

Kode 64 byte sebelumnya:

q(i){return i>9?i%10+q(i/10):i;}
f(i){i=q(i);return i>9?f(i):i;}

qmengambil cross sum dan fmengulangi mengambil cross sum sampai satu digit.


1

Retina , 15 byte

.+
$*
1{9}\B

1

Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)

Penjelasan

.+
$*

Konversikan input ke unary.

(1{9})*\B

Ambil modulo berbasis 1 dengan menghapus sembilan yang memiliki setidaknya satu karakter lagi setelahnya.

1

Hitung jumlah 1s yang tersisa untuk dikonversi kembali ke desimal.


1

Perl 6 , 29 byte

{($_,*.comb.sum...10>*)[*-1]}

Diperluas:

{ # bare block lambda with implicit parameter 「$_」
  ( # generate a sequence

    $_,         # starting with the input
    *.comb.sum  # Whatever lambda that splits into digits, and finds sum
    ...         # keep doing that
    10 > *      # until it is less than 10

  )[ * - 1 ] # get the last value
}

1

Faktor , 24

Cerdas , jawaban yang matematika .

[ neg bitnot 9 mod 1 + ]

63 untuk solusi berulang bodoh:

[ [ dup 9 > ] [ number>string >array [ 48 - ] map sum ] while ]

1

Labirin , 8 byte

?(_9%)!@

menggunakan persamaan (n-1)%9+1:

  • ? membaca input sebagai desimal dan mendorongnya ke stack
  • ( mengurangi bagian atas tumpukan
  • _ mendorong angka nol ke atas tumpukan
  • 9 dorong bagian atas tumpukan muncul kali 10 digit (dalam hal ini, 9)
  • % muncul y, muncul x, mendorong x% y
  • ) menambah bagian atas tumpukan
  • ! muncul bagian atas tumpukan dan keluar menempatkannya sebagai string desimal
  • @ mengakhiri program

1

Pyth - 7 4 6 7 byte

Bukan yang terbaik, tetapi masih mengalahkan sejumlah jawaban yang layak:

|ejQ9 9

Seperti versi sebelumnya, tetapi menangani juga kasus kelipatan 9, menggunakan logika atau.


Versi ini gagal pada 45 testcase :

ejQ9

Penjelasan:

 jQ9  -> converting the input to base 9
e     -> taking the last digit

Coba di sini

Coba versi sebelumnya di sini!


Solusi sebelumnya:

&Qh%tQ9

Penjelasan :

    tQ    -> tail: Q-1
   %tQ9   -> Modulo: (Q-1)%9
  h%tQ9   -> head: (Q-1)%9+1
&Qh%tQ9   -> Logical 'and' - takes the first null value. If Q is 0 - returns zero, otherwise returns the (Q-1)%9+1 expression result

Anda diundang untuk mencobanya di sini !


Versi 4-byte Anda gagal test case 45 .
Dennis

Tidakkah ini memberi 0 untuk kelipatan 9?
xnor

Ya, saya baru menyadarinya. Akan melakukan beberapa perbaikan di sana. Rupanya, jQ9tidak bertindak seperti Jelly's ḃ9:-P
Yotam Salmon


1

Hexagony, 19 15 byte

.?<9{(/>!@!/)%' 

Lebih Mudah Dibaca:

  . ? < 
 9 { ( /
> ! @ ! / 
 ) % ' .
  . . . 

Cobalah online!

-3 byte dengan mengambil pendekatan yang berbeda, menjadikan 0 edge case trivial.
-1 byte dengan memperbaiki bug 0 edge case

Menggunakan rumus ((n-1) mod 9) +1 seperti banyak solusi lain juga.


1

K (oK) , 9 byte

Larutan:

(+/.:'$)/

Cobalah online!

Penjelasan:

Sangat mudah. Pisahkan angka menjadi angka dan jumlah - lakukan ini sampai hasilnya menyatu:

(+/.:'$)/ / the solution
(      )/ / do this until result converges
      $   / string, 1234 => "1234"
   .:'    / value each, "1234" => 1 2 3 4
 +/       / sum over, 1 2 3 4 => 10

1
Dalam implementasi k saya membuat x\yencode ydi base xdengan digit sebanyak yang diperlukan, jadi ini sedikit lebih pendek:(+/10\)/
ngn

Bagus. Dalam versi yang lebih baru dari kdb + (saya pikir dari 3.4 ke atas) dapat Anda lakukan 10\:.. tetapi tidak di oK - dan .:'$jumlah byte yang sama - jadi saya pergi dengan itu :)
streetster

oK menggunakan \ dan memerlukan daftar di sebelah kiri: `(, 10)`
ngn

Memang, implementasi Anda menambahkan "digit sebanyak yang diperlukan", yang merupakan apa yang Anda dapatkan dari \:dalam kdb + (3.4+), tetapi untuk oK saya perlu tahu berapa banyak 10 untuk dimasukkan ke dalam daftar saya.
streetster

1

Keg , 6 byte (SBCS pada Keg wiki)

¿;9%1+

Penjelasan:

¿#      Take implicit input
 ;9%1+# Digital Root Formula
# Implicit output

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.