ไม่ใช่โรมันประกอบไปด้วย


23

รับจำนวนเต็ม n ≥ 0 ให้เอาท์พุทในสัญกรณ์ที่ไม่ใช่ตำแหน่งฐาน -3 โดยใช้ตัวเลข139ABCDE…และตัวคั่น 1 ตัว ทุกบาทเป็นอำนาจติดต่อกัน 3 และตัวเลขทางด้านซ้ายของตัวคั่นจะถูกทำให้ไร้ผลเช่น A931 | B → 81- (1 + 3 + 9 + 27) → 41 ตัวเลขอาจปรากฏขึ้นเพียงครั้งเดียว

ให้ค่าของตัวเลขเป็นจริง:

  • ค่าของมันถ้าตัวเลขคือ 1, 3 หรือ 9
  • 27 ถ้าหลักคือ A
  • 3 เท่าของมูลค่าหลักขวาก่อนที่จะสำหรับB..Z

การส่งออกของคุณควรตอบสนองผลรวม (ค่าของตัวเลขไปทางขวาของ|) - ผลรวม (ค่าของตัวเลขที่ด้านซ้ายของ|) == การป้อนข้อมูล

ตัวอย่าง

input     output
----------------
0         |
1         |1
7         3|91
730       |D1
9999      FEDC|GA9

คุณอาจใช้อักขระที่ไม่ใช่ช่องว่างที่แตกต่างกันเป็นตัวคั่น นอกจากนี้คุณยังได้รับอนุญาตให้ไม่มีตัวคั่นซึ่งในกรณีที่ตัวเลขที่ใหญ่ที่สุดเริ่มต้นลำดับที่เป็นบวก คุณไม่จำเป็นต้องจัดการอะไรที่ใหญ่กว่า 2 32 −1 ( PMIGDCBA9|RQNLH3)

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบและอาจมีการป้อนข้อมูลและเอาท์พุทในช่องสัญญาณปกติ

นี่คือดังนั้นยิ่งคำตอบของคุณสั้นลงเท่าไหร่ก็ยิ่งดีเท่านั้น!


2
(ที่เกี่ยวข้องไม่ได้หมายถึงการทำซ้ำ, สงบสติอารมณ์)
Leun Nun

8
ฉันเป็นคนเดียวที่ไม่มีเงื่อนงำสิ่งที่ถูกถามที่นี่?
Shaggy

3
@Shaggy Express อินพุตเป็นผลรวมของพลังของ 3 และเชิงลบ วางเชิงลบด้านซ้ายของ a |และบวกไปทางขวาของมัน
Martin Ender

2
@KevinCruijssen "ไม่สั่งซื้อฟรี" - OP
user202729

3
@ user202729 อ่าพลาดความคิดเห็นไปแล้ว ขอบคุณ นั่นคือสิ่งที่จะเกิดขึ้นเมื่อกฎอยู่ในความคิดเห็นแทนที่จะได้รับการแก้ไขในความท้าทาย .. ( FrownyFrogคุณสามารถเพิ่มกฎนั้นลงในความท้าทายได้หรือไม่: ลำดับใดด้านหนึ่งของตัวคั่นเป็นเรื่องปกติ?)
Kevin Cruijssen

คำตอบ:


5

Java 10, 120 113 112 109 107 102 ไบต์

n->{var r="|";for(char c=49;n++>0;c=(char)(c+=c>64?1:c*4%22%9),n/=3)r=n%3<1?c+r:n%3>1?r+c:r;return r;}

-3 ไบต์โดยใช้ส่วนหนึ่งของเคล็ดลับของ@Arnauld JavaScript (ES6) คำตอบ 's ,
การเปลี่ยนแปลงi=0และi++<1?49:i<3?51:i<4?57:i+61การและi=4 -6 ไบต์ขอบคุณที่@Arnauldโดยตรงโดยการกำจัด++i>9?i+55:i>8?57:++i+43
i

ลำดับของเอาต์พุต: สูงสุดถึงต่ำสุด, |-delimiter, ต่ำสุดไปสูงสุด

คำอธิบาย:

ลองออนไลน์

