베이스 -10의 출력 N


18

도전:

선택한 프로그래밍 언어 에서 10 진수의 입력으로 정수 를 허용하고 10 진수 표기법으로 출력합니다 ( base -10이라고도 함)

알고리즘 예 :

이것은 VB.NET에서 기수 10을 음수 기수로 변환하기 위해 Wikipedia에서 가져온 알고리즘입니다 .

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

규칙:

프로그래밍 언어에 존재하는이 문제를 해결하는 내장 방법을 사용해서는 안됩니다

이것은 code-golf 이므로 가장 짧은 코드가 승리합니다!


3
당신 만이 specifiic 문제가 아니라 해결 내장 기능 forbit 할 생각 모든 기존 builltins합니다.
Denker

관련 OEIS : A039723
devRicher

6
부정적인 테스트 사례를 추가해야합니다.
xnor

1
싶은 [0, 1, 8, 1, 6, 8]입력 허용 출력 2048?
Dennis

2
그것은 스펙에서 언급 할 가치가 있습니다. VB 코드는 목록을 반환하는 것처럼 보입니다.
Dennis

답변:


12

자바 스크립트 (ES6), 51 45 37 바이트

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

테스트 사례


이 알고리즘에 대한 참조가 있습니까?
dfernan

@dfernan 나는 정말로 모른다. 이것은 제안 된 알고리즘으로 시작하여 여러 번의 골프 반복의 결과입니다.
Arnauld

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

Batch의 나눗셈이 0으로 잘 리므로 나머지가 음수이면 1을 더하고 나머지에 10을 더하여 보상해야합니다. 그런 다음 %2결과가 0이 될 때까지 숫자가 누적 됩니다.


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

파이썬 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 ""

파이썬은 다른 입력에 의존하는 기본 입력을 선언 할 수 없습니다.
xnor

@xnor 그것은 파이썬 설치에서 작동합니다 : Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44).
dfernan 2012 년

어떻게 부르세요? 나는 이것을 하고 있다 (3.5.2에서). 코드에서 k또는 n다른 곳에서 선언 할 수 있습니까?
xnor

1
좋아 보인다, 좋은 개선! 더 이상 함수 호출 주위의 파렌이 필요하지 않습니다.
xnor

1
마지막으로 연산자 우선 순위로 설명 할 수 있습니다. -n//10수행 -(n//10): 부정 n의해 다음 바닥 분할 10, 발사되는 음의 무한대쪽으로 아래로 0이 아닌 반면, 0-n//10수행 0-(n//10), 이는 제 10 의해 바닥 분할은 다음을 Negate. 어떤 이유로 든 파이썬은 이진 빼기보다 이진 빼기를 우선 순위로 처리합니다. 이 우선 순위 표를 참조하십시오 . 나는 골프를 치기 전에 같은 상황에 처했다.
xnor

2

젤리 , 10 바이트

:⁵NµÐĿ%⁵ṚḌ

온라인으로 사용해보십시오!

배경

함수 b , y ↦ bx + y 로 왼쪽을 접 으면 음수가 아닌리스트를 b 에서 정수로 변환 할 수 있습니다 . 변환 및 정수 에 대한 기본 B , 우리는 단순히에 대한 식 찾을 수, 즉, 그 함수를 반대해야한다 BX + y를 ↦ X, Y를 .

파이썬 (및 확장으로 Jelly)에서 모듈러스 연산자의 결과는 항상 음이 아니므로 (bx + y) % | b | = y .

또한 정수 나누기는 항상 반올림되므로 q = n / dr = n % d 인 경우 등식 n = qd + r이 유지됩니다. 만약 의 표시이다 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

간단한 템플릿 , 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입니다.
이것은 커밋 140e56ff38f45fa4fd40fd3ec382094e707b1bad 에서 2017-01-06 23:27 UTC + 00 : 00에 작동합니다.
이것이이 답변을 실행하는 데 사용되는 버전입니다.

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

d하나의 정수 인수를 사용하고 문자열을 리턴 하는 함수 를 정의합니다 . 재귀 알고리즘 -Arnauld의 답변 에서 동일한 알고리즘처럼 보입니다 . 음수에서도 작동합니다. (입력이 0이면 빈 문자열 intsead "0"을 반환합니다.) Mathematica 골퍼를위한 참고 사항 :를 사용 ±하려면 괄호가 하나 더 필요하므로 더 짧지 않은 것 같습니다.


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내가 정말 바보가 아닌 한 함수가 반환되면 범위를 벗어납니다.
abligh

@abligh 당신은 정말 바보가 아닙니다. GCC가 정말 바보입니다. 무효가 아닌 함수가 반환없이 종료되면 마지막 할당 만 사용합니다.
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.