ขึ้นไปบิต!


26

รับจำนวนเต็ม N ทำตามขั้นตอนต่อไปนี้: (ใช้ 9 เป็นตัวอย่าง)

  1. รับอินพุต N. ( 9)
  2. แปลง N จาก base10 เป็น base2 ( 1001)
  3. เพิ่มขึ้นทุก bit โดย 1. ( 2112)
  4. ปฏิบัติต่อผลลัพธ์ในฐานะ base3 และแปลงกลับเป็น base10 ( 68)
  5. ส่งคืน / ผลลัพธ์ผลลัพธ์

อินพุต

อาจได้รับในรูปแบบตัวเลขที่สมเหตุสมผล
คุณจะต้องจัดการกับกรณีที่ N> 0


เอาท์พุต

stdoutทั้งสองกลับมาเป็นตัวเลขหรือสตริงหรือพิมพ์


กฎระเบียบ

  • นี่คือซึ่งเป็นรหัสที่สั้นที่สุดในหน่วยไบต์
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม

กรณีทดสอบ

1 -> 2
2 -> 7
5 -> 23
9 -> 68
10 -> 70
20 -> 211
1235 -> 150623
93825 -> 114252161

คำตอบ:


15

Python 2 , 31 ไบต์

f=lambda n:n and 3*f(n/2)+n%2+1

ลองออนไลน์!


3
คุณอธิบายได้ไหมว่ามันทำงานอย่างไร

+n%2+1เพิ่มไบนารี่บิตขวาสุดบวก 1 ไปยังค่าส่งคืนn/2เลื่อนไปทางขวาnด้วย 1 ไบเทอร์บิต3*f(n/2)ซ้ำเพิ่ม 3 เท่าของการคำนวณนี้บนบิตที่เลื่อนด้านขวาเหล่านั้นและn andสิ้นสุดการเรียกซ้ำเมื่อnเป็น 0
Noodle9

11

JavaScript (Node.js)ขนาด 23 ไบต์

f=x=>x&&x%2+1+3*f(x>>1)

ลองออนไลน์!


x>>1เหมือนกับว่าx/2ไม่ใช่หรือ
mbomb007

@ mbomb007 ฉันคิดและแนะนำแบบเดียวกัน แต่เห็นได้ชัดว่ามันกลายเป็นInfinityใน JS .. ลองออนไลน์ (คุณอาจต้องการเพิ่มลิงค์ TIO ให้กับคุณตอบI4m2 )
Kevin Cruijssen

2
@ mbomb007 ไม่1>>1=0ขณะนี้1/2=0.5
l4m2

4
@ mbomb007 ... Python?
user202729

2
ใช่. ดูคำตอบของงูหลาม นั่นเป็นเหตุผลที่ใช้n/2งานได้ในเหตุผลนั้นและเหตุผลที่ฉันแนะนำที่นี่
mbomb007

9

Java (JDK 10) , 44 ไบต์

long n(long x){return x<1?0:x%2+1+3*n(x/2);}

ลองออนไลน์!


1
อาจ-~จะช่วยได้อย่างไร
user202729

2
ไม่กฎที่มาก่อน
user202729

คำถามเดียวกันกับคุณ: ทำไมlong? :) และที่นี่ฉันคิดว่าวิธีการเรียงลำดับของฉันฉลาด .. คุณพัดมันออกจากสวนภายในเวลาไม่ถึง 5 นาที .. >.>: '(
Kevin Cruijssen

@KevinCruijssen เป็นธรรมกับคุณ ...
user202729

6

เยลลี่ขนาด 4 ไบต์

B‘ḅ3

ลองออนไลน์!


ไบนารีเพิ่มค่าฐาน 3 นั่นคือทั้งหมดที่ต้องกล่าว
อดัม

2
@ Adámในทางเทคนิคนั่นคือจาก -base แต่ใช่นี่เป็นเรื่องเล็กน้อยในเกือบทุกภาษาถ้าไม่ใช่ภาษากอล์ฟ
Erik the Outgolfer

6

J , 7 ไบต์

3#.1+#:

ลองออนไลน์!

ขอบคุณ Galen Ivanov สำหรับ -4 ไบต์! ฉันต้องการพัฒนาทักษะการเล่นกอล์ฟ J ของฉัน ...