n->{              // Method with integer parameter and String return-type
  var r="|";      //  Result-String, starting at the delimiter "|"
  for(char c=49;  //  Character, starting at '1'
      n++>0       //  Loop as long as `n` is larger than 0
                  //  Increasing it by 1 with `n++` at the start of every iteration
      ;           //    After every iteration:
       c=(char)(  //     Change character `c` to:
          c+=c>64?//      If the current `c` is an uppercase letter:
              1   //       Simpy go to the next letter using `c+1`
             :    //      Else:
              c*4%22%9),
                  //       Change '1' to '3', '3' to '9', or '9' to 'A' 
       n/=3)      //     Integer-divide `n` by 3
     r=           //     Change the result to:
       n%3<1?     //      If `n` modulo-3 is 0:
        c+r       //       Prepend the character to the result
       :n%3>1?    //      Else-if `n` modulo-3 is 2:
        r+c       //       Append the character to the result
       :          //      Else:
        r;        //       Leave `r` unchanged
   return r;}     //  Return the result-String

1
ฉันคิดว่ามันใช้งานได้: 103 bytes
Arnauld

@Arnauld Nice หนึ่ง! และ -1 ไบต์เพิ่มเติมโดยการใส่rในเนื้อความลูป ขอบคุณ!
Kevin Cruijssen

@Arnauld ออกจากความอยากรู้สิ่งที่ผู้ดุร้ายดุร้ายดูเหมือนว่าคุณเคยใช้กับหมายเลขเวทย์มนตร์สองอันสุดท้าย (เมื่อคุณยังคงใช้iและเมื่อคุณใช้ซ้ำc)
Kevin Cruijssen

1
ฉันได้แล้วโยนมันออกไป ... : - / แต่นี่เป็นคนสุดท้าย (ไม่มีประสิทธิภาพมาก แต่ก็ไม่เป็นไรสำหรับค่าเล็ก ๆ น้อย ๆ )
Arnauld

(นอกจากนี้ฉันควรทดสอบว่าp=1ไม่รวม*1อยู่ในรหัสหรือไม่ - แม้ว่าจะไม่นำไปสู่สูตรที่ดีกว่าในกรณีนั้น)
Arnauld


5

JavaScript (ES6), 82 80 79 ไบต์

เอาท์พุทเป็นตัวพิมพ์เล็กซึ่งหวังว่าจะดี

f=(n,s=(k=4,'|'),c=++k>8?k.toString(36):++k-5)=>n?f(++n/3|0,[c+s,s,s+c][n%3]):s

ลองออนไลน์!

คล้ายกับคำตอบรั่ว "นินจา Master" แม่ชีและยังขึ้นอยู่กับคำตอบของ XNOR

การแปลงตัวเลข

เราเริ่มต้นด้วยk = 4 ในขณะที่kน้อยกว่า9เราเพิ่มขึ้นเป็นครั้งที่สองที่ซ้ำกันและลบ5 หลังจากนั้นเราเพิ่มมันเพียงครั้งเดียวและแปลงเป็นฐาน -36

  k  | ++k > 8       | k.toString(36) | ++k - 5  | result
-----+---------------+----------------+----------+--------
  4  | k=5  -> false |                | k=6 -> 1 | 1
  6  | k=7  -> false |                | k=8 -> 3 | 3
  8  | k=9  -> true  | '9'            |          | '9'
  9  | k=10 -> true  | 'a'            |          | 'a'
  10 | k=11 -> true  | 'b'            |          | 'b'
 ... | ...           | ...            | ...      | ...



2

Stax , 30 29 ไบต์

£└≤☻╘pÿ╖╡A[ô%æτ⌐}►ºôßHl4⌡π%^ 

เรียกใช้และแก้ไขข้อบกพร่อง

พอร์ตของคำตอบแตกซ์ของฉันในสมดุล Ternary แปลง

คำอธิบาย

ใช้เวอร์ชันที่คลายการแพคเพื่ออธิบาย

