นับตามแนวทแยง!


30

เรามีแกนแนวนอนมากมายสำหรับตัวเลข แต่ฉันคิดว่าพวกเขาน่าเบื่อจริงๆ งานของคุณในวันนี้คือการสร้างส่วนหนึ่งของแกนทแยงมุมระหว่างจำนวนเต็มสองจำนวนที่ไม่เป็นลบที่แตกต่างกันซึ่งถูกกำหนดให้เป็นอินพุต

วิธีการสร้างแกนแนวทแยง?

  • 0, 5ลองมาตัวอย่างเช่นมีการป้อนข้อมูล แกนของเราควรมีลักษณะเช่นนี้:

    0
     1
      2
       3
        4
         5
    
  • อย่างไรก็ตามแกนของเราควรดูดีสำหรับตัวเลขที่มีตัวเลขมากกว่า! ถ้าอินพุทคือ0, 14แกนใหม่ควรเป็น:

    0
     1
      2
       3
        4
         5
          6
           7
            8
             9
              10
                11
                  12
                    13
                      14
    
  • แนวคิดคือตัวเลขตัวแรกของตัวเลขถัดไปบนแกนจะต้องถูกวางไว้อย่างแน่นอนเสมอหลังจากตัวเลขสุดท้ายของตัวเลขก่อนหน้า เพื่อทำความเข้าใจแนวคิดที่ดียิ่งขึ้นนี่เป็นอีกตัวอย่างหนึ่งของ997, 1004:

    997
       998
          999
             1000
                 1001
                     1002
                         1003
                             1004
    

กฎระเบียบ

  • คุณอาจสมมติว่าอินพุตอยู่ในลำดับขึ้นหรือลง (คุณอาจเลือกระหว่าง5,3และ3,5)

  • คุณอาจสมมติว่าความแตกต่างระหว่างจำนวนเต็มสองตัวนั้นต่ำกว่า 100

  • คุณอาจมี newline ชั้นนำหรือพื้นที่ชั้นนำที่สอดคล้องกัน (ในแต่ละบรรทัด) ช่องว่างต่อท้าย / การขึ้นบรรทัดใหม่ก็ใช้ได้เช่นกัน

  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม

  • คุณสามารถใช้อินพุทและเอาท์พุทให้โดยใด ๆ ค่าเฉลี่ยมาตรฐาน

  • นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ในทุกภาษาชนะ!


กรณีทดสอบอื่น ๆ

  • 1, 10:

    1
     2
      3
       4
        5
         6
          7
           8
            9
             10
    
  • 95, 103:

    95
      96
        97
          98
            99
              100
                 101
                    102
                       103
    
  • 999999, 1000009:

    999999
          1000000
                 1000001
                        1000002
                               1000003
                                      1000004
                                             1000005
                                                    1000006
                                                           1000007
                                                                  1000008
                                                                         1000009
    

อนุญาตให้มีช่องว่างนำหน้าหรือหมายเลขแรกต้องอยู่ตรงด้านซ้ายของหน้าจอหรือไม่
Nathan.Eilisha Shiraini

@NathanShiraini อนุญาตให้ขึ้นบรรทัดใหม่ได้
นาย Xcoder


@ StepHen คนนี้ยากขึ้นอีกเล็กน้อยขอบคุณสำหรับการอ้างอิง
Mr. Xcoder

1
@Adnan คุณอาจมี newline ชั้นนำหรือพื้นที่ชั้นนำที่สอดคล้องกันในแต่ละบรรทัด
Mr. Xcoder

คำตอบ:


19

05AB1E , 8 7 6 ไบต์

ขอบคุณMagic Octopus Urnสำหรับการบันทึกไบต์!

มันใช้งานได้ แต่จริงๆแล้วฉันไม่รู้ว่าทำไม

รหัส

Ÿvy.O=

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย

Ÿ          # Create the range [a, .., b] from the input array
 vy        # For each element
   .O      #   Push the connected overlapped version of that string using the
                 previous version of that string. The previous version initially
                 is the input repeated again. Somehow, when the input array is
                 repeated again, this command sees it as 1 character, which gives
                 the leading space before each line outputted. After the first
                 iteration, it reuses on what is left on the stack from the
                 previous iteration and basically attaches (or overlaps) itself 
                 onto the previous string, whereas the previous string is replaced 
                 by spaces and merged into the initial string. The previous string
                 is then discarded. We do not have to worry about numbers overlapping 
                 other numbers, since the incremented version of a number never
                 overlaps entirely on the previous number. An example of 123 and 456:

                 123
                    456

                 Which leaves us "   456" on the stack.
     =     #   Print with a newline without popping

