Đầu ra N trong cơ sở -10


18

Thử thách:

Trong ngôn ngữ lập trình bạn chọn, chấp nhận một số nguyên làm đầu vào trong cơ sở 10 và xuất nó theo ký hiệu phủ định , còn được gọi là cơ sở -10

Thuật toán ví dụ:

Đây là một thuật toán được lấy từ Wikipedia để chuyển đổi cơ sở 10 thành bất kỳ cơ sở tiêu cực nào trong VB.NET :

Function toNegativeBase(Number As Integer , base As Integer) As System.Collections.Generic.List(Of Integer)

    Dim digits As New System.Collections.Generic.List(Of Integer)
    while Number <> 0
        Dim remainder As Integer= Number Mod base
        Number = CInt(Number / base)

        if remainder < 0 then
            remainder += system.math.abs(base)
            Number+=1
        end if

        digits.Insert(0, remainder)
    end while

    return digits
end function

Rõ ràng, bạn có thể sử dụng bất kỳ thuật toán nào, miễn là nó hoàn thành thử thách

Ví dụ đầu vào / đầu ra:

Đầu vào:

12

Đầu ra:

192

Một vi dụ khac:

Đầu vào:

2048

Đầu ra:

18168

Qui định:

Bạn không được sử dụng bất kỳ phương thức tích hợp nào giải quyết vấn đề này tồn tại trong ngôn ngữ lập trình của bạn

Đây là một mã golf , vì vậy mã ngắn nhất sẽ thắng!


3
Tôi nghĩ rằng bạn chỉ muốn bỏ qua các phần mềm tích hợp để giải quyết vấn đề cụ thể này chứ không phải tất cả các builltins hiện có.
Denker

OEIS liên quan: A039723
devR Rich

6
Bạn nên thêm một trường hợp thử nghiệm âm tính.
xnor

1
Sẽ [0, 1, 8, 1, 6, 8]là một đầu ra chấp nhận được cho đầu vào 2048?
Dennis

2
Đó có thể là giá trị đề cập trong thông số kỹ thuật. Mã VB của bạn trông giống như nó trả về một danh sách.
Dennis

Câu trả lời:


12

JavaScript (ES6), 51 45 37 byte

f=n=>n&&n%10+((k=n<0)+f(k-n/10|0))*10

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


Có một tài liệu tham khảo cho thuật toán này?
dfer Nam

@dfernan Tôi không thực sự biết. Đây là kết quả của một số lần lặp chơi gôn, bắt đầu với thuật toán được đề xuất.
Arnauld

5

Japt , 11 byte

_ì ìAn)¥U}a

Kiểm tra nó trực tuyến!

Giải trình

_ì ìAn)¥U}a  // Implicit: U = input integer, A = 10
_        }a  // Return the smallest non-negative integer Z that returns a truthy value
             // when run through this function:
 ì           //   Convert Z to a list of its base 10 digits.
   ìAn)      //   Interpret this as a list of base -10 digits and convert to a base 10 integer.
       ¥U    //   Return (the result == U).
             // Implicit: output result of last expression

4

Mẻ, 82 byte

@set/a"d=%1%%10,n=%1/-10-(a=d>>4),d-=a*10
@if %n% neq 0 %0 %n% %d%%2
@echo %d%%2

Bộ phận của Batch cắt ngắn về 0, vì vậy nếu phần còn lại âm, tôi cần thêm 1 (và thêm 10 cho phần còn lại) để bù. Các chữ số sau đó được tích lũy %2cho đến khi kết quả trở thành số không.


4

Thạch , 9 byte

Dḅ-10=ð1#

Đây là một nghịch đảo lực lượng chuyển đổi từ số nguyên sang số nguyên.

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

Làm thế nào nó hoạt động

Dḅ-10=ð1#  Main link. Argument: n

      ð    Combine the links to the left into a chain and start a new, dyadic
           chain with left and right argument n.
       1#  Repeatedly execute the chain with left argument k = n, n + 1, ... and
           right argument n until the first match is found.