139$VA+cz{;3%+,^3/~;wY1|I@'|ay2|I@L
139$VA+c                               "139AB...Z", make a copy
        z                              Empty array to store the digits
          {         w                  Do the following until 0.
           ;3%+                           Append `b%3` to the digits
                                          Originally, `b` is the input
              ,^3/                        `b=(b+1)/3`
                  ~;                       Make a copy of `b` which is used as the condition for the loop

                     Y                 Save array of digits in `y` for later use
                      1|I              Find index of 1's
                         @             Find the characters in "139AB...Z" corresponding to those indices
                          '|           A bar
                            ay2|I@     Do the same for 2's
                                  L    Join the two strings and the bar and implicit output

1

C # .NET, 103 ไบต์

n=>{var r="|";for(var c='1';n++>0;c=(char)(c>64?c+1:c+c*4%22%9),n/=3)r=n%3<1?c+r:n%3>1?r+c:r;return r;}

ท่าเรือของฉัน Java 10 คำตอบ หากพอร์ตโดยตรง (ยกเว้นn->ถึงn=>) จะเป็นไปได้ฉันจะแก้ไขคำตอบ Java ของฉันด้วยรูปหลายเหลี่ยมนี้ อย่างไรก็ตามน่าเสียดายc+=ที่ตัวละครหรือมีความc=49เป็นไปไม่ได้ใน C # จึงเป็นคำตอบที่ไม่ได้รับการตอบ

ลองออนไลน์



1

Ruby , 87 84 82 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ @ benj2240

->n,s=[?1,?3,?9,*?A..?Z],r=[""]*3{r[-m=n%3]+=s.shift
n=n/3+m/2
n>0?redo:r[1,2]*?|}

ลองออนไลน์!


ฉันจะโกหกถ้าฉันบอกว่าฉันทำตามรหัสนี้โดยสมบูรณ์ แต่ฉันรู้ว่าคุณโกนหนวด 2 ไบต์ด้วยredoเล่ห์เหลี่ยม: ลองออนไลน์!
benj2240

1

J , 129 ไบต์

f=:3 :0
a=.'139',u:65+i.26
s=.'|'while.y>0 do.if.1=c=.3|y do.s=.s,{.a end.y=.<.y%3
if.c=2 do.s=.s,~{.a 
y=.1+y end.a=.}.a end.s
)

ลองออนไลน์!

ยาวเกินไปโดยเฉพาะสำหรับโปรแกรม J ...

คำอธิบาย:

f =: 3 : 0
   a =. '139',u:65+i.26   NB. a list '139ABC...Z'
   s =. '|'               NB. initialize the list for the result  
   while. y>0 do.         NB. while the number is greater than 0
      c =. 3|y            NB. find the remainder (the number modulo 3)
      y =. <.y%3          NB. divide the number by 3 
      if. c = 1 do.       NB. if the remainder equals 1
         s =. s,{.a       NB. Append the current power of 3 to the result
      end.
      if. c = 2 do.       NB. if the remainder equals 2 
         s =. s,~{.a      NB. prepends the result with the current power of 3
         y =. 1+y         NB. and increase the number with 1
      end.
      a =. }.a            NB. next power of 3 
   end.
   s                      NB. return the result  
)

1

C, int: 138 123 ไบต์long: 152 131 ไบต์

ฉันได้สร้างสองเวอร์ชั่นนี้ขึ้นมาเนื่องจากขีดจำกัดความท้าทายของอินพุตสูงสุดที่ใช้งานได้ของมัน0x100000000ดูค่อนข้างแปลก รุ่นหนึ่งใช้งานได้กับจำนวนเต็ม 32 บิต (ซึ่งไม่สามารถ จำกัด ด้วยเหตุผลที่ชัดเจน) รุ่นอื่นใช้งานได้กับ 64 บิต (ซึ่งไปเกินขีด จำกัด ที่กำหนดที่ราคา14 8 ไบต์พิเศษ)

รุ่น 32 บิต:

char b[22],*r=b;f(v,l)char*l;{v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}

รุ่น 64 บิต:

char b[22],*r=b;f(long v,char*l){v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(long v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}

สิ่งนี้เหมือนกันยกเว้นว่าจะประกาศตัวแปรจำนวนเต็มเป็นlong(ซึ่งคือ 64 บิตบน linux)

longเวอร์ชันที่ไม่ดีงาม:

char buffer[22],*result=buffer;
f(long value,char*letter){
    if(value%3>1){
        *result++=*letter,value++;
    }
    if(value){
        f(value/3,letter+1);
    }
    if(value%3){
        *result++=*letter;
    }
}
g(long value){
    f(value,"139ABCDEFGHIJKLMNOPQR");
    *result=0;
    result=buffer;
}

อย่างที่คุณเห็นการทำงานแบบนี้เกิดจากการเรียกซ้ำ: ถ้าส่วนที่เหลือคือ 1 อักขระที่เกี่ยวข้องจะถูกผนวกเข้ากับสตริงเอาต์พุตหลังการเรียกซ้ำ หากส่วนที่เหลือคือ 2 เอาต์พุตจะถูกดำเนินการก่อนการเรียกซ้ำ ในกรณีนี้ฉันยังเพิ่มค่าทีละหนึ่งเพื่อจัดการกับตัวเลขลบอย่างถูกต้อง สิ่งนี้มีประโยชน์เพิ่มเติมในการเปลี่ยนส่วนที่เหลือเป็นศูนย์ทำให้ฉันสามารถใช้value%3เป็นเงื่อนไขสำหรับการสอบถามซ้ำหลังได้

ผลลัพธ์ของการแปลงจะถูกวางในบัฟเฟอร์ส่วนกลาง g()เสื้อคลุมมีงานของศูนย์การยกเลิกสตริงที่เกิดขึ้นอย่างถูกต้องและการตั้งค่าใหม่ที่resultชี้ไปยังจุดเริ่มต้นของมัน (ซึ่งเป็นวิธีการที่g()"ผลตอบแทน" ผล)

ทดสอบlongเวอร์ชันด้วยรหัสนี้:

#include <stdio.h>

char b[22],*r=b;f(long v,char*l){v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(long v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}

void printConversion(long value) {
    g(value);
    printf("%ld: %s\n", value, r);
}

int main() {
    for(long i = 0; i <= 40; i++) {
        printConversion(i);
    }
    printConversion(0x7fffffff);
    printConversion(0xffffffffu);
    printConversion(0x100000000);
}

เป็นไปได้เพิ่มเติม แต่การทำลายกอล์ฟ:

  • -4 ไบต์: g()ทำให้ฟังก์ชั่นการถ่ายภาพหนึ่งโดยการเอาการตั้งค่าชี้ใน

  • -5 ไบต์: บังคับให้โทรไปดำเนินการยกเลิกสตริงกลับสตริงโดยไม่มีการเลิกจ้างในและจุดสิ้นสุดของสตริงในbufferresult


1

ถ่าน , 36 ไบต์

NθF³⊞υ⟦⟧F⁺139α«⊞§υθι≔÷⊕θ³θ»F²«×|ι↑⊟υ

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน คำอธิบาย:

Nθ

ใส่ค่า

F³⊞υ⟦⟧

กดสามรายการว่างไปยังรายการว่างที่กำหนดไว้ล่วงหน้า

F⁺139α«

วนรอบตัวอักษร139และตัวอักษรตัวพิมพ์ใหญ่

⊞§υθι

ทำดัชนีรายการของรายการด้วยค่าและกดอักขระปัจจุบันไปที่นั้น

≔÷⊕θ³θ»

หารค่าด้วย 3 แต่ปัดมันด้วยการบวก 1 ก่อน

F²«×|ι

วนซ้ำสองครั้ง |ครั้งที่สองพิมพ์

↑⊟υ

แต่ละวงที่เราปรากฏรายการสุดท้ายจากรายการ; เป็นครั้งแรกนี้จะช่วยให้เรารายการที่มีที่เหลือของ2(ซึ่งสอดคล้องกับหลัก ternary ที่สมดุลของ-1) ในขณะที่ครั้งที่สองนี้จะช่วยให้เรารายการที่สอดคล้องกับหลัก ternary 1ที่สมดุลของ อาร์เรย์ที่ได้ตามปกติจะพิมพ์ในแนวตั้ง แต่การหมุนทิศทางการพิมพ์ขึ้นไปจะเป็นการยกเลิก



0

Perl 5 , 92 89 ไบต์

แรงบันดาลใจจากคำตอบ java และ python

sub n{($n,$r,$c,@a)=(@_,'|',1,3,9,'A'..'Z');$n?n(int++$n/3,($c.$r,$r,$r.$c)[$n%3],@a):$r}

ลองออนไลน์!

ด้วยพื้นที่สีขาว:

sub n {
  ($n, $r, $c, @_) = (@_, "|", 1, 3, 9, 'A' .. 'Z');
  $n ? n( int++$n/3, ($c.$r, $r, $r.$c)[$n%3], @_)
     : $r
}

0

PHP, 73 ไบต์

for(;0|$n=&$argn;$n/=3)${$n++%3}.=_139[++$i]?:chr(61+$i);echo${2},_,${1};

พอร์ตของคำตอบของxnor , 53 ไบต์

for(;0|$n=&$argn;$n/=3)$s="0+-"[$n++%3].$s;echo$s??0;

ทำงานเป็นท่อที่มี-nrหรือลองพวกเขาออนไลน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.