.O = pop a,b push connected_overlap(b) (deprecated)- โอ้ฉันเดาเหรอ?
Magic Octopus Urn

@MagicOctopusUrn ใช่.Oเป็นรถที่มากและเลิกใช้มานานกว่าหนึ่งปีดังนั้นฉันจึงไม่รู้ว่าอะไรทำงานได้ดีและอะไรที่ไม่ดี ฉันสาบานได้ว่าฉันต้องการÎแต่ทันใดนั้นก็ไม่เป็นเช่นนั้นอีกต่อไป (?) ขอบคุณ! :)
Adnan

1
Btw Îจำเป็นต้องมีเพื่อลดจำนวนช่องว่างนำสูงสุดเป็น 1
Adnan

ฉัน ... รอ ... อะไรนะ ...
Magic Octopus Urn

1
@ Mr.Xcoder เพิ่ม
Adnan

14

Python 2 , 43 ไบต์

lambda a,b:'\v'.join(map(str,range(a,b+1)))

ทำให้การใช้แท็บแนวตั้งเพื่อให้ผลบันได วิธีการ\vแสดงผลthet นั้นขึ้นอยู่กับคอนโซลดังนั้นมันอาจไม่ทำงานในทุกที่ (เช่น TIO)
รหัสเรียกใช้


คุณสามารถใช้ตัวอักษร\x0bในรหัสของคุณเพื่อบันทึก byte ได้หรือไม่?
Dom Hastings

@ DomHastings บางทีฉันไม่รู้เหมือนกันว่า
Rod

ฉันเพิ่งทดสอบและดูเหมือนว่าจะใช้งานได้ สำหรับการทำให้ตัวละครลงในไฟล์เพื่อทดสอบฉันใช้ Sublime Text และทำการค้นหาและแทนที่ในโหมด regex สำหรับ\\vและแทนที่ด้วย\x0Bซึ่งจะแสดงVTอักขระในตำแหน่งเพื่อให้คะแนนคุณสามารถโพสต์ hexdump แบบย้อนกลับได้ ( xxdหรือบางอย่าง) หรือเพียง ระบุว่า: " \vเป็นแท็บแนวตั้งตามตัวอักษร" ฉันคิดว่าน่าจะยุติธรรม หวังว่าจะช่วย!
Dom Hastings

13

ถ่าน , 9 8 ไบต์

F…·NN⁺¶ι

ลองออนไลน์!

ลิงก์คือโค้ดเวอร์ชัน verbose ป้อนข้อมูลจากน้อยไปมาก

  • บันทึก 1 ไบต์ต้องขอบคุณ ASCII-only!

เยี่ยมมาก Charcoal ชนะอีกครั้ง!
Mr. Xcoder


แก้ไข: Charcoal outgolfed ... ว้าว
Mr. Xcoder

2
@ Mr.Xcoder อย่างน้อยฉันก็รู้ว่าคำตอบของฉันทำงานอย่างไร :-D
Charlie

7

R, 70 69 61 61 ไบต์

