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.

Oliver Ni
sumber
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)
Jonathan Allan
sumber
13

JavaScript (ES6), 16 10 byte

n=>--n%9+1

Uji kasus

Johan Karlsson
sumber
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.

DJMcMayhem
sumber
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.

Martin Ender
sumber
6

Python, 16 20 byte

+4 byte untuk menangani kasus tepi nol.

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

repl.it

Jonathan Allan
sumber
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).

Martin Ender
sumber
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;
Jörg Hülsermann
sumber
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
Laikoni
sumber
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
Ton Hospel
sumber
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)
Billywob
sumber
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.

Leo
sumber
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.

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

Arnauld
sumber
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
Erik the Outgolfer
sumber
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;}
Geobit
sumber
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

Daniel
sumber
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.

Loovjo
sumber
1

05AB1E , 6 byte

[SODg#

Cobalah online!

Penjelasan

[        # infinite loop
 S       # split into digits
  O      # sum digits
   Dg#   # if length == 1: break
Emigna
sumber
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.

Karl Napf
sumber
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.

Martin Ender
sumber
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
}
Brad Gilbert b2gills
sumber
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 ]
kucing
sumber
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
Robert Hickman
sumber
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 !

Salmon Yotam
sumber
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.

Adyrem
sumber
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
streetster
sumber
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
SEBUAH
sumber
0

Ruby, 12 byte

->n{~-n%9+1}
TuxCrafting
sumber
19? Bukankah seharusnya begitu 9?
Ton Hospel
@TonHospel Ya, kesalahan bodoh: P
TuxCrafting