Output N dalam basis -10


18

Tantangan:

Dalam bahasa pemrograman pilihan Anda, terima bilangan bulat sebagai input pada basis 10, dan hasilkan dalam notasi negatif , yang juga dikenal sebagai basis -10

Algoritme contoh:

Ini adalah algoritma yang diambil dari Wikipedia untuk mengonversi basis 10 ke basis negatif apa pun di 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

Jelas, Anda dapat menggunakan algoritma apa pun, asalkan memenuhi tantangan

Contoh input / output:

Memasukkan:

12

Keluaran:

192

Contoh lain:

Memasukkan:

2048

Keluaran:

18168

Aturan:

Anda tidak boleh menggunakan metode bawaan yang memecahkan masalah ini yang ada dalam bahasa pemrograman Anda

Ini adalah kode-golf , sehingga kode terpendek menang!


3
Saya pikir Anda hanya ingin mengorbankan built-in yang memecahkan masalah spesifik ini dan tidak semua builltin yang ada.
Denker

OEIS Terkait: A039723
devRicher

6
Anda harus menambahkan test case negatif.
xnor

1
Apakah [0, 1, 8, 1, 6, 8]akan menjadi input yang dapat diterima untuk input 2048?
Dennis

2
Itu mungkin layak disebutkan dalam spec. Kode VB Anda sepertinya mengembalikan daftar.
Dennis

Jawaban:


12

JavaScript (ES6), 51 45 37 byte

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

Uji kasus


Apakah ada referensi untuk algoritma ini?
dfernan

@fernan saya tidak begitu tahu. Ini adalah hasil dari beberapa iterasi golf, dimulai dengan algoritma yang disarankan.
Arnauld

5

Japt , 11 byte

_ì ìAn)¥U}a

Uji secara online!

Penjelasan

_ì ì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

Batch, 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

Divisi Batch terpotong menjadi nol, jadi jika sisanya negatif saya perlu menambahkan 1 (dan juga menambahkan 10 ke sisanya) untuk mengimbangi. Digit-digit tersebut kemudian diakumulasikan %2hingga hasilnya menjadi nol.


4

Jelly , 9 byte

Dḅ-10=ð1#

Ini adalah inversi brute-force dari konversi negadecimal-to-integer.

Cobalah online!

Bagaimana itu bekerja

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

Port Python dari algoritma Arnauld .

Atau, untuk 102 byte fungsi generik menggunakan algoritma dari pos asli:

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 tidak membiarkan Anda mendeklarasikan input default yang bergantung pada input lain.
xnor

@xnor Ia bekerja pada instalasi Python saya: Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44).
dfernan

Bagaimana Anda menyebutnya? Saya melakukan ini (dalam 3.5.2). Bisakah Anda mendeklarasikan katau ndi tempat lain dalam kode?
xnor

1
Terlihat bagus, peningkatan yang bagus! Anda tidak perlu lagi orangtua di sekitar panggilan fungsi.
xnor

1
Yang terakhir bisa saya jelaskan sebagai prioritas operator. -n//10tidak -(n//10): meniadakan n, lalu membelah lantai dengan 10, yang membulatkan ke arah tak terhingga negatif, bukan 0. Sebaliknya, 0-n//10apakah 0-(n//10), yang membelah lantai pertama dengan 10, kemudian meniadakan. Untuk alasan apa pun, Python memperlakukan negasi unary dengan prioritas lebih tinggi daripada biner minus. Lihat tabel diutamakan ini . Saya pernah mengalami situasi yang sama ini sebelumnya dalam bermain golf.
xnor

2

Jelly , 10 byte

:⁵NµÐĿ%⁵ṚḌ

Cobalah online!

Latar Belakang

Mengonversi daftar non-negatif dari basis b ke integer dapat dicapai dengan melipat-kiri dengan fungsi x, y ↦ bx + y . Untuk mengkonversi dan integer ke basis b , kita harus membalik fungsi itu, yaitu, menemukan ekspresi untuk bx + y ↦ x, y .

Dalam Python (dan, dengan ekstensi, Jelly), hasil dari operator modulo selalu non-negatif, jadi (bx + y)% | b | = y .

Juga, pembagian integer selalu dibulatkan ke bawah, memastikan bahwa jika q = n / d dan r = n% d , persamaan n = qd + r berlaku. Jika s adalah tanda b , maka (sx) | b | + y = bx + y , jadi sx = (bx + y) / | b | dan maka dari itu, s ((bx + y) / | b |) = x.

Bagaimana itu bekerja

:⁵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

Ini adalah bahasa templat yang telah saya kerjakan.
Tidak berarti itu dimaksudkan untuk bermain golf.
Bahkan tidak memiliki matematika dasar yang lengkap, tetapi memungkinkan untuk menulis potongan kecil PHP secara langsung.
Ini mengatasi masalah itu.

{@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}

Ini melempar banyak peringatan.
Kode ini "dikompilasi" ke dalam PHP.

Tidak disatukan, dengan spasi putih sampah:

{@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}

Jika diperlukan, penjelasan set-by-step dapat ditambahkan, tapi saya percaya itu cukup mudah.


Penolakan :

Komit terakhir, pada saat menuliskan jawaban ini, adalah pada 2017-01-07 20:36 UTC + 00: 00.
Ini berfungsi pada commit 140e56ff38f45fa4fd40fd3ec382094e707b1bad mulai 2017-01-06 23:27 UTC + 00: 00.
Itu adalah versi yang digunakan untuk menjalankan jawaban ini.

Kode PHP tersedia di https://raw.githubusercontent.com/ismael-miguel/SimpleTemplate/140e56ff38f45fa4fd40fd3ec382094e707b1bad/SimpleTemplate.php

Saya merekomendasikan menjalankan ini dengan versi terakhir, tetapi yang satu berfungsi dengan baik untuk pertanyaan ini.


Bagaimana cara menjalankannya?

Buat file dengan kode dan jalankan seperti ini:

<?php

    include 'path/to/SimpleTemplate.php';

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

    $template->render(<number>);

Nilai tersebut kemudian akan ditampilkan di layar.


2

PHP, 71 67 byte

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

atau 62 byte untuk port jawaban Arnauld :

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

1

Mathematica, 49 byte

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

Mendefinisikan fungsi dengan dmengambil satu argumen integer, dan mengembalikan sebuah string. Algoritma rekursif — tampak seperti algoritma yang sama dalam jawaban Arnauld . Itu bekerja pada angka negatif juga. (Ini mengembalikan string kosong intsead "0" jika inputnya adalah 0.) Catatan untuk pegolf Mathematica: menggunakan ±membutuhkan satu set kurung tambahan dan dengan demikian tampaknya tidak lebih pendek.


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;}

Alih-alih mencetak nomor yang dihasilkan program hanya mengembalikannya. Jelas ini adalah jawaban Arnauld , satu-satunya perbedaan adalah bahwa karena C bukan bahasa yang ditafsirkan saya merasa seperti saya harus menjadikannya program yang penuh bukan hanya fungsi.


1
Bagaimana cara mengembalikannya? fkeluar dari ruang lingkup ketika fungsi kembali kecuali saya benar-benar bodoh.
Abligh

@abligh Anda tidak benar-benar bodoh, hanya GCC yang benar-benar bodoh. Jika fungsi non-void berakhir tanpa pengembalian, itu hanya akan menggunakan tugas terakhir.
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}}

Ini hanya versi rekursif dari algoritma yang disediakan dalam pertanyaan.

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.