function(a,b)for(i in a:b){cat(rep('',F),i,'
');F=F+nchar(i)}

ฟังก์ชันที่รับตัวแปรเริ่มต้นและสิ้นสุดเป็นอาร์กิวเมนต์ วนซ้ำตามลำดับและพิมพ์แต่ละองค์ประกอบที่มีช่องว่างเพียงพอ Fเริ่มเป็นFALSE=0และในระหว่างการทำซ้ำแต่ละครั้งจำนวนของอักขระสำหรับค่านั้นจะถูกเพิ่มเข้าไป Fตัดสินใจจำนวนช่องว่างที่พิมพ์

ลองออนไลน์!

-8 ไบต์ขอบคุณ @Giuseppe


ฉันเห็น 70 ไบต์ที่นั่น การใช้scan()สองครั้งก็สามารถลดลงได้ถึง 67 for(i in scan():scan()){cat(rep(' ',F),i,'\n',sep='');F=F+nchar(i)}ไบต์
djhurio

น่าเสียดายที่คุณต้องรีเซ็ต F มิฉะนั้นฟังก์ชันสามารถใช้งานได้เพียงครั้งเดียวในเซสชันใหม่ F=0;for(i in scan():scan()){cat(rep(' ',F),i,'\n',sep='');F=F+nchar(i)}(71 byte)
djhurio

@djhurio ภายในฟังก์ชันที่ไม่จำเป็นเนื่องจาก F ถูกปรับเปลี่ยนในเนมสเปซของตัวเองเท่านั้น นอกจากนี้ผมนับ 69 ncharไบต์ใช้
JAD

1
แต่การแทนที่\nสำหรับการขึ้นบรรทัดใหม่ที่เกิดขึ้นจริงก็มีผลเช่นกัน
JAD

1
ดีฉันคิดถึงการใช้ระยะห่างที่catไม่เหมาะสม แต่ฉันไม่สามารถคิดให้ตรงและคิดออกด้วยเหตุผลบางอย่างได้
JAD

6

C #, 90 89 85 ไบต์

s=>e=>{var r="";for(int g=0;e>s;g+=(s+++"").Length)r+="".PadLeft(g)+s+"\n";return r;}

บันทึกแล้ว 1 ไบต์ขอบคุณ @LiefdeWen
บันทึกแล้ว 4 ไบต์ขอบคุณ @auhmaan

ลองออนไลน์!

เวอร์ชันเต็ม / ฟอร์แมต:

namespace System
{
    class P
    {
        static void Main()
        {
            Func<int, Func<int, string>> f = s => e =>
            {
                var r = "";
                for (int g = 0; e > s; g += (s++ + "").Length)
                    r += "".PadLeft(g) + s + "\n";

                return r;
            };

            Console.WriteLine(f(0)(5));
            Console.WriteLine(f(0)(14));
            Console.WriteLine(f(997)(1004));
            Console.WriteLine(f(1)(10));
            Console.WriteLine(f(95)(103));
            Console.WriteLine(f(999999)(1000009));

            Console.ReadLine();
        }
    }
}

1
+1, ตอนนี้คุณไม่มี 5k อย่างแม่นยำ D
Mr. Xcoder

1 ไบต์i<=eถึงe>i
Liefde เมื่อ

@LiefdeWen ขอบคุณ :)
TheLethalCoder

ผมเชื่อว่าคุณสามารถประหยัดมากขึ้น 4 ไบต์โดยการลบiและนำsแทน
auhmaan

@auhmaan ขอบคุณไม่รู้ว่าทำไมฉันไม่เคยคิดถึงการใช้ตัวแปรอินพุต
TheLethalCoder

6

Python 2 , 58 54 ไบต์

def f(a,b,s=''):print s;b<a or f(a+1,b,' '*len(s)+`a`)

ลองออนไลน์!


ว้าวโซลูชันแบบเรียกซ้ำและ out-golfs คำตอบหลามส่วนใหญ่ +1
อย่างเป็นทางการ

งานที่ดีมาก Ruud โซลูชันของคุณยังเป็นระบบปฏิบัติการและเป็นอิสระจากคอนโซลโดยไม่ใช้อักขระแท็บแนวตั้งอย่างที่ Rod ทำ
RaphaëlCôté

6

Mathematica, 59, ไบต์

Grid[(DiagonalMatrix@Range[1+##]/. 0->""+1)-1,Spacings->0]&

อินพุต

[10,15]

-3 ไบต์ @JungHwanMin
มีปัญหา 0 คงที่ (ดูความคิดเห็นเพื่อดูรายละเอียด)
thanx ถึง @ngenisis


1
ว้าวคำตอบที่มีคำว่าDiagonal
Mr. Xcoder

คุณต้องเพิ่มSpacings -> 0ถ้าคุณต้องการให้สิ่งนี้เป็นตัวอักษรที่แน่นอน
Mr.Wizard

อินพุตเป็นแบบไม่ลบเท่านั้นไม่รับประกันว่าจะเป็นค่าบวก
user202729

Grid[(DiagonalMatrix@Range[1+##]/. 0->""+1)-1,Spacings->0]&เป็นวิธีที่สั้นที่สุดที่ฉันสามารถแก้ไขปัญหาเหล่านั้นได้
ngenisis


5

Mathematica, 48 ไบต์

Rotate[""<>Table[ToString@i<>" ",{i,##}],-Pi/4]&

เนื่องจากมีคำตอบมากมายฉันคิดว่าควรรวมสิ่งนี้ไว้

อินพุต

[0,10]

เอาท์พุต
ป้อนคำอธิบายรูปภาพที่นี่


1
สิ่งนี้ไม่ถูกต้องใช่ไหม แต่ +1 เพียงเพื่อรับชื่ออย่างแท้จริง
Zacharý

5

C, 166 134 95 82 ไบต์

คำตอบใหม่

เช่นเดียวกับฟังก์ชั่นที่ไม่เหมือนโปรแกรมทั้งหมด

f(a,b){int s=0,i;while(a<=b){i=s;while(i--)printf(" ");s+=printf("%i\n",a++)-1;}}

ขอบคุณ Falken ที่ช่วยเราะ 13 ไบต์ (และแก้ไขความผิดพลาด)!

ขอบคุณ Steph Hen ที่ช่วยเราปลด 12 ไบต์!

ขอบคุณZacharýที่ช่วยเราปลด 1 Byte!

คำตอบเก่า ๆ

กำจัด int ก่อน main และเปลี่ยน const char * v [] เป็น char ** v และกำจัด return 0;

main(int c,char**v){int s=0;for(int a=atoi(v[1]);a<=atoi(v[2]);a++){for(int i=0;i<s;i++)printf(" ");printf("%i\n",a);s+=log10(a)+1;}}


int main(int c,const char*v[]){int s=0;for(int a=atoi(v[1]);a<=atoi(v[2]);a++){for(int i=0;i<s;i++)printf(" ");printf("%i\n",a);s+=log10(a)+1;}return 0;}

นี่เป็นครั้งแรกที่ฉันเล่นกอล์ฟและฉันต้องการลองบางสิ่งบางอย่างใน C ไม่แน่ใจว่าฉันจัดรูปแบบนี้ถูกต้องหรือไม่ แต่ฉันสนุกที่จะทำ!

int main(int c, const char * v[]) {
    int s = 0;
    for(int a=atoi(v[1]); a<=atoi(v[2]); a++) {
        for(int i=0; i<s; i++) printf(" ");
        printf("%i\n",a);
        s += log10(a)+1;
    }
    return 0;
}

คำอธิบาย

int s = 0; // Number of spaces for each line

for(int a=atoi(argv[1]); a<=atoi(argv[2]); a++) { // Loop thru numbers

for(int i=0; i<s; i++) printf(" "); // Add leading spaces

printf("%i\n",a); // Print number

s += log10(a)+1; // Update leading spaces

การใช้

ป้อนคำอธิบายรูปภาพที่นี่


ยินดีต้อนรับสู่ PPCG! ฉันเชื่อว่าคุณสามารถเปลี่ยนชื่อargcและargvตัวแปรตัวอักษรหนึ่งตัว
สตีเฟ่น

ฉันคิดว่าคุณสามารถย้ายไปยังห่วงในขณะที่int s=0 for(int s=0;a<=b;a++)
Zacharý

อ่าขอบคุณที่ถูกต้องของฉันฉันปรับปรุงการโพสต์!
Asleepace

การใช้int i=s;while(i--)แทนfor(int i=0;i<s;i++)การวนซ้ำภายในจะบันทึกสองไบต์
Falken

1
อ่าใช่คุณลืมเกี่ยวกับ log10 วันที่ 0 และเชิงลบฉันได้ปรับปรุงการแก้ปัญหาขอบคุณ!
Asleepace

4

C ++, 167 165 ไบต์

-2 ไบต์ขอบคุณZacharý

#include<string>
#define S std::string
S d(int l,int h){S r;for(int m=0,i=l,j;i<=h;){for(j=0;j<m;++j)r+=32;S t=std::to_string(i++);r+=t;r+=10;m+=t.size();}return r;}

1. คุณสามารถย้ายint m=0,i=l,jไปที่forลูปแรกเพื่อบันทึกไบต์ได้หรือไม่? 2. คุณสามารถเปลี่ยนr+=t;r+=10ไปr+=t+10? 3. ฉันชนะใครบางคนใช่
Zacharý

@ Zacharýฉันทำได้r+=t+=10แต่ไม่ใช่r+=t+10มันทำให้ฉันมีข้อผิดพลาด
HatsuPointerKun

แต่r+=t+=10ใช้งานได้? จะไม่ส่งผลกระทบต่อt.size()?
Zacharý

@ Zacharýใช่มันใช้งานได้กับ + เท่านั้นมันบอกว่าไม่สามารถหาโอเวอร์โหลดที่มีพารามิเตอร์เป็น as ได้ แต่ด้วย + = จะใช้โอเวอร์โหลดกับ char
HatsuPointerKun

โอ้คุณสามารถย้าย++iไปstd::to_string(i)เป็นstd::to_string(i++)ที่จะบันทึกหนึ่งไบต์มากขึ้น?
Zacharý

4

APL (Dyalog) , 25 24 ไบต์

-1 ขอบคุณที่Zachary

ถือว่า⎕IO←0เป็นศูนย์การนับตาม ใช้ขอบเขตล่างเป็นอาร์กิวเมนต์ซ้ายและขอบเขตบนเป็นอาร์กิวเมนต์ขวา

{↑⍵↑⍨¨-+\≢¨⍵}(⍕¨⊣+∘⍳1--)

ลองออนไลน์!

() ใช้ฟังก์ชัน tacit ต่อไปนี้ระหว่างอาร์กิวเมนต์:

- ลบส่วนล่างด้านบนออกจากขอบด้านบน

1- ลบออกจากหนึ่ง (เช่น 1 + ∆)

⊣+∘⍳ ขอบล่างด้านซ้ายบวกกับจำนวนเต็ม 0 ตลอด

⍕¨ รูปแบบ (stringify) แต่ละรายการ

{} ใช้สิ่งที่ไม่ระบุชื่อต่อไปนี้ (แสดงโดย⍵):

≢¨ ความยาวของแต่ละ (หมายเลข)

+\ ยอดรวมสะสม

- ลบล้าง

⍵↑⍨¨ สำหรับแต่ละหมายเลขที่ได้รับให้ใช้อักขระจำนวนมากจากจุดสิ้นสุด (แผ่นที่มีช่องว่าง)

 รายการผสมของสตริงลงในเมทริกซ์ของตัวละคร


อาจ+-⍨จะเป็น--อย่างไร
Zacharý

@ Zacharýใช่แน่นอน ขอบคุณ
Adám

4

เรติน่า , 81 78 ไบต์

.+
$*
+`\b(1+)¶11\1
$1¶1$&
1+
$.& $.&
 (.+)
$.1$* 
+1`( *)(.+?)( +)¶
$1$2¶$1$3

ลองออนไลน์! รับอินพุตเป็นรายการที่คั่นด้วยบรรทัดใหม่ของจำนวนเต็มสองตัว แก้ไข: บันทึก 3 ไบต์ด้วยการขโมยรหัสการขยายช่วงจากคำตอบของฉันไปที่เราจะแบ่งปันกลุ่มเฉพาะหรือไม่ คำอธิบาย:

.+
$*

แปลงอินพุททั้งสองเป็นเอก

+`\b(1+)¶11\1
$1¶1$&

ในขณะที่องค์ประกอบสองรายการสุดท้าย (a, b) ของรายการต่างกันมากกว่า 1 รายการให้แทนที่ด้วย (a, a + 1, b) สิ่งนี้จะขยายรายการจากทูเปิลเป็นช่วง

1+
$.& $.&

แปลงกลับเป็นทศนิยมซ้ำ

 (.+)
$.1$* 

แปลงสำเนาที่ซ้ำกันเป็นช่องว่าง

+1`( *)(.+?)( +)¶
$1$2¶$1$3

รวมช่องว่างจากแต่ละบรรทัดไปยังหน้าถัดไป



3

โลโก้ 53 ไบต์

[for[i ? ?2][repeat ycor[type "\ ]pr :i fd count :i]]

ไม่มี "ลองออนไลน์!" ลิงก์เนื่องจากล่ามโลโก้ออนไลน์ทั้งหมดไม่สนับสนุนรายการเทมเพลต

นั่นคือรายการแม่แบบ (เทียบเท่าฟังก์ชั่นแลมบ์ดาในภาษาอื่น ๆ )

การใช้งาน:

apply [for[i ? ?2][repeat ycor[type "\ ]pr :i fd count :i]] [997 1004]

( applyเรียกใช้ฟังก์ชัน)

จะพิมพ์

997
   998
      999
         1000
             1001
                 1002
                     1003
                         1004

บันทึก:

วิธีนี้ใช้ycor(พิกัด Y) ของเต่าเพื่อเก็บจำนวนช่องว่างที่จำเป็นในการพิมพ์ดังนั้น:

  • เต่าจะต้องถูกตั้งไว้ที่บ้านในตำแหน่งเริ่มต้นและส่วนหัว (ขึ้นไป) ก่อนการร้องขอแต่ละครั้ง
  • windowควรดำเนินการหากycorมีขนาดใหญ่เกินไปที่เต่าเคลื่อนออกจากหน้าจอ คำอธิบายของwindowคำสั่ง: if the turtle is asked to move past the boundary of the graphics window, it will move off screen.ซึ่งแตกต่างจากการตั้งค่าเริ่มต้นwrapซึ่งif the turtle is asked to move past the boundary of the FMSLogo screen window, it will "wrap around" and reappear at the opposite edge of the window.

คำอธิบาย:

for[i ? ?2]        Loop variable i in range [?, ?2], which is 2 input values
repeat ycor        That number of times
type "\            space character need to be escaped to be typed out.
pr :i              print the value of :i with a newline
fd count :i        increase turtle's y-coordinate by the length of the word :i. (Numbers in LOGO are stored as words)

3

05AB1E , 8 ไบต์

Ÿʒ¾ú=þv¼

ลองออนไลน์!

-2 ขอบคุณที่Adnan


อ่านั่นฉลาดมาก คุณสามารถแทนที่vyด้วยʒและgFโดยvการบันทึก 2 ไบต์
Adnan

@Adnan ผมไม่ได้คาดหวังว่าเก่าดีʒเคล็ดลับที่จะยังคงถูกใช้ ...
เอริก Outgolfer

3

JavaScript (ES8), 69 67 62 ไบต์

รับอินพุตเป็นจำนวนเต็มโดยเรียงตามลำดับจากน้อยไปมาก ส่งคืนอาร์เรย์ของสตริง

x=>y=>[...Array(++y-x)].map(_=>s="".padEnd(s.length)+x++,s="")

ลองมัน

o.innerText=(f=

x=>y=>[...Array(++y-x)].map(_=>s="".padEnd(s.length)+x++,s="")

)(i.value=93)(j.value=105).join`\n`
oninput=_=>o.innerText=f(Math.min(i.value,j.value))(Math.max(i.value,j.value)).join`\n`
label,input{font-family:sans-serif}input{margin:0 5px 0 0;width:100px;}
<label for=i>x: </label><input id=i type=number><label for=j>y: </label><input id=j type=number><pre id=o>


3

Japt , 12 ไบต์

òV
£¯Y ¬ç +X

ใช้อินพุตในลำดับใดก็ได้และส่งคืนตัวเลขในลำดับจากน้อยไปหามากเป็นอาร์เรย์ของเส้น

ลองออนไลน์! ด้วยการ-Rตั้งค่าสถานะเพื่อเข้าร่วมอาร์เรย์กับบรรทัดใหม่

คำอธิบาย

การป้อนข้อมูลโดยนัยของและUV

òV
£

สร้างช่วงที่ครอบคลุม[U, V]และจับคู่แต่ละค่ากับ ...

¯Y ¬ç

ค่าก่อนปัจจุบัน ( ¯Y) เข้าร่วมกับสตริง ( ¬) และเต็มไปด้วยช่องว่าง ( ç)

+X

บวกจำนวนปัจจุบัน อาร์เรย์ผลลัพธ์เป็นเอาต์พุตโดยปริยาย


3

Python 2 , 65 63 62 61 ไบต์

-2 ไบต์ขอบคุณ @Mr Xcoder: execไม่ต้องการเครื่องมือจัดฟัน

-1 บายขอบคุณ @ Zacharý: print s*' 'asprint' '*s

def f(m,n,s=0):exec(n-m+1)*"print' '*s+`m`;s+=len(`m`);m+=1;"

ลองออนไลน์!


1
คุณไม่ต้องการวงเล็บปีกกาสำหรับผู้บริหาร m,n=input();s=0;exec(n-m+1)*"print s*' '+`m`;s+=len(`m`);m+=1;"พอเพียง
นาย Xcoder

1
ฉันคิดว่าคุณสามารถเปลี่ยนprint s*' 'เพื่อprint' '*sที่จะบันทึกหนึ่งไบต์
Zacharý

2

JavaScript, 57 ไบต์

f=(x,y,s='')=>y>=x?s+`
`+f(x+1,y,s.replace(/./g,' ')+x):s

55 ไบต์: โทรด้วยความดีความชอบกับจำนวนเต็มกลับ:y=>g=(x,s='')=>y<x?s:s+'\n'+g(x+1,s.replace(/./g,' ')+x) f(103)(95)
Shaggy

54 ไบต์: เรียกว่าเป็นx=>y=>g=(s='')=>y<x?s:s+'\n'+g(s.replace(/./g,' ')+x++) f(x)(y)()
Shaggy

2

Python 2, 60 59 ไบต์

-1 ไบต์ขอบคุณ Mr.Xcoder สำหรับการกำหนด s = 0 ของฉันเป็นตัวแปรทางเลือกในฟังก์ชั่นของฉัน

def f(l,u,s=0):
 while l<=u:print' '*s+`l`;s+=len(`l`);l+=1

ลองออนไลน์!

ฉันคิดว่ามันเป็นไปได้ที่จะถ่ายโอนสิ่งนี้ลงในแลมบ์ดาเวอร์ชัน แต่ฉันไม่รู้ว่าอย่างไร ฉันยังคิดว่ามีการแมปบางอย่างระหว่างช่องว่างกับความยาวของตัวเลขปัจจุบัน แต่นี่ฉันยังไม่เข้าใจ ดังนั้นฉันคิดว่ายังมีที่ว่างสำหรับการปรับปรุง

สิ่งที่ฉันไม่ได้รับการสร้างช่วงจาก lowerbound ที่lไปผูกไว้บนพิมพ์แต่ละบรรทัดมีพื้นที่คูณด้วยตัวเลขu sฉันกำลังเพิ่มตัวคูณด้วยความยาวของตัวเลขปัจจุบัน




ฉันจะคิดว่าคุณทำกับ "exec" - รุ่นที่ใหม่กว่าในวันนี้ บางทีมันอาจช่วยฉันในการเขียนโค้ดในอนาคต ขอบคุณ
Simon


2

Python 2, 78 77 79 ไบต์

def f(a,b):
 for i in range(a,b+1):print sum(len(`j`)for j in range(i))*' '+`i`

ลองออนไลน์!

f(A, B) จะพิมพ์ส่วนของแกนระหว่าง A และ B รวม

ครั้งแรกที่ฉันตอบคำถามท้าทาย!

ใช้และใช้งาน backticks ของ Python 2 ในการนับจำนวนช่องว่างที่จะต้องเพิ่มก่อนจำนวน

-1 ไบต์ขอบคุณMr.Xcoder

+2 เพราะฉันลืม +1


4
ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี sum(len(`j`)) forสามารถกลายเป็นsum(len(`j`)for-1 ไบต์
Mr. Xcoder

1
เพื่อให้คำตอบนี้ถูกต้องคุณต้องแทนที่range(a,b)ด้วยrange(a,b+1)เพราะ Python มีช่วงแบบกึ่งรวม
Mr. Xcoder

แน่นอนฉันพลาดไป มีอะไรน่าแปลกใจมากคือว่าผมไม่เพิ่มที่ 1 เมื่อฉันทำทดสอบของฉัน! ไม่น่าแปลกใจที่ฉันหายไป 2 ไบต์เมื่อฉันพิมพ์ลงใน TiO ...
Nathan.Eilisha Shiraini

2

C (gcc) , 41 38 ไบต์

-3 ไบต์ขอบคุณASCII เท่านั้น

t(x,v){while(x<=v)printf("%d\v",x++);}

ใช้งานได้กับ RedHat6 เข้าถึงได้ผ่าน PuTTY

พิสูจน์

ลองออนไลน์!


1
สิ่งนี้ไม่ได้สร้างผลลัพธ์ที่ถูกต้อง
Erik the Outgolfer

มันยุ่งยากส่งออกไปยังไฟล์และใช้moreกับไฟล์นั้น
Giacomo Garabello

2
@GiacomoGarabello คุณต้องระบุรหัสเต็มเพื่อให้เราสามารถเรียกใช้โปรแกรมของคุณได้ หากคุณไม่ได้เตรียมพื้นที่ทดสอบการทำงาน / ไม่ได้ให้คำแนะนำเกี่ยวกับวิธีการเรียกใช้โปรแกรมของคุณเพื่อให้ได้ผลลัพธ์ที่ถูกต้องโปรดลบคำตอบนี้
Mr. Xcoder

Linefeed อาจกลับไปที่จุดเริ่มต้นของบรรทัดขึ้นอยู่กับ มันจะทำงานเมื่อไม่ได้
user202729

@ Mr.Xcoder แก้ไข
Giacomo Garabello

2

V , 16 ไบต์

ÀñÙywÒ $pça/jd

ลองออนไลน์!

นี่จะเป็นวิธีที่ง่ายกว่าถ้าฉันทำได้start end - startแต่ฉันคิดว่านั่นเป็นการเปลี่ยนแปลงความท้าทายมากเกินไป

ใช้หมายเลขเริ่มต้นเป็นอินพุตในบัฟเฟอร์และหมายเลขสิ้นสุดเป็นอาร์กิวเมนต์ มันสร้างบันไดจากstartไปstart + endแล้วลบทุกอย่างหลังจากหมายเลขสุดท้าย


2

MATL 11 ไบต์

vii&:"t~@Vh

ลองออนไลน์!

คำอธิบาย

สิ่งนี้ทำงานได้โดยการสร้างสตริงสำหรับแต่ละหมายเลขและเชื่อมโยงกับสำเนาที่ไม่มีเหตุผลของสตริงก่อนหน้า ดังนั้นถ่าน 0 ถูกเติมเป็น 0 หลายครั้งเท่ากับความยาวของสตริงก่อนหน้า Char 0 แสดงเป็นช่องว่างและแต่ละสตริงจะแสดงบนบรรทัดที่แตกต่าง

v       % Concatenate stack (which is empty): pushes []
ii      % Input two numbers
&:      % Range between the two numbers
"       % For each
  t     %   Duplicate
  ~     %   Logical negation. This gives a vector of zeros
  @     %   Push current number
  V     %   Convert to string
  h     %   Concatenate with the vector of zeros, which gets automatically 
        %   converted into chars.
        % End (implicit). Display stack (implicit), each string on a diferent
        % line, char 0 shown as space


2

Perl, 19 ไบต์

หมายเหตุ: \x0bนับเป็นหนึ่งไบต์

ร่วมกับคนอื่น ๆ ฉันคิดว่าการใช้เคอร์เซอร์จะเป็นเส้นทางที่สั้นที่สุดนี่หมายความว่ามันใช้งานไม่ได้กับ TIO:

print"$_\x0b"for<>..<>

การใช้

perl -e 'print"$_\x0b"for<>..<>' <<< '5
10'
5
 6
  7
   8
    9
     10

เยี่ยมมากไม่เห็น Perl เลยซักพัก คุณสามารถเพิ่มลิงค์ทดสอบได้ไหม นอกจากนี้ฉันยังสงสัยว่า1..มันมีอะไรบ้างเนื่องจากคุณได้รับจำนวนเต็มสองจำนวน
Mr. Xcoder

@ Mr.Xcoder ใช่ใช่1..ฉันไม่ได้อ่านสเป็คที่ครบถ้วนแล้วตอนนี้! สำหรับการทดสอบแบบออนไลน์เนื่องจากผลลัพธ์มีแท็บแนวตั้งจึงไม่แสดงผลตามที่คาดไว้ พยายามที่จะดูว่าฉันสามารถหา renderer ที่รองรับ chars ควบคุม ... ถ้าไม่นั่นอาจเป็นโครงการใหม่ของฉัน!
Dom Hastings

2

Japt , 10 9 ไบต์

òV åÈç +Y

ทดสอบออนไลน์! ส่งคืนอาร์เรย์ของเส้น -Rรวมค่าสถานะเพื่อเข้าร่วมในการขึ้นบรรทัดใหม่เพื่อให้ดูง่ายขึ้น

คำอธิบาย

 òV åÈ   ç +Y
UòV åXY{Xç +Y}   Ungolfed
                 Implicit: U, V = inputs, P = empty string
UòV              Create the range [U, U+1, ..., V-1, V].
    åXY{     }   Cumulative reduce: Map each previous result X and current item Y to:
        Xç         Fill X with spaces.
           +Y      Append Y.
                 Implicit: output result of last expression

รุ่นเก่า 10 ไบต์:

òV £P=ç +X

ทดสอบออนไลน์!

 òV £  P= ç +X
UòV mX{P=Pç +X}  Ungolfed
                 Implicit: U, V = inputs, P = empty string
UòV              Create the range [U, U+1, ..., V-1, V].
    mX{       }  Map each item X to:
         Pç        Fill P with spaces.
            +X     Append X.
       P=          Re-set P to the result.
                   Implicitly return the same.
                 Implicit: output result of last expression

แดงฉันเพิ่งคิดวิธีแก้ปัญหาแบบเดียวกันเพื่อปรับปรุงคำตอบของฉันเอง
Justin Mariner

2

D, 133 127 126 125 121 119 ไบต์

import std.conv,std.stdio;void f(T)(T a,T b,T s=0){for(T j;j++<s;)' '.write;a.writeln;if(a-b)f(a+1,b,s+a.text.length);}

เยลลี่และ APL ถูกถ่าย

ลองออนไลน์!

หากคุณกำลังดีกับผลคอนโซลขึ้นอยู่กับ (ไปปิดหลักการเดียวกับคำตอบของ Giacomos C) นี่คือหนึ่งสำหรับ72 71 ไบต์:

import std.stdio;void f(T)(T a,T b){while(a<=b){a++.write;'\v'.write;}}

อย่างไร? (เฉพาะเทคนิคเฉพาะ D)

  • f(T)(T a,T b,T s=0) ระบบแม่แบบของ D สามารถอนุมานประเภท
  • for(T j;j++<s;)0เริ่มต้นที่จะจำนวนเต็ม
  • ' '.write;a.writelnD ให้คุณโทรfun(arg)เช่นarg.fun(หนึ่งในไม่กี่สิ่งที่สนามกอล์ฟ D)
  • a.text.lengthเหมือนกับข้างบนและ D ยังอนุญาตให้คุณเรียกใช้เมธอดที่ไม่มีพารามิเตอร์ราวกับว่ามันเป็นคุณสมบัติ ( textเป็นการแปลงเป็นสตริง)
  • สิ่งหนึ่งที่อาจเกี่ยวข้อง (ฉันไม่ได้ใช้สิ่งนี้) การขึ้นบรรทัดใหม่อาจอยู่ในเงื่อนไข!

2

Java 8, 79 ไบต์

(a,b)->{for(String s="";a<=b;System.out.printf("%"+s.length()+"d\n",a++))s+=a;}

ลองออนไลน์!


คุณสามารถบันทึกไบต์โดยการเปลี่ยนไป(a,b)-> b->a->(และคุณสามารถบันทึกอีกสามไบต์ได้โดยไปที่ Java 10 และเปลี่ยนStringเป็นvar) ลองใช้ออนไลน์
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.