In gốc kỹ thuật số


19

Điều này khác với Lời của tôi có thể đánh bại Lời của bạn vì nó ít phức tạp hơn và chỉ yêu cầu bạn tính toán và không so sánh chúng.

Để tìm gốc kỹ thuật số, lấy tất cả các chữ số của một số, thêm chúng và lặp lại cho đến khi bạn nhận được một số có một chữ số. Ví dụ, nếu con số này là 12345, bạn sẽ thêm 1, 2, 3, 4, và 5, nhận được 15. Sau đó , bạn sẽ thêm 15, cho bạn 6.

Nhiệm vụ của bạn

Đưa ra một số nguyên N (0 <= N <= 10000) thông qua STDIN , in gốc kỹ thuật số của N .

Các trường hợp thử nghiệm

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

Hãy nhớ rằng, đây là , vì vậy mã có số byte nhỏ nhất sẽ thắng.


1
Có lẽ một nhiệm vụ của thử thách này .
nimi

3
Liên quan rất chặt chẽ đến thử thách này ... có thể đủ gần để bị lừa.
admBorkBork

8
Hãy chính xác hơn khi nói number. Đặc biệt. đầu vào phải 0được hỗ trợ?
TonMedel

2
@TimmyD Tôi nghĩ rằng đây là một thách thức rõ ràng hơn mà không cần thêm chữ cái vào chuyển đổi số nguyên, tính toán hàm cho hai giá trị và bao gồm cả chữ STALEMATE. Nó có thể tốt hơn để đóng cái khác như là một bản sao của điều này.
Martin Ender

3
@MartinEnder Tôi đã rút lại phiếu bầu gần của mình, tôi nghĩ thật không công bằng khi đóng một thử thách tốt như là một bản sao của một thử thách phức tạp khác.
Erik the Outgolfer

Câu trả lời:



17

Thạch , 7 5 4 3 byte

ḃ9Ṫ

Dùng thử trực tuyến! hoặc tất cả các trường hợp thử nghiệm

Làm sao?

Các gốc kỹ thuật số được biết là tuân theo công thức (n-1)% 9 + 1.
Đây là giống như chữ số cuối cùng trong cơ sở phỏng đoán 9
(và do thực hiện 0ḃ9=[][]Ṫ=0điều này xử lý trường hợp cạnh bằng 0).

ḃ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

Các trường hợp thử nghiệm


6

MATL , 3 byte

9X\

Hãy thử trực tuyến!

Rất nhiều (bây giờ đã xóa câu trả lời) đã thử sử dụng modulo 9 để có kết quả. Đây là một phím tắt tuyệt vời, nhưng không may là không hoạt động cho bội số của 9. MATL có chức năng cho modulo trên khoảng [1, n]. Sử dụng modulo này, chúng tôi có 1 % 3 == 1, 2 % 3 == 2, 3 % 3 == 3, 4 % 3 == 1, v.v ... Câu trả lời này chỉ đơn giản là lấy modulo đầu vào chín bằng cách sử dụng modulo tùy chỉnh này.


6

Toán học, 27 11 byte