D          Convert k to decimal.
 ḅ-10      Convert the result from base -10 to integer.
     =     Compare the result with n.


3

Python 3, 35 byte

f=lambda n:n and n%10+f(0-n//10)*10

Cổng Python của thuật toán Arnauld .

Ngoài ra, với 102 byte một hàm chung sử dụng thuật toán của bài gốc:

def f(n,b,r=0):
 if n:
  r,n=n%b,n//b
  if r<0:r+=abs(b);n+=1
  return f(n,b,r)+str(r)
 else:return ""

Python không cho phép bạn khai báo một đầu vào mặc định phụ thuộc vào đầu vào khác.
xnor

@xnor Nó hoạt động trên cài đặt Python của tôi : Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44).
dfer Nam

Bạn gọi nó như thế nào? Tôi đang làm điều này (trong 3.5.2). Bạn có thể khai báo khoặc nnơi nào khác trong mã?
xnor

1
Có vẻ tốt, cải thiện tốt đẹp! Bạn không cần các parens xung quanh chức năng gọi nữa.
xnor

1
Điều cuối cùng tôi có thể giải thích là ưu tiên toán tử. -n//10không -(n//10): phủ nhận n, sau đó sàn chia 10, trong đó vòng xuống phía vô cực tiêu cực, không 0. Ngược lại, 0-n//10thực hiện 0-(n//10), lần đầu tiên sàn chia bằng 10, sau đó phủ nhận. Vì bất kỳ lý do gì, Python xử lý phủ định đơn phương với mức độ ưu tiên cao hơn trừ nhị phân. Xem bảng ưu tiên này . Tôi đã gặp tình huống tương tự trước khi chơi golf.
xnor

2

Thạch , 10 byte

:⁵NµÐĿ%⁵ṚḌ

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

Lý lịch

Chuyển đổi danh sách không âm từ cơ sở b sang số nguyên có thể đạt được bằng cách gấp trái bằng hàm x, y bx + y . Để chuyển đổi và số nguyên thành cơ sở b , chúng ta chỉ cần đảo ngược hàm đó, tức là tìm một biểu thức cho bx + y ↦ x, y .

Trong Python (và, bởi phần mở rộng, Jelly), kết quả của toán tử modulo luôn không âm, vì vậy (bx + y)% | b | = y .

Ngoài ra, phép chia số nguyên luôn làm tròn xuống, đảm bảo rằng nếu q = n / dr = n% d , đẳng thức n = qd + r giữ. Nếu s là dấu của b , thì (sx) | b | + y = bx + y , vì vậy sx = (bx + y) / | b | và, do đó, s ((bx + y) / | b |) = x.

Làm thế nào nó hoạt động

:⁵NµÐĿ%⁵ṚḌ  Main link. Argument: n

   µ        Combine the links to the left into a monadic chain.
    ÐĿ      Iteratively apply the chain until the results are no longer unique.
            Collect all unique results in an array.
:⁵            Divide the previous return value (initially n) by 10.
  N           Negate; multiply the result by -1.
      %⁵    Take all results modulo 10.
        Ṛ   Reverse the results.
         Ḍ  Convert from base 10 to integer.

2

SimpleTemplate , 147 byte

Đây là ngôn ngữ mẫu mà tôi đang làm việc.
Nó không có nghĩa là để chơi gôn.
Nó thậm chí còn thiếu hoàn thành toán cơ bản, nhưng nó cho phép viết các đoạn PHP nhỏ trực tiếp.
Điều này hoạt động xung quanh vấn đề đó.

{@setN argv.0}{@whileN}{@setM N}{@php$DATA[N]=($DATA[M]/-10)|0;$DATA[R]=$DATA[M]%-10}{@ifR is lower0}{@incby10 R}{@incN}{@/}{@setD R,D}{@/}{@echoD}

Điều này ném một loạt các cảnh báo.
Mã được "biên dịch" thành PHP.

