เอาต์พุต N ในฐาน -10


18

ท้าทาย:

ในภาษาการเขียนโปรแกรมที่คุณเลือกยอมรับจำนวนเต็ม เป็นอินพุตในฐาน 10 และส่งออกในเครื่องหมายลบซึ่งเป็นที่รู้จักกันว่าฐาน -10

อัลกอริทึมตัวอย่าง:

นี่เป็นอัลกอริทึมที่นำมาจาก Wikipedia เพื่อแปลงฐาน 10 เป็นฐานลบใน 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

เห็นได้ชัดว่าคุณสามารถใช้อัลกอริทึมใดก็ได้ตราบเท่าที่มันตอบสนองความท้าทาย

ตัวอย่างอินพุต / เอาท์พุต:

การป้อนข้อมูล:

12

เอาท์พุท:

192

ตัวอย่างอื่น:

การป้อนข้อมูล:

2048

เอาท์พุท:

18168

กฎ:

คุณต้องไม่ใช้วิธีการในตัวที่แก้ไขปัญหาที่มีอยู่ในภาษาการเขียนโปรแกรมของคุณ

นี่คือรหัส - กอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ!


3
ฉันคิดว่าคุณเพียงต้องการที่จะสร้างบิวด์อินที่แก้ปัญหาเฉพาะนี้และไม่ได้มีบิลลิงที่มีอยู่ทั้งหมด
Denker

OEIS ที่เกี่ยวข้อง: A039723
devRicher

6
คุณควรเพิ่มกรณีทดสอบเชิงลบ
xnor

1
จะ[0, 1, 8, 1, 6, 8]เป็นเอาต์พุตที่ยอมรับได้สำหรับอินพุต2048หรือไม่
Dennis

2
นั่นอาจจะคุ้มค่าที่จะกล่าวถึงในสเป็ค รหัส VB ​​ของคุณดูเหมือนจะส่งคืนรายการ
เดนนิส

คำตอบ:


12

JavaScript (ES6), 51 45 37 ไบต์

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

กรณีทดสอบ


มีการอ้างอิงสำหรับอัลกอริทึมนี้หรือไม่?
dfernan

@fernan ฉันไม่รู้จริงๆ นี่คือผลลัพธ์ของการเล่นซ้ำหลายครั้งโดยเริ่มจากอัลกอริทึมที่แนะนำ
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

การแบ่งของแบทช์ตัดให้เป็นศูนย์ดังนั้นหากส่วนที่เหลือเป็นลบฉันต้องเพิ่ม 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

Pyth - 9 ไบต์

Lel มันมีอิโมจิที่กำลังร้องไห้อยู่ในนั้น

fqQijT;_;

Test Suite


1
ทำไมคุณถึงร้องไห้?? คุณอยู่เสมอ!
NoOne อยู่ที่นี่

เพราะเขามีอีโมจิที่กำลังร้องไห้ในคำตอบของ Pyth
user75200

3

Python 3, 35 ไบต์

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

Python พอร์ตของอัลกอริทึมของ Arnauld

อีกทางหนึ่งสำหรับ 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 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)มันทำงานในการติดตั้งหลามของฉัน:
dfernan

คุณเป็นอย่างไรบ้าง ฉันกำลังทำสิ่งนี้ (ใน 3.5.2) คุณอาจจะประกาศkหรือnที่อื่นในรหัส?
xnor

1
ดูดีการปรับปรุงดี! คุณไม่จำเป็นต้องใช้ parens รอบฟังก์ชั่นการโทรอีกต่อไป
xnor

1
อันสุดท้ายที่ฉันสามารถอธิบายว่าเป็นตัวดำเนินการที่สำคัญ -n//10ทำ-(n//10): ลบล้างnแล้วแบ่งพื้นด้วย10ซึ่งปัดเศษลงไปเป็นลบอนันต์ไม่ใช่ 0 ในทางกลับกัน0-n//10ทำ0-(n//10)ซึ่งแบ่งชั้นแรกด้วย 10 แล้วปฏิเสธ ไม่ว่าด้วยเหตุผลใดก็ตามไพ ธ อนถือว่าการปฏิเสธเป็นอันขาดด้วยความสำคัญมากกว่าไบนารีลบ ดูตารางลำดับความสำคัญนี้ ฉันเคยเจอสถานการณ์แบบนี้มาก่อนในการเล่นกอล์ฟ
xnor

2

เยลลี่ 10 ไบต์

:⁵NµÐĿ%⁵ṚḌ

ลองออนไลน์!

พื้นหลัง

แปลงรายการที่ไม่ใช่เชิงลบจากฐานจำนวนเต็มสามารถทำได้โดยการพับซ้ายโดยฟังก์ชันx, y ↦ BX + Y ในการแปลงและเลขจำนวนเต็มเป็นฐานbเราต้องย้อนกลับฟังก์ชันนั้นเช่นค้นหานิพจน์สำหรับbx + y ↦ x, yy

ใน Python (และ, โดยส่วนขยาย, Jelly) ผลลัพธ์ของตัวดำเนินการ modulo นั้นไม่ใช่แบบลบเสมอ (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

Ungolfed พร้อมถังขยะ whitespace:

{@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>);

ค่าจะปรากฏบนหน้าจอ



1

Mathematica, 49 ไบต์

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

นิยามฟังก์ชันที่dรับอาร์กิวเมนต์จำนวนเต็มหนึ่งตัวและส่งคืนสตริง recursive อัลกอริทึม-ดูเหมือนว่าอัลกอริทึมที่เหมือนกันในคำตอบของ Arnauld มันทำงานกับจำนวนลบเช่นกัน (มันจะคืนค่า intsead สตริงว่างของ "0" ถ้าอินพุตเป็น 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

@ ระดับสูงคุณไม่ได้โง่จริง ๆ มันเป็นแค่ 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.