Tabandaki çıkış N -10


18

Meydan okuma:

Seçtiğiniz programlama dilinde, bir tamsayıyı taban 10'da giriş olarak kabul edin ve taban -10 olarak da bilinen negatif gösterimle çıktılayın

Örnek algoritma:

Bu, taban 10'u VB.NET'teki herhangi bir negatif tabana dönüştürmek için Wikipedia'dan alınan bir algoritmadır :

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

Açıkçası, meydan okumayı yerine getirdiği sürece herhangi bir algoritmayı kullanabilirsiniz

Örnek girişler / çıkışlar:

Giriş:

12

Çıktı:

192

Başka bir örnek:

Giriş:

2048

Çıktı:

18168

Kural:

Programlama dilinizde var olan bu sorunu çözen yerleşik yöntemleri kullanmamalısınız

Bu bir kod golf , bu yüzden en kısa kod kazanır!


3
Bence sadece bu spesifik problemi çözen ve mevcut tüm builltinleri çözmeyen yerleşikleri unutmak istiyorsunuz.
Denker

İlgili OEIS
devRicher

6
Negatif bir test senaryosu eklemelisiniz.
xnor

1
İstiyorsunuz [0, 1, 8, 1, 6, 8]girişi için kabul edilebilir bir çıkışı 2048?
Dennis

2
Spesifikasyonda bahsetmeye değer olabilir. VB kodunuz bir liste döndürüyor gibi görünüyor.
Dennis

Yanıtlar:


12

JavaScript (ES6), 51 45 37 bayt

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

Test senaryoları


Bu algoritma için bir referans var mı?
dfernan

@dfernan Gerçekten bilmiyorum. Bu, önerilen algoritma ile başlayarak birkaç golf yinelemesinin sonucudur.
Arnauld

5

Japt , 11 bayt

_ì ìAn)¥U}a

Çevrimiçi test edin!

açıklama

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

Toplu, 82 bayt

@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

Batch'ın bölümü sıfıra indirir, bu yüzden kalan negatif ise telafi etmek için 1 eklemeniz (ve geri kalanına 10 eklemeniz) gerekir. Rakamlar %2sonuç sıfır oluncaya kadar birikir .


4

Jöle , 9 bayt

Dḅ-10=ð1#

Bu, negatif-tamsayı-tamsayı dönüşümünün kaba-kuvvet tersidir.

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Arnauld algoritmasının Python portu .

Alternatif olarak, 102 bayt için orijinal yazının algoritmasını kullanarak genel bir işlev:

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, başka bir girdiye bağlı olan varsayılan bir girdi bildirmenize izin vermez.
xnor

@xnor Benim Python yüklemesinde çalışır: Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44).
dfernan

Nasıl arıyorsun? Benim yaptığım bu (3.5.2 olarak). Kodda kveya nbaşka bir yerde beyan ediyor olabilir misiniz ?
xnor

1
İyi, güzel bir gelişme görünüyor! Artık işlev çağrısının çevresindeki parenslere ihtiyacınız yok.
xnor

1
Sonuncusu operatör önceliği olarak açıklayabilirim. -n//10yapar -(n//10): negate nile daha sonra zemin bölme 10, burada mermi negatif sonsuzluğa doğru aşağıya, 0 değil aksine, 0-n//10yapar 0-(n//10), burada 10 ile birinci kat-bölme, daha sonra ortadan kaldırır. Her ne sebeple olursa olsun, Python tek yönlü olumsuzlamaları ikili eksi değerden daha yüksek bir öncelikle ele alır. Bu öncelik tablosuna bakın . Golfte daha önce aynı durumla karşılaştım.
xnor

2

Jöle , 10 bayt

:⁵NµÐĿ%⁵ṚḌ

Çevrimiçi deneyin!

Arka fon

Negatif olmayan bir listenin baz b'den tamsayıya dönüştürülmesi, x, y ↦ bx + y fonksiyonu ile sola katlanarak elde edilebilir . B tabanına dönüştürmek ve tamsayıyı dönüştürmek için bu işlevi tersine çevirmemiz gerekir, yani, bx + y ↦ x, y için bir ifade bulmalıyız .

Python'da (ve uzantıyla Jelly), modulo operatörünün sonucu her zaman negatif değildir, bu nedenle (bx + y)% | b | = y .

Ayrıca, tamsayı bölümü her zaman aşağı yuvarlar ve q = n / d ve r = n% d ise , n = qd + r eşitliğinin korunduğundan emin olun . Eğer s işaretidir b , ardından (sx) b | + y = bx + y , yani sx = (bx + y) / | b | ve bu nedenle, s ((bx + y) / | b |) = x.

Nasıl çalışır

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

Bu üzerinde çalıştığım bir şablon dil.
Hiçbir şekilde golf için değildir.
Tam bir temel matematik bile yok, ancak doğrudan küçük PHP parçacıkları yazmanıza izin verir.
Bu sorunu giderir.

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

Bu bir sürü uyarı verir.
Kod PHP'ye "derlenir".

Ungolfed, çöp boşluklu:

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

Gerekirse, adım adım bir açıklama eklenebilir, ancak bunun oldukça basit olduğuna inanıyorum.


Feragatname :

Bu cevabı yazarken son taahhüt 2017-01-07 20:36 UTC + 00: 00 idi.
Üzerindeki bu çalışmalar taahhüt 140e56ff38f45fa4fd40fd3ec382094e707b1bad 00: 2017/01/06 23:27 UTC + 00 dan.
Bu cevabı çalıştırmak için kullanılan versiyon budur.

PHP kodu https://raw.githubusercontent.com/ismael-miguel/SimpleTemplate/140e56ff38f45fa4fd40fd3ec382094e707b1bad/SimpleTemplate.php adresinde mevcuttur.

Bunu son sürümle çalıştırmanızı öneriyorum, ancak bu soru için iyi çalışıyor.


Nasıl çalıştırılır?

Kod ile bir dosya oluşturun ve şu şekilde çalıştırın:

<?php

    include 'path/to/SimpleTemplate.php';

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

    $template->render(<number>);

Değer daha sonra ekranda görüntülenecektir.


2

PHP, 71 67 bayt

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

veya Arnauld'un cevabı için 62 bayt :

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

1

Mathematica, 49 bayt

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

dBir tamsayı bağımsız değişkeni alan ve bir dize döndüren bir işlevi tanımlar . Özyinelemeli bir algoritma — Arnauld'un cevabındaki aynı algoritmaya benziyor . Negatif sayılar üzerinde de çalışır. (Giriş 0 ise, "0" yerine boş dize döndürür.) Mathematica golfçüler için not: kullanmak ±için fazladan bir parantez seti gerekir ve bu nedenle daha kısa görünmüyor.


0

C, 68 bayt

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

Sonuçta elde edilen sayıyı yazdırmak yerine program geri döner. Açıkçası bu Arnauld'un cevabı , tek fark, C yorumlanmış bir dil olmadığı için, sadece bir fonksiyonun aksine tam bir program yapmam gerektiğini hissettim.


1
Nasıl geri dönüyor? fGerçekten aptal olmadıkça işlev döndüğünde kapsam dışına çıkar.
abligh

@abligh Gerçekten aptal değilsin, sadece GCC gerçekten aptal. Geçersiz olmayan bir işlev geri dönüş olmadan sonlanırsa, yalnızca son atamayı kullanır.
Etaoin Shrdlu

0

Pas, 88 bayt

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

Bu sadece soruda verilen algoritmanın özyinelemeli bir sürümüdür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.