Mod[#,9,1]&

Mathematica Modlấy tham số thứ ba làm phần bù cho phạm vi kết quả của modulo. Điều này tránh làm giảm đầu vào và tăng đầu ra.


6

Python, 16 20 byte

+4 byte để xử lý trường hợp cạnh bằng không.

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

thay thế


1
Ồ Điều này rất dễ dàng, nó có thể được chuyển sang bất kỳ ngôn ngữ nào. Bạn thậm chí có thể~-input()%9+1
Karl Napf

1
Không làm việc cho 0 không may.
Emigna

@KarlNapf Sẽ không cần một print?
Jonathan Allan

@Jonathan ALLan Ah, có thể. Tôi chỉ thử nghiệm nó trong môi trường REPL và điều đó đã làm điều đó.
Karl Napf

1
@ người dùng ẩn danh đã cố gắng chỉnh sửa - nó thực sự đã phá vỡ mã (tạo ra 0kết quả đầu vào 9thay vì 0, phần được phục vụ cho n andmột phần của mã) hơn nữa, nó sẽ được tính là 19 byte chứ không phải 13 ( vì printvà không gian phải được tính).
Jonathan Allan

4

Julia, 12 byte

!n=mod1(n,9)

hoặc là

n->mod1(n,9)

mod1là một thay thế cho modbản đồ đến phạm vi [1, n]thay vì [0, n).


4

PHP, 15 byte

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

Phiên bản trước PHP, 55 byte

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

Chính xác là tôi đã làm như thế nào!
CT14.IT

@ CT14.IT Tôi có thể xóa bài đăng này nếu bạn muốn. Bài đăng đã bị xóa của bạn sớm hơn 1 phút và bạn chỉ quên vòng lặp while
Jörg Hülsermann

Không, câu trả lời đã bị xóa là sai vì tôi đã không đọc đúng câu hỏi để bắt đầu, tôi đã không cố tổng hợp số được tạo
CT14.IT

2
Bạn có thể thêm các trick của câu trả lời khác<?=--$argv[1]%9+1?>
Crypto

3

Haskell, 35 34 byte

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

Hãy thử nó trên Ideone.

Giải trình:

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

Bao gồm +2 cho -lp

Cung cấp đầu vào trên STDIN

root.pl <<< 123

root.pl

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

Đây là giải pháp nhàm chán đã được đưa ra bằng nhiều ngôn ngữ, nhưng ít nhất phiên bản này 0cũng hỗ trợ

Thú vị hơn khi thực hiện các bổ sung lặp lại thực sự (mặc dù theo thứ tự khác) thực tế chỉ dài hơn 1 byte:

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

3

R, 72 67 29 byte

Chỉnh sửa: Cảm ơn @rturnbull đã loại bỏ hai byte.

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

Gần đây tôi đã biết rằng ifelsecó thể được thay thế bằng `if`, với hành vi giống hệt nhau, giúp bạn tiết kiệm một vài byte.
rturnbull

@rturnbull Tôi luôn tự hỏi làm thế nào ` if` làm việc. Bạn có thể đưa ra một ví dụ hoặc có thể thêm nó vào Mẹo để chơi gôn không?
Billywob

Cách đơn giản nhất để hiểu nó là nó không được vector hóa ifelse. Trong trường hợp này, `if`(n%%9|!n,n%%9,9)cung cấp hành vi giống hệt với mã bạn đã đăng. Theo như tôi có thể nói, hành vi này là không có giấy tờ! Tôi sẽ thêm một nhận xét cho chủ đề mẹo.
rturnbull

3

Võng mạc , 7 byte

{`.
*
.

Hãy thử trực tuyến!

Tôi thấy rất nhiều giải pháp toán học, nhưng ở Retina, cách tiếp cận đơn giản dường như là cách tốt nhất.

Giải trình

{`làm cho toàn bộ chương trình chạy trong một vòng lặp cho đến khi chuỗi không thay đổi nữa. Vòng lặp bao gồm hai giai đoạn:

.
*

Chuyển đổi từng chữ số để unary.

.

Đếm số lượng ký tự (= chuyển đổi số đơn vị thành số thập phân).

Điều này hoạt động bởi vì chuyển đổi từng chữ số thành unary không có dấu phân cách giữa các chữ số sẽ tạo ra một số unary duy nhất bằng tổng của tất cả các chữ số.


2

Brachylog , 9 byte

#0|@e+:0&

Hãy thử trực tuyến!

Giải trình

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

Cách tiếp cận khác, 11 byte

: Tôi: {@ e +} i # 0

Cái này sử dụng biến vị ngữ meta i - Iterateđể gọi Ilần vị ngữ {@e+}trên đầu vào. Điều này sẽ thử các giá trị Itừ 0đến vô cùng cho đến khi người ta làm cho nó sao cho đầu ra ilà một chữ số duy nhất #0đúng.


2

JavaScript (ES6), 41 38 byte

Đã lưu 3 byte, nhờ Bassdrop Cumberwubwubwub

Lấy và trả về một chuỗi.

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

Các trường hợp thử nghiệm


4
Bạn có thể đổi s.split``thành[...s]
Bassdrop Cumberwubwubwub

2

CJam , 19 13 byte

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

Thông dịch viên

Giải trình:

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)

Cảm ơn 8478 (Martin Ender) cho -6 byte.


CJam, 6 byte

ri(9%)

Được đề xuất bởi 8478 (Martin Ender). Thông dịch viên

Tôi đã suy nghĩ về nó, nhưng Martin chỉ nhận được nó trước tôi. Giải trình:

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

Bản đồ một lệnh và rút gọn có thể được viết bằng tiền tố :, vì vậy bạn có thể làm :~:+. Việc chạy khối ít nhất một lần cũng không hại gì để bạn có thể sử dụng gvòng lặp thay vì wvòng lặp.
Martin Ender

@MartinEnder r{_,1>}{:~:+`}whoạt động, nhưng tôi không biết làm thế nào tôi nên sử dụng gở đây.
Erik the Outgolfer

Ví dụ như thế này: r{:~:+_s\9>}g(tất nhiên giải pháp dạng đóng ri(9%)ngắn hơn nhiều.
Martin Ender

@MartinEnder Oh gawd, thực tế bây giờ, tôi là người mới bắt đầu ...
Erik the Outgolfer

Cái thứ hai không hoạt động trên bội số của 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;}

Hàm đệ quy chỉ lấy các chữ số với mod / div. Không có gì lạ mắt.

Cổng giá rẻ

của Jonathan Allan sẽ là 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 

Cảm ơn Oliver và Karl Napf đã giúp tôi tiết kiệm 3 byte


Bạn có thể thay đổi while len(i)>1để while~-len(i)tiết kiệm một byte.
Oliver Ni

Tôi nghĩ rằng bạn có thể bỏ qua các dấu tick xung quanh input()và buộc đầu vào được đặt trong dấu ngoặc kép để lưu 2 byte.
Karl Napf

@KarlNapf Tôi không nghĩ bạn có thể làm điều này khi đầu vào là một số nguyên.
Erik the Outgolfer

@EriktheGolfer, op nói rằng đầu vào có thể được lấy dưới dạng chuỗi
Daniel

1

Python, 45 byte

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

Lấy đối số dưới dạng một chuỗi.



1

C, 64 29 byte

Cổng C từ câu trả lời của Jonathan Allan (với trường hợp đặc biệt 0).

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

Mã 64 byte trước đó:

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

qlấy tổng chéo và flặp lại lấy tổng chéo cho đến một chữ số.


1

Võng mạc , 15 byte

.+
$*
1{9}\B

1

Hãy thử trực tuyến!(Dòng đầu tiên cho phép bộ kiểm tra được phân tách bằng nguồn cấp.)

Giải trình

.+
$*

Chuyển đổi đầu vào thành unary.

(1{9})*\B

Lấy modulo dựa trên 1 bằng cách loại bỏ các số liệu có ít nhất một ký tự sau chúng.

1

Đếm số 1s còn lại để chuyển đổi thành số thập phân.


1

Perl 6 , 29 byte

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

Mở rộng:

{ # 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

Yếu tố , 24

Thông minh , mathy câu trả lời.

[ neg bitnot 9 mod 1 + ]

63 cho giải pháp lặp câm:

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

1

Mê cung , 8 byte

?(_9%)!@

sử dụng phương trình (n-1)%9+1:

  • ? đọc đầu vào dưới dạng thập phân và đẩy nó vào ngăn xếp
  • ( giảm đỉnh của ngăn xếp
  • _ đẩy một số không lên trên cùng của ngăn xếp
  • 9 đẩy đỉnh của ngăn xếp xuất hiện 10 lần chữ số (trong trường hợp này là 9)
  • % bật y, bật x, đẩy x% y
  • ) tăng đỉnh của ngăn xếp
  • ! bật lên trên cùng của ngăn xếp và đặt nó dưới dạng một chuỗi thập phân
  • @ chấm dứt chương trình

1

Bình - 7 4 6 7 byte

Không phải là tốt nhất, nhưng vẫn đánh bại một số lượng lớn câu trả lời:

|ejQ9 9

Giống như phiên bản trước, nhưng xử lý các trường hợp bội số của 9, sử dụng logic hoặc.


Phiên bản này thất bại trong 45 thử nghiệm :

ejQ9

Giải trình:

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

Hãy thử nó ở đây

Hãy thử phiên bản trước tại đây!


Giải pháp trước đây:

&Qh%tQ9

Giải thích :

    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

Bạn được mời thử nó ở đây !


Phiên bản 4 byte của bạn không thành công trong trường hợp kiểm tra 45 .
Dennis

Điều này có cho 0 cho bội số của 9 không?
xnor

Vâng, tôi chỉ nhận thấy nó. Sẽ làm một số sửa chữa ở đó. Rõ ràng, jQ9không hoạt động như Jelly's ḃ9:-P
Yotam Salmon


1

Lục giác, 19 15 byte

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

Đọc thêm:

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

Hãy thử trực tuyến!

-3 byte bằng cách thực hiện một cách tiếp cận khác, làm cho trường hợp 0 ​​cạnh trở nên tầm thường.
-1 byte bằng cách sửa lỗi trường hợp 0 ​​cạnh

Sử dụng công thức ((n-1) mod 9) + 1 giống như rất nhiều giải pháp khác.


1

K (oK) , 9 byte

Dung dịch:

(+/.:'$)/

Hãy thử trực tuyến!

Giải trình:

Siêu đơn giản. Chia số thành chữ số và tổng hợp - làm điều này cho đến khi kết quả hội tụ:

(+/.:'$)/ / 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
Khi thực hiện k tôi đã thực hiện x\ymã hóa ytrong cơ sở xvới càng nhiều chữ số càng cần thiết, vì vậy nó ngắn hơn một chút:(+/10\)/
ngn

Tốt đẹp. Trong các phiên bản mới hơn của kdb + (tôi nghĩ từ 3,4 trở lên) bạn có thể làm 10\:.. nhưng không phải trong oK - và .:'$có cùng số byte - vì vậy tôi đã sử dụng nó :)
streetster

oK sử dụng \ và yêu cầu một danh sách ở bên trái: `(, 10)`
ngn

Thật vậy, việc triển khai của bạn thêm "càng nhiều chữ số càng cần thiết", đó là những gì bạn nhận được từ \:kdb + (3.4+), nhưng đối với oK tôi cần biết có bao nhiêu số 10 trong danh sách của mình.
streetster

1

Keg , 6 byte (SBCS trên Keg wiki)

¿;9%1+

Giải trình:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.