基数-10の出力N


18

チャレンジ:

選択したプログラミング言語で、整数 を10を基数として入力として受け入れ、負数表記で出力しますを基数としても知られるで

アルゴリズムの例:

これは、VB.NETで10を基数から任意の負の基数に変換するためにウィキペディアから取得したアルゴリズムです

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

明らかに、チャレンジを満たす限り、任意のアルゴリズムを使用できます

入力/出力の例:

入力:

12

出力:

192

もう一つの例:

入力:

2048

出力:

18168

ルール:

プログラミング言語に存在するこの問題を解決する組み込みメソッドを使用しないでください。

これはコードゴルフなので、最短のコードが勝ちです!


3
すべての既存のビルトインではなく、この特定の問題を解決するビルトインのみを放棄したいと思います。
デンカー

関連OEIS:A039723
devRicher

6
ネガティブテストケースを追加する必要があります。
-xnor

1
思い[0, 1, 8, 1, 6, 8]の入力のための許容出力すること2048
デニス

2
それは仕様で言及する価値があるかもしれません。VBコードはリストを返すように見えます。
デニス

回答:


12

JavaScript(ES6)、51 45 37バイト

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

テストケース


このアルゴリズムのリファレンスはありますか?
-dfernan

@dfernan私は本当に知りません。これは、提案されたアルゴリズムから始めて、いくつかのゴルフの反復の結果です。
アーノールド

5

Japt、11バイト

_ì ìAn)¥U}a

オンラインでテストしてください!

説明

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

バッチ、82バイト

@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

バッチの除算はゼロに切り捨てられるため、剰余が負の場合、補正するために1を追加する必要があります(また、剰余に10を追加する必要があります)。その後%2、結果がゼロになるまで数字が蓄積されます。


4

ゼリー、9バイト

Dḅ-10=ð1#

これは、負数から整数への総当たり変換の逆数です。

オンラインでお試しください!

使い方

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バイト

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

ArnauldのアルゴリズムのPythonポート。

または、102バイトの場合、元の投稿のアルゴリズムを使用した汎用関数:

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では、別の入力に依存するデフォルトの入力を宣言できません。
-xnor

@xnor Pythonインストールで動作します:Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)
デフェルナン

どうやって呼んでるの?これを実行しています(3.5.2で)。コード内で宣言しているのでしょうか、kそれともn他の場所にあるのでしょうか
-xnor

1
よさそうだ、すてきな改善!関数呼び出しの周りの括弧はもう必要ありません。
-xnor

1
最後の1つは、演算子の優先順位として説明できます。-n//10does -(n//10):negate n、次にfloor-divide by 10、0ではなく負の無限大に切り捨てます。これに対して、0-n//10dos 0-(n//10)、最初に10でfloor-divideし、次に否定します。何らかの理由で、Pythonは単項否定を、バイナリマイナスよりも高い優先順位で扱います。この優先順位表を参照してください。私はゴルフの前にこれと同じ状況に遭遇しました。
-xnor

2

ゼリー、10バイト

:⁵NµÐĿ%⁵ṚḌ

オンラインでお試しください!

バックグラウンド

負でないリストをベースbから変換するから整数への、関数x、y↦bx + yによる左折りたたみによって実現できます。整数基数bに変換するには、その関数を単純に逆にする、つまりbx + y↦x、yの式を見つける必要がありますます。

Python(および拡張ではJelly)では、モジュロ演算子の結果は常に負ではないため、(bx + y)%| b | = y

また、整数除算は常に切り捨てられ、q = n / dおよびr = n%dの場合、等式n = qd + rが成り立つようにします。sがサインの場合 b(sx)| b | + y = bx + yなので、sx =(bx + y)/ | b | したがって、s((bx + y)/ | b |)= x。

使い方

:⁵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バイト

これは私が取り組んできたテンプレート言語です。
決してゴルフ用ではありません。
完全な基本的な数学さえ欠けていますが、PHPの小さなスニペットを直接書くことができます。
これはその問題を回避します。

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

これにより、大量の警告がスローされます。
コードはPHPに「コンパイル」されます。

ゴミ箱の空白を含むゴルフなし:

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

必要に応じて、ステップごとの説明を追加できますが、かなり簡単だと思います。


免責事項

この回答を書いた時点での最後のコミットは、2017-01-07 20:36 UTC + 00:00でした。
これは、2017-01-06 23:27 UTC + 00:00のコミット140e56ff38f45fa4fd40fd3ec382094e707b1badで機能します。
これは、この回答を実行するために使用されるバージョンです。

PHPコードはhttps://raw.githubusercontent.com/ismael-miguel/SimpleTemplate/140e56ff38f45fa4fd40fd3ec382094e707b1bad/SimpleTemplate.phpで入手できます

これを最後のバージョンで実行することをお勧めしますが、この質問では問題なく動作します。


実行方法

コードを使用してファイルを作成し、次のように実行します。

<?php

    include 'path/to/SimpleTemplate.php';

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

    $template->render(<number>);

その後、値が画面に表示されます。


2

PHP、71 67バイト

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

またはArnauldの回答のポートの場合は62バイト:

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

1

Mathematica、49バイト

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

d1つの整数引数を取り、文字列を返す関数を定義します。再帰アルゴリズム-Arnauldの答えと同じアルゴリズムのように見えます。負の数でも機能します。(入力が0の場合、空の文字列intsead "0"を返します。)Mathematicaのゴルファー向けの注意:を使用±するには、追加の括弧が1セット必要になるため、短くなることはないようです。


0

C、68バイト

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

結果の数値を出力する代わりに、プログラムは単にそれを返します。明らかにこれはArnauldの答えです。唯一の違いは、Cはインタプリタ言語ではないので、関数ではなく完全なプログラムにする必要があると感じたことです。


1
どのようにそれを返しますか?f私が本当に愚かでない限り、関数が戻ったときに範囲外になります。
1

@ablighあなたは本当に愚かではありません、それは本当にGCCが本当に愚かです。非void関数がリターンなしで終了する場合、最後の割り当てを使用します。
Etaoin SHRDLU

0

さび、88バイト

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

これは、質問で提供されているアルゴリズムの単なる再帰バージョンです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.