Ungolfed, với khoảng trắng rác:

{@set no argv.0}
{@while no}
    {@set temp_no no}
    {@php $DATA["no"] = ($DATA["temp_no"] / -10) | 0}
    {@php $DATA["remainder"] = $DATA["temp_no"] % 10}

    {@if remainder is lower than 0}
        {@inc by 10 remainder}
        {@inc no}
    {@/}
    {@set digits remainder, digits}
{@/}
{@echo digits}

Nếu được yêu cầu, có thể thêm một lời giải thích theo từng bước, nhưng tôi tin rằng nó khá đơn giản.


Tuyên bố miễn trừ trách nhiệm :

Cam kết cuối cùng, tính đến thời điểm viết câu trả lời này, là vào ngày 2017-01 / 07 20:36 UTC + 00: 00.
Điều này hoạt động trên cam kết 140e56ff38f45fa4fd40fd3ec382094e707b1bad từ 2017-01-06 23:27 UTC + 00: 00.
Đó là phiên bản được sử dụng để chạy câu trả lời này.

Mã PHP có sẵn trên https://raw.githubusercontent.com/ismael-miguel/SimpleTemplate/140e56ff38f45fa4fd40fd3ec382094e707b1bad/SimpleTemplate.php

Tôi khuyên bạn nên chạy phiên bản này với phiên bản cuối cùng, nhưng phiên bản này hoạt động tốt cho câu hỏi này.


Làm thế nào để chạy?

Tạo một tệp với mã và chạy nó như thế này:

<?php

    include 'path/to/SimpleTemplate.php';

    $template = new SimpleTemplate('<code>');

    $template->render(<number>);

Giá trị sau đó sẽ được hiển thị trên màn hình.


2

PHP, 71 67 byte

for(;$n=&$argn;$n=$g-$n/10|0)$d=($r=$n%10)+10*($g=$r<0).$d;echo+$d;

hoặc 62 byte cho một cổng câu trả lời của Arnauld :

function n($n){return$n?$n%10+(($k=$n<0)+f($k-$n/10|0))*10:0;}

1

Toán học, 49 byte

d@0="";d@n_:=d[-Floor[n/10]]<>ToString[n~Mod~10];

Xác định hàm dlấy một đối số nguyên và trả về một chuỗi. Một thuật toán đệ quy có vẻ giống như thuật toán trong câu trả lời của Arnauld . Nó cũng hoạt động trên các số âm. (Nó trả về giá trị chuỗi rỗng là "0" nếu đầu vào bằng 0.) Lưu ý cho người chơi gôn Mathicala: sử dụng ±yêu cầu thêm một bộ dấu ngoặc đơn và do đó dường như không ngắn hơn.


0

C, 68 byte

main(f,a){f&&scanf("%d",&a);f=a?a%10+((f=a<0)+main(0,f-a/10))*10:0;}

Thay vì in số kết quả, chương trình chỉ trả về nó. Rõ ràng đây là câu trả lời của Arnauld , sự khác biệt duy nhất là vì C không phải là ngôn ngữ được diễn giải nên tôi cảm thấy mình nên biến nó thành một chương trình đầy đủ chứ không phải chỉ là một chức năng.


1
Làm thế nào là nó trả lại nó? fđi ra khỏi phạm vi khi hàm trả về trừ khi tôi thực sự bị câm.
bỏ qua

@ableigh Bạn không thực sự ngu ngốc, chỉ là GCC thực sự ngu ngốc. Nếu một hàm không trống kết thúc mà không trả về, nó sẽ chỉ sử dụng phép gán cuối cùng.
Etaoin Shrdlu

0

Rust, 88 byte

fn g(mut n:i32)->i32{let mut r=n%10;n/=-10;if r<0{r+=10;n+=1;}if n==0{r}else{r+g(n)*10}}

Đây chỉ là một phiên bản đệ quy của thuật toán được cung cấp trong câu hỏi.

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.