1
7 bytes: 3#.1+#: TIO
Galen Ivanov

: 0นอกจากนี้ยังขอบคุณสำหรับแม่แบบที่ผมต้องการสิ่งที่จะเรียนรู้เกี่ยวกับ
user202729

แม่แบบไม่ใช่ของฉันฉันลืมว่าใครเป็นผู้แต่ง
Galen Ivanov

2
ที่จะฉัน :)
Conor โอไบรอัน

6

R , 55 43 ไบต์

function(n)(n%/%2^(x=0:log2(n))%%2+1)%*%3^x

ลองออนไลน์!

ใช้เคล็ดลับการแปลงฐานมาตรฐานใน R เพิ่มขึ้นแล้วใช้ผลิตภัณฑ์ดอทที่มีอำนาจใน3การแปลงกลับเป็นจำนวนเต็ม

ขอบคุณ@ user2390246สำหรับการปล่อย 12 ไบต์!


เนื่องจากการแปลงเป็นไบนารีไม่ใช่ผลลัพธ์สุดท้ายลำดับของตัวเลขจึงไม่สำคัญ ดังนั้นแทนที่จะเป็นพื้น (บันทึก (n)): 0 คุณสามารถทำ 0: บันทึก (n) และบันทึกบางไบต์: 43 ไบต์
2390246

@ user2390246 แน่นอนขอบคุณ
จูเซปเป้


6

Java 10, 81 52 ไบต์ (การแปลงฐาน)

n->n.toString(n,2).chars().reduce(0,(r,c)->r*3+c-47)

ลองออนไลน์

-29 ไบต์ขอบคุณที่@Holger

คำอธิบาย:

n->{                         // Method with Long as both parameter and return-type
  n.toString(n,2)            //  Convert the input to a Base-2 String
  .chars().reduce(0,(r,c)->  //  Loop over its digits as bytes
    r*3+c-47)                //  Multiply the current result by 3, and add the digit + 1
                             //  (which is equal to increasing each digit by 1,
                             //  and then converting from Base-3 to Base-10)

Java 10, 171 167 151 150 149 ไบต์ (ลำดับ)

n->{int t=31-n.numberOfLeadingZeros(n);return a(t+1)+b(n-(1<<t));};int a(int n){return--n<1?n+2:3*a(n)+1;}int b(int n){return n<1?0:n+3*b(n/=2)+n*2;}

-16 ไบต์ขอบคุณที่@ musicman523เปลี่ยนไป(int)Math.pow(2,t) -1 ต้องขอบคุณไบต์@Holgerเปลี่ยนไป(1<<t)
(int)(Math.log(n)/Math.log(2))31-n.numberOfLeadingZeros(n)

ลองออนไลน์

คำอธิบาย:

n->{                         // Method with Integer as both parameter and return-type
  int t=31-n.numberOfLeadingZeros(n);
                             //  2_log(n)
  return a(t+1)              //  Return A060816(2_log(n)+1)
         +b(n-(1<<t));}      //   + A005836(n-2^2_log(n))

// A060816: a(n) = 3*a(n-1) + 1; a(0)=1, a(1)=2
int a(int n){return--n<1?n+2:3*a(n)+1;}

// A005836: a(n+1) = 3*a(floor(n/2)) + n - 2*floor(n/2).
int b(int n){return n<1?0:n+3*b(n/=2)+n*2;}

เมื่อเราดูลำดับ:

2,  7,8,  22,23,25,26,  67,68,70,71,76,77,79,80,  202,203,205,206,211,212,214,215,229,230,232,233,238,239,241,242, ...

เราสามารถเห็นหลายองค์ประกอบ:

A053645(n):
0,  0,1,  0,1,2,3,  0,1,2,3,4,5,6,7,  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,  ...

A060816(A053645(n)):
2,  7,7,  22,22,22,22,  67,67,67,67,67,67,67,67,  202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,  ...

A005836(A053645(n)+1)
0,  0,1,  0,1,3,4,  0,1,3,4,9,10,12,13,  0,1,3,4,9,10,12,13,27,28,30,31,36,37,39,40,  ...

ดังนั้นลำดับที่ถูกถามคือ:

A060816(A053645(n)) + A005836(A053645(n)+1)

ฉันดูดที่การหารูปแบบดังนั้นฉันภูมิใจในสิ่งที่ฉันพบข้างต้น .. ต้องบอกว่า@ user202729พบวิธีที่ดีและสั้นกว่าใน Javaภายในไม่กี่นาที .. : '(


Re n.toString(n,2).getBytes()... ฉันคิดว่าการแปลงด้วยตนเองอาจสั้นกว่านี้
user202729

1
BTW ทำไมlongและไม่int?
user202729

1
ฉันคิดว่าในเวอร์ชั่นต่อเนื่องคุณสามารถเปลี่ยน(int)Math.pow(2,t)เป็น1<<t... แล้วอินไลน์นิพจน์นั้นและวางตัวแปร i ( 152 bytes )
musicman523

1
ในชีวิตจริงฉันจะใช้31-Integer.numberOfLeadingZeros(n)แทน(int)(Math.log(n)/Math.log(2))แต่มันก็ไม่สั้นกว่า เว้นแต่คุณจะใช้import staticในส่วนหัวซึ่งอาจยืดกฎไปไกลเกินไป
Holger

1
ฉันเพียงแค่พยายามที่จะแปลงห่วงตัวแปรแรกของคุณเพื่อแก้ปัญหากระแสกับความสำเร็จ:n -> n.toString(n,2).chars().reduce(0,(r,c)->r*3+c-47)
Holger





3

ทูต , 19 ไบต์

FromBase&3@1&`+@Bin

ลองออนไลน์!

นี่คือองค์ประกอบของสามฟังก์ชัน:

  • FromBase&3
  • 1&`+
  • Bin

ครั้งแรกนี้จะแปลงเป็นเลขฐานสอง ( Bin) เพิ่มขึ้นมัน ( 1&`+) จากนั้นแปลงเป็นแบบไตรภาค ( FromBase&3)

ทางเลือก

ปลอดจุด, 21 ไบต์: {FromBase[Bin!_+1,3]}

ไม่มีตัวบิวอิน 57 ไบต์: Sum@{_*3^(#_-Iota!_-1)}@{If[_>0,$[_/2|Floor]'(1+_%2),[]]}


3

เรติน่า 0.8.2 , 36 ไบต์

.+
$*
+`^(1+)\1
$1;1
^
1
+`1;
;111
1

ลองออนไลน์! คำอธิบาย:

.+
$*

แปลงจากทศนิยมเป็นเอก

+`^(1+)\1
$1;1

divmod ซ้ำ 2 และเพิ่ม 1 ไปยังผลลัพธ์ของ modulo

^
1

เพิ่ม 1 หลักแรกเช่นกัน

+`1;
;111

แปลงจากฐานที่เข้ารหัสแบบ unary เป็นฐานที่ 3

1

แปลงเป็นทศนิยม


3

Japtap , 6 ไบต์

¤cÄ n3
¤      // Convert the input to a base-2 string,
 c     // then map over it as charcodes.
  Ä    // For each item, add one to its charcode
       // and when that's done,
    n3 // parse the string as a base 3 number.

รับอินพุตเป็นตัวเลขส่งออกตัวเลข

ลองออนไลน์!


Damnit! ทำไมฉันไม่คิดอย่างนั้นล่ะ ทำได้ดีมาก
ปุย

3

MATL , 12 7 6 ไบต์

BQ3_ZA

ลองออนไลน์!

บันทึก5ไบต์ขอบคุณ Giuseppe และอีกหนึ่งขอบคุณ Luis Mendo

คำตอบเก่า 7 ไบต์:

YBQc3ZA

ลองออนไลน์!

คำอธิบาย:

YB        % Convert to binary string
  Q       % Increment each element
   c      % Convert ASCII values to characters
    3     % Push 3
     ZA   % Convert from base 3 to decimal.

อันเก่าสำหรับ 12 ไบต์:

BQtz:q3w^!Y*

ลองออนไลน์!

โอ้ฉันเป็นคนยุ่ง ... เช่นนี้: `BQ3GBn: q ^! Y *

คำอธิบาย:

               % Implicit input
B              % Convert to binary vector
 Q             % Increment all numbers
  t            % Duplicate
   z           % Number of element in vector
    :          % Range from 1 to that number
     q         % Decrement to get the range from 0 instead of 1
      3        % Push 3
       w       % Swap order of stack
        ^      % Raise 3 to the power of 0, 1, ...
         !     % Transpose
          Y*   % Matrix multiplication
               % Implicit output

3

C # (คอมไพเลอร์ Visual C #) , 128 ไบต์

using System;using System.Linq;i=>{int z=0;return Convert.ToString(i,2).Reverse().Select(a=>(a-47)*(int)Math.Pow(3,z++)).Sum();}

ลองออนไลน์!

ฉันกำลังนับSystemเพราะผมใช้และConvertMath


เลือกให้ดัชนีเป็นพารามิเตอร์ทางเลือก ดังนั้นคุณสามารถกำจัดzตัวแปรของคุณ นอกจากนี้ในร่างกายการแสดงออกที่คุณจะได้รับการกำจัดของ{, }และreturnงบ ดังนั้นสิ่งนี้n=>Convert.ToString(n,2).Reverse().Select((x,i)=>(x-47)*Math.Pow(3,i)).Sum();
NtFreX


2

C, 32 27 ไบต์

n(x){x=x?x%2+1+3*n(x/2):0;}

ขึ้นอยู่กับuser202729 's Java คำตอบ ลองออนไลน์ได้ที่นี่ ขอบคุณKevin Cruijssenสำหรับการเล่นกอล์ฟขนาด 5 ไบต์

เวอร์ชันที่ไม่ถูกปรับแต่ง:

n(x) { // recursive function; both argument and return type are implicitly int
    x = // implicit return
    x ? x % 2 + 1 + 3*n(x/2) // if x != 0 return x % 2 + 1 + 3*n(x/2) (recursive call)
    : 0; // else return 0
}

คุณสามารถบันทึก 5 ไบต์โดยการแทนที่returnด้วยx=และย้อนกลับ ternary ดังนั้นจึง!ไม่จำเป็นอีกต่อไป:n(x){x=x?x%2+1+3*n(x/2):0;}
เควินครูจส์เซน

@KevinCruijssen Nice ขอบคุณ!
OOBalance


2

ระดับแปดเสียงพร้อมกล่องเครื่องมือสื่อสาร33 32 ไบต์

@(x)(de2bi(x)+1)*3.^(0:log2(x))'

ลองออนไลน์!

แปลงอินพุตเป็นเวกเตอร์ไบนารีที่ใช้de2biและเพิ่มตัวเลขทั้งหมด ไม่คูณเมทริกซ์กับเวกเตอร์แนวตั้งของ3ยกอำนาจที่เหมาะสมจึงได้รับทุนโดยไม่ต้องมีการโทรที่ชัดเจนในการ1, 3, 9, ...sum


ในขณะที่มันฉลาดมากคุณสามารถทำเช่นนี้ได้ 32 ไบต์: ลองออนไลน์!
Sanchises

และด้วย MATLAB คุณอาจทำ@(x)base2dec(de2bi(x)+49,3)เพื่อ 27 (โอกาสที่หายากที่ MATLAB นั้นอ่อนโยนกว่าอ็อกเทฟ)
Sanchises

2

PHP, 84 64 ไบต์

ลองออนไลน์ !!

รหัสเดิม

function f($n){$b=decbin($n);echo base_convert($b+str_repeat('1',strlen($b)),3,10);}

ลองออนไลน์ !!

ขอบคุณ Cristoph , ไบต์น้อยลงถ้าวิ่งด้วย php -R

function f($n){echo base_convert(strtr(decbin($n),10,21),3,10);}

คำอธิบาย

function f($n){
$b=decbin($n);                    #Convert the iteger to base 2
echo base_convert(                  #base conversion PHP function
    $b+str_repeat('1',strlen($b)),  #It adds to our base 2 number
    3,                              #a number of the same digits length
    10);                            #with purely '1's
}

นี่คือเมื่อฉันเห็นฉันมีวิธี loooogn ไปที่การเขียนโปรแกรม .... ไม่มีความคิดของการดำรงอยู่ของstrtr
ฟรานซิสโกฮาห์น

1
จะทำ !! ขอโทษ<?="Will do!!"
ฟรานซิสโกฮาห์น


2

ช่องว่าง 117 ไบต์

[S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_number][T    T   T   _Retrieve][N
S S S N
_Create_Label_OUTER_LOOP][S N
S _Duplicate][S S S T   S N
_Push_2][T  S T T   _Modulo][S S S T    N
_Push_1][T  S S S _Add][S N
T   _Swap][S S S T  S N
_Push_2][T  S T S _Integer_division][S N
S _Duplicate][N
T   S N
_If_0_jump_to_Label_INNER_LOOP][N
S N
S N
_Jump_to_Label_OUTER_LOOP][N
S S N
_Create_Label_INNER_LOOP][S S S T   T   N
_Push_3][T  S S N
_Multiply][T    S S S _Add][S N
T   _Swap][S N
S _Duplicate][N
T   S T N
_If_0_jump_to_Label_PRINT_AND_EXIT][S N
T   _Swap][N
S N
N
_Jump_to_Label_INNER_LOOP][N
S S T   N
_Create_Label_PRINT_AND_EXIT][S N
T   _Swap][T    N
S T _Output_integer_to_STDOUT]

เพิ่มตัวอักษรS(ช่องว่าง), T(แท็บ) และN(บรรทัดใหม่) เป็นการเน้นเท่านั้น
[..._some_action]เพิ่มเป็นคำอธิบายเท่านั้น

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

คำอธิบายในรหัสเทียม:

ฉันเปลี่ยนฟังก์ชัน recursive int f(int n){return n<1?0:n%2+1+3*f(n/2);}เป็นรูปแบบวนซ้ำ (ในรหัสหลอก):

Integer n = STDIN as integer
Add starting_value 0 to the stack
function OUTER_LOOP:
  while(true){
    Add n%2+1 to the stack
    n = n/2
    if(n == 0):
      Jump to INNER_LOOP
    Else:
      Jump to next iteration OUTER_LOOP

function INNER_LOOP:
  while(true){
    n = 3*n
    n = n + Value at the top of the stack (the ones we calculated with n%2+1)
    Swap top two items
    Check if the top is now 0 (starting value):
      Jump to PRINT_AND_EXIT
    Else:
      Swap top two items back
      Jump to next iteration INNER_LOOP

function PRINT_AND_EXIT:
  Swap top two items back
  Print top to STDOUT as integer
  Exit program with error: Exit not defined

และจากนั้นฉันก็นำวิธีการวนซ้ำนี้มาใช้ในภาษาสแต็กตาม Whitespace โดยใช้เป็นสแต็กเริ่มต้น

ตัวอย่างการทำงาน:

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

Command    Explanation                   Stack           Heap    STDIN   STDOUT   STDERR

SSSN       Push 0                        [0]
SNS        Duplicate top (0)             [0,0]
SNS        Duplicate top (0)             [0,0,0]
TNTT       Read STDIN as integer         [0,0]           {0:1}   1
TTT        Retrieve                      [0,1]           {0:1}
NSSSN      Create Label OUTER_LOOP       [0,1]           {0:1}
 SNS       Duplicate top (1)             [0,1,1]         {0:1}
 SSSTSN    Push 2                        [0,1,1,2]       {0:1}
 TSTT      Modulo top two (1%2)          [0,1,1]         {0:1}
 SSSTN     Push 1                        [0,1,1,1]       {0:1}
 TSSS      Add top two (1+1)             [0,1,2]         {0:1}
 SNT       Swap top two                  [0,2,1]         {0:1}
 SSSTSN    Push 2                        [0,2,1,2]       {0:1}
 TSTS      Int-divide top two (1/2)      [0,2,0]         {0:1}
 SNS       Duplicate top (0)             [0,2,0,0]       {0:1}
 NTSN      If 0: Go to Label INNER_LOOP  [0,2,0]         {0:1}
 NSSN      Create Label INNER_LOOP       [0,2,0]         {0:1}
  SSSTTN   Push 3                        [0,2,0,3]       {0:1}
  TSSN     Multiply top two (0*3)        [0,2,0]         {0:1}
  TSSS     Add top two (2+0)             [0,2]           {0:1}
  SNT      Swap top two                  [2,0]           {0:1}
  SNS      Duplicate top (0)             [2,0,0]         {0:1}
  NTSTN    If 0: Jump to Label PRINT     [2,0]           {0:1}
  NSSTN    Create Label PRINT            [2,0]           {0:1}
   SNT     Swap top two                  [0,2]           {0:1}
   TNST    Print top to STDOUT           [0]             {0:1}           2
                                                                                  error

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)
หยุดโดยมีข้อผิดพลาด: ไม่ได้กำหนดทางออก

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

Command    Explanation                   Stack           Heap    STDIN   STDOUT   STDERR

SSSN       Push 0                        [0]
SNS        Duplicate top (0)             [0,0]
SNS        Duplicate top (0)             [0,0,0]
TNTT       Read STDIN as integer         [0,0]           {0:4}   4
TTT        Retrieve                      [0,4]           {0:4}
NSSSN      Create Label OUTER_LOOP       [0,4]           {0:4}
 SNS       Duplicate top (4)             [0,4,4]         {0:4}
 SSSTSN    Push 2                        [0,4,4,2]       {0:4}
 TSTT      Modulo top two (4%2)          [0,4,0]         {0:4}
 SSSTN     Push 1                        [0,4,0,1]       {0:4}
 TSSS      Add top two (0+1)             [0,4,1]         {0:4}
 SNT       Swap top two                  [0,1,4]         {0:4}
 SSSTSN    Push 2                        [0,1,4,2]       {0:4}
 TSTS      Int-divide top two (4/2)      [0,1,2]         {0:4}
 SNS       Duplicate top (2)             [0,1,2,2]       {0:4}
 NTSN      If 0: Go to Label INNER_LOOP  [0,1,2]         {0:4}
 NSNSN     Jump to Label OUTER_LOOP      [0,1,2]         {0:4}
 SNS       Duplicate top (2)             [0,1,2,2]       {0:4}
 SSSTSN    Push 2                        [0,1,2,2,2]     {0:4}
 TSTT      Modulo top two (2%2)          [0,1,2,0]       {0:4}
 SSSTN     Push 1                        [0,1,2,0,1]     {0:4}
 TSSS      Add top two (0+1)             [0,1,2,1]       {0:4}
 SNT       Swap top two                  [0,1,1,2]       {0:4}
 SSSTSN    Push 2                        [0,1,1,2,2]     {0:4}
 TSTS      Int-divide top two (2/2)      [0,1,1,1]       {0:4}
 SNS       Duplicate top (1)             [0,1,1,1,1]     {0:4}
 NTSN      If 0: Go to Label INNER_LOOP  [0,1,1,1]       {0:4}
 NSNSN     Jump to Label OUTER_LOOP      [0,1,1,1]       {0:4}
 SNS       Duplicate top (1)             [0,1,1,1,1]     {0:4}
 SSSTSN    Push 2                        [0,1,1,1,1,2]   {0:4}
 TSTT      Modulo top two (1%2)          [0,1,1,1,1]     {0:4}
 SSSTN     Push 1                        [0,1,1,1,1,1]   {0:4}
 TSSS      Add top two (1+1)             [0,1,1,1,2]     {0:4}
 SNT       Swap top two                  [0,1,1,2,1]     {0:4}
 SSSTSN    Push 2                        [0,1,1,2,1,2]   {0:4}
 TSTS      Int-divide top two (1/2)      [0,1,1,2,0]     {0:4}
 SNS       Duplicate top (0)             [0,1,1,2,0,0]   {0:4}
 NTSN      If 0: Go to Label INNER_LOOP  [0,1,1,2,0]     {0:4}
 NSSN      Create Label INNER_LOOP       [0,1,1,2,0]     {0:4}
  SSSTTN   Push 3                        [0,1,1,2,0,3]   {0:4}
  TSSN     Multiply top two (0*3)        [0,1,1,2,0]     {0:4}
  TSSS     Add top two (2+0)             [0,1,1,2]       {0:4}
  SNT      Swap top two                  [0,1,2,1]       {0:4}
  SNS      Duplicate top (1)             [0,1,2,1,1]     {0:4}
  NTSTN    If 0: Jump to Label PRINT     [0,1,2,1]       {0:4}
  SNT      Swap top two                  [0,1,1,2]       {0:4}
  NSNN     Jump to Label INNER_LOOP      [0,1,1,2]       {0:4}
  SSSTTN   Push 3                        [0,1,1,2,3]     {0:4}
  TSSN     Multiply top two (2*3)        [0,1,1,6]       {0:4}
  TSSS     Add top two (1+6)             [0,1,7]         {0:4}
  SNT      Swap top two                  [0,7,1]         {0:4}
  SNS      Duplicate top (1)             [0,7,1,1]       {0:4}
  NTSTN    If 0: Jump to Label PRINT     [0,7,1]         {0:4}
  SNT      Swap top two                  [0,1,7]         {0:4}
  NSNN     Jump to Label INNER_LOOP      [0,1,7]         {0:4}
  SSSTTN   Push 3                        [0,1,7,3]       {0:4}
  TSSN     Multiply top two (7*3)        [0,1,21]        {0:4}
  TSSS     Add top two (1+21)            [0,22]          {0:4}
  SNT      Swap top two                  [22,0]          {0:4}
  SNS      Duplicate top (0)             [22,0,0]        {0:4}
  NTSTN    If 0: Jump to Label PRINT     [22,0]          {0:4}
  NSSTN    Create Label PRINT            [22,0]          {0:4}
   SNT     Swap top two                  [0,22]          {0:4}
   TNST    Print top to STDOUT           [0]             {0:4}           22
                                                                                  error

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)
หยุดโดยมีข้อผิดพลาด: ไม่ได้กำหนดทางออก


ณ จุดนี้ทำไมไม่เขียนชุดประกอบ? นอกจากนี้ฉันมีวิธีการวนรอบที่ง่ายกว่าเล็กน้อยในคำตอบcodegolf.stackexchange.com/a/161833/17360
qwr

ฉันทำให้ pseudocode ของ python ของฉันง่ายขึ้น
qwr

1
@qwr รหัส Python ของคุณเกือบจะเหมือนกับโค้ด Java ที่แสดง Java เป็นเพียง verbose และข้อผิดพลาดได้ง่ายขึ้น ข้อแตกต่างเพียงอย่างเดียวคือรหัส Java ของฉันซ้อนในขณะที่ลูปและคุณจะแยก ฉันสามารถทำเช่นนั้นใน Java แต่เนื่องจากมันซ้อนกันใน Whitespace ฉันเลือกที่จะเขียนมันเช่นในโค้ดหลอก Java เช่นกัน นอกจากนี้ช่องว่างไม่มีทางที่จะรู้จำนวนรายการที่เหลืออยู่ในสแต็คซึ่งเป็นสาเหตุที่ฉันกด 0 ตอนเริ่มต้นและในส่วน INNER_LOOP ของรหัสทำ: สลับตรวจสอบว่า 0 สลับกลับ คำตอบสมัชชาที่ดีแม้ว่า ฉันได้ +1 มันแล้ว :)
Kevin Cruijssen

ฉันยังคงคิดว่าคุณสามารถกำจัดn < 1เช็คได้โดยการกดค่าจนกว่า n คือ 0 จากนั้นป๊อปอัพจนกว่าคุณจะตีค่าขอบเขตของคุณ (0) ความลึกของสแต็คไม่จำเป็นต้องเก็บไว้อย่างชัดเจนและไม่จำเป็นต้องมีการสลับ (ถ้าคุณหมายถึงการสลับค่าสองค่าสูงสุดเช่น lisp)
qwr

@qwr " ฉันยังคงคิดว่าคุณสามารถกำจัดการตรวจสอบ n <1 ได้โดยการกดค่าจนกว่า n จะเป็น 0 " อืมมม .. กำลังตรวจสอบว่าn < 1(หรือn == 0) กำลังผลักดันค่าจนกว่าnจะเป็น 0 .. หรือฉันแปลสิ่งที่นี่ผิด .. " ความลึกของสแต็คไม่จำเป็นต้องจัดเก็บไว้อย่างชัดเจน " ใน Java มันทำไม่เช่นนั้นฉันไม่สามารถสร้างอาร์เรย์ได้ ฉันสามารถใช้ a java.util.Stackแทนได้ แต่ฉันเพิ่งใช้อาร์เรย์เพื่อทำให้ verbose น้อยลง ในช่องว่างสแต็กมีขนาดที่ไม่ได้กำหนด
Kevin Cruijssen






1

Pyth, 8

ihMjQ2 3

วิธีการกำจัดพื้นที่และทำให้Qโดยนัย?

Pyth ออนไลน์


ฉันเชื่อว่านี่เป็นจริง 8 ไบต์
hakr14

@ hakr14 ใช่คุณพูดถูก
แผลเก่า

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