พิมพ์ส่วนโค้งของตัวเลขจากน้อยไปมาก / มากไปน้อย


28

ฉันคิดว่า "ส่วนโค้ง" เป็นวิธีที่ดีที่สุดในการอธิบายรูปแบบของตัวเลขนี้:

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

ที่กำหนดไว้อย่างเป็นทางการแต่ละบรรทัดประกอบด้วยตัวเลข 1 ถึง9-n, (n-1)*2การเว้นวรรคและตัวเลขที่9-nผ่าน 1 (ที่nเป็นบรรทัดปัจจุบัน)

งานของคุณคือการเขียนโดยใช้รหัสที่สั้นที่สุดที่เป็นไปได้สคริปต์ / โปรแกรมขนาดเล็กที่พิมพ์รูปแบบข้างต้นภายใต้ข้อ จำกัด ดังต่อไปนี้:

  1. คุณไม่สามารถ hardcode รูปแบบทั้งหมดได้ คุณอาจ hardcode บรรทัดเดียวของรูปแบบสูงสุด
  2. โปรแกรมของคุณจะต้องพิมพ์ขึ้นบรรทัดใหม่ (การรวมกันของ\nหรือ\r) ในตอนท้ายของแต่ละบรรทัด

พร้อม ... ตั้ง .... ไปกันเลย!


1
เคล็ดลับเล็ก ๆ น้อย ๆ เพิ่มเติมจะใช้ได้กับสายบน123456787654321เป็นมันเท่ากับ11111111^2 ;-)
Egor Skriptunoff

3
@EgorSkriptunoff 11111111^2 == 123465787654321 != 1234567887654321(สังเกตซ้ำ8)
Bob

นี่เป็นสิ่งที่ตรงกันข้ามกับการพิมพ์เพชรนี้
Peter Taylor

6
มันดูค่อนข้างเหมือนม่าน
ความผันผวน

คำตอบ:




9

APL (18)

k,⌽k←↑↑∘(1↓⎕D)¨⌽⍳8

คำอธิบาย:

  • 1↓⎕D: สตริงของตัวเลข ("0123456789") ลบองค์ประกอบแรก
  • ↑∘(1↓⎕D)¨⌽⍳8: เลือกอักขระ [8..1] ตัวแรก ('12345678', '1234567' ... )
  • : จัดรูปแบบเป็นเมทริกซ์ (เติมอักขระที่ไม่ได้ใช้ด้วยช่องว่าง)
  • k,⌽k←: เก็บในkและแสดงkตามด้วยการมิรเรอร์ตามแนวตั้งของk


4

Befunge - 3 x 18 = 54

ฉันรู้สึกว่าฉันต้องทำอะไรบางอย่างด้วยการบีบอัดมันนานเกินไปแล้วตั้งแต่ฉันใช้มันครั้งสุดท้าย ปัญหานี้รู้สึกว่าเหมาะสมที่สุดสำหรับภาษา

มันช้าอย่างน่ากลัวเนื่องจากการวนรอบการพิมพ์ที่ใช้เวลาประมาณ 8 การกระทำต่อตัวละคร

80v >#v"12345678"<
>5 *^ >,#$:_$:1-:v
^2< 0p0+7\*48\_@#<

4

JavaScript, 71

s='1234567887654321',i=10;while(--i)console.log(s=s.split(i).join(' '))

s="1234567887654321";for(i=10;--i;)console.log(s=s.split(i).join(" "))สำหรับ 70 ตัวอักษร @SteveWorley
WallyWest


3

Python 2, 75 62

มันจะไม่ชนะคำตอบของความผันผวน แต่นี่เป็นอีกวิธีการหนึ่งโดยใช้สตริงที่ไม่แน่นอนของ python ( bytearray):

s=bytearray('1234567887654321')
for i in range(8):s[8-i:8+i]=i*'  ';print s

แก้ไข

ฉันพบรุ่นที่สั้นกว่าโดยใช้str.replace:

s='1234567887654321'
for c in s[8:]:print s;s=s.replace(c,' ')

3

Perl, 41

บวก-Eสวิตช์ อักขระทั้งหมดบนบรรทัดคำสั่ง: 50

ต้องการอย่างน้อย perl5, เวอร์ชัน 10

perl -E'say@!=1..8-$_,$"x(2*$_),reverse@!for-0..7'

ฉันจะบอกว่านี่คือ 42 เนื่องจากความจริงที่ว่ามาตรฐานดู-Eเป็นหนึ่งไบต์นอกจากนี้ในโปรแกรม
Timtech

3

Mathematica 92 85 67 54 51

วิธีที่ # 1 : (54 ตัวอักษร) ทำให้อาร์เรย์ใช้แถว #, col # และระยะทางจากขอบซ้ายขวา

Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]

วิธีที่ # 2 : (67 chars) ช่วงที่สั้นลงเรื่อย ๆ

Print@@@Table[Join[k = PadRight[Range@i, 8, " "], Reverse@k], {i, 8, 1, -1}];

วิธีที่ # 3 : (85 ตัวอักษร) เลือกแต่ละแถวของอาร์เรย์

เริ่มต้นด้วยรายการอักขระเว้นวรรค 8 ตัว แทนที่ตำแหน่งที่ 1 และ 16 ด้วย "1"; แทนที่ "2" ที่ตำแหน่ง 2 และ 15 เป็นต้น

p = 0; q = 16;
Print @@@Reverse@Rest@NestList[ReplacePart[#, {++p -> p, q-- -> p}]&,Array[" "&,q], 8];

วิธีที่ # 4 : (86 ตัวอักษร) เลือกว่างในแต่ละแถวของอาร์เรย์

p=8;q=9;
Print@@@NestList[ReplacePart[#,{p---> " ",q++-> " "}]&,Join[k=Range@8,Reverse@k],7];

วิธีที่ # 5 : การใช้สตริง (92 ตัวอักษร)

p=8;s="12345678";
Print[#,StringReverse@#]&/@NestList[StringReplace[#,ToString@p-- ->  " "]&,s,7];

อันใหม่นั้นลื่น! ฉันจะ +1 อีกถ้าทำได้ :-) btw คุณสามารถเลื่อน()และแทนที่#1ด้วย#:Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]
Mr.Wizard

ขอบคุณสำหรับเคล็ดลับ ใช่Arrayบางครั้งสามารถสร้างตารางที่ดีโดยไม่ต้องเพิ่มตัววนซ้ำ
DavidC

3

PHP, 68

(ได้แรงบันดาลใจจากคำตอบของ HamZa)

for($n=8;$n;$r[]=$n--)echo str_replace($r," ","1234567887654321\n");

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

ตัวอย่างของรหัสที่ใช้งานอยู่: http://ideone.com/9wVr0X


hehe nice +1
HamZa

ดูเหมือนจะไม่ใส่จำนวนช่องว่างที่ถูกต้องตรงกลาง
nathan hayfield

@nathanhayfield: เป็นอย่างไร บรรทัดแรกมี 0 ช่องว่างบรรทัดที่สองมี 2 จากนั้น 4, 6, 8 และอื่น ๆ
Mr. Llama

ไม่ใช่เมื่อฉันวิ่งบนwritecodeonline.com/php
nathan hayfield

นั่นเป็นเพราะการส่งออกไม่ได้ห่อใน<pre>แท็ก เมื่อตีความว่าเป็นข้อความ HTML ช่องว่างจะถูกยุบและบรรทัดใหม่จะถูกละเว้น แต่ถ้าคุณตรวจสอบแหล่งที่มาคุณจะเห็นเป็นอย่างอื่น
Mr. Llama

3

Marbelous 165

@0
08
>0
LN
--
@0
:LN
}0}0}0}0
..SAPSSD0A
{0
:PS
}0
~~09
..//
<<@0
\\>0
&0//
--@1
@020
&0/\&0
@1
:SA
@0
}0
>0!!
--00@1
@0++//
+O/\@1
+O
:SD
}0@0
\\>0\/
--/\+O
@0..+O

pseudocode:

MB():
    for x in 8..1:
        LN(x)
LN(x):
    SA(x)
    PS(x)
    SD(x)
    print "\n"
PS(x):
    print " "*(8-x)*2
SA(x):
    for n in 1..x:
        print n
SD(x):
    for n in x..1:
        print n



2

K, 28

-1_a,'|:'a:8$'{-1_x}\,/$1+!8

.

k)-1_a,'|:'a:8$'{-1_x}\,/$1+!8
"1234567887654321"
"1234567  7654321"
"123456    654321"
"12345      54321"
"1234        4321"
"123          321"
"12            21"
"1              1"

คุณสามารถพูดคุยทั่วไปสำหรับ 36: {-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x}

k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 5
"1234554321"
"1234  4321"
"123    321"
"12      21"
"1        1"
q)k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 15
"123456789101112131415514131211101987654321"
"12345678910111213141  14131211101987654321"
"1234567891011121314    4131211101987654321"
"123456789101112131      131211101987654321"
"12345678910111213        31211101987654321"
"1234567891011121          1211101987654321"
"123456789101112            211101987654321"
"12345678910111              11101987654321"
"1234567891011                1101987654321"
"123456789101                  101987654321"
"12345678910                    01987654321"
"1234567891                      1987654321"
"123456789                        987654321"
"12345678                          87654321"
"1234567                            7654321"
"123456                              654321"
"12345                                54321"
"1234                                  4321"
"123                                    321"
"12                                      21"
"1                                        1"

2

Javascript, 67 ตัวอักษร

ได้รับคำตอบโดย steveworley (ฉันจะแสดงความคิดเห็นหากฉันสามารถทำได้):

ข้อมูลโค้ด

a='1234567887654321\n',b='',c=10;while(--c)b+=a=a.split(c).join(' ')
<a href="#" onclick="javascript:document.getElementById('output').innerHTML = b;">Display</a>
<pre id="output">...</pre>

การปรากฏตัวของ newline สุดท้ายไม่เป็นไปตามกฎ

ปรับปรุง: ตัด 2 ตัวอักษรโดยการลบวงเล็บ (ลำดับความสำคัญของผู้ให้บริการ) และ 1 โดยการลบพื้นที่ที่ไม่จำเป็นออก

ดูเหมือนว่ามันเป็นการหลอกหลอนฉันเพราะไม่ว่าฉันจะพยายามย่อหรือลดความซับซ้อนของวิธีต่าง ๆ โดยการถอดรหัสฮาร์ดโค้ดส่วนความยาวยังคงเหมือนเดิมจนกว่าฉันจะอนุญาตให้ใช้กฎ "ฉันคิดว่าจำนวนนี้" ด้านล่าง

(หากการพิมพ์นับเป็นสิ่งที่กลับมาเมื่อดำเนินการในคอนโซลโครเมี่ยม)


ดูเหมือนว่าคำตอบอื่น ๆ ตัวเลขจะไม่จัดเรียงในคอลัมน์ด้านขวา
อัล

@AL ไม่จำเป็นต้องมีการแจ้งเตือนหากคุณอ่านสิ่งที่ออกมาจาก consonle btw
Sophiα2329

ในการจัดแนวคอลัมน์ด้านขวาควรมี 1 ช่องว่างแทน 2 ในอาร์กิวเมนต์สตริงของการรวม ด้วยการเว้นวรรค 2 ช่องจึงจัดตำแหน่งให้ถูกต้องในการแจ้งเตือนเบราว์เซอร์ที่ใช้ Chrome
Qwertiy

ฉันอัปเดตโพสต์ของคุณ (ควรยอมรับการแก้ไข) เพื่อแสดงผลลัพธ์เป็นข้อมูลโค้ดโดยไม่มีการแจ้งเตือน JS ต้องใช้พื้นที่เพียงช่องเดียวในกรณีนี้
อัล

2

Brainfuck: 542 ไบต์

-[----->+<]>--.+.+.+.+.+.+.+..-.-.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.+.+.+[-->+<]>++++..----[->++<]>-.-.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.+.[-->+<]>+++++....-----[->++<]>.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.--[--->++<]>--......-----[->++<]>-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.-[--->++<]>--........++[-->+++<]>+.-.-.-.>++++++++++.[->+++++
<]>-.+.+.[--->++<]>--..........++[-->+++<]>.-.-.>++++++++++.[->+++++
<]>-.+.--[--->++<]>............[-->+++<]>++.-.>++++++++++.[->+++++
<]>-.-[--->++<]>..............[-->+++<]>+.

1

Mathematica , 59

61 ใช้ความคิดของฉัน:

Grid[Clip[#~Join~Reverse@#&@Range@8,{1,9-#},{," "}]&~Array~8]

หรือ 59 ยืมมาจากคำตอบของเดวิด:

Grid@Array[Join[k=PadRight[Range[9-#],8," "],Reverse@k]&,8]

ฉันเพิ่งบันทึก 4 ตัวอักษรโดยใช้ Grid แรงบันดาลใจจากรายการของคุณ
DavidC


1

Haskell, 84

จุดเริ่มต้นสำหรับบางคนในการปรับปรุง:

mapM_ putStrLn[let l=take(8-i)"12345678"++replicate i ' 'in l++reverse l|i<-[0..7]]

ส่วนที่เป็นไปได้มากที่สุดคือการทำให้l++reverse lจุดนั้นเป็นอิสระช่วยให้เรากำจัดสถานะlet- แต่ฉันจะหาได้apซึ่งต้องมีการนำเข้า


1

PostScript: 105 ตัวอักษร

การจัดการสตริงไม่ใช่เรื่องง่ายใน PS แต่สามารถสร้างรหัสที่ค่อนข้างง่ายได้

0 1 7{(1234567887654321)dup
8 3 index sub(              )0 6 -1 roll 2 mul getinterval putinterval =}for

เวอร์ชันที่ยาวกว่าเล็กน้อยที่ 120 chars แต่สามารถสร้าง arches ตัวเลขที่แตกต่างกันโดยแทนที่ 8 ที่จุดเริ่มต้นของบรรทัดที่สองด้วยหมายเลขใด ๆ ในช่วง 1 ถึง 9:

/D{dup}def/R{repeat}def/P{=print}def
8 D -1 1{1 1 index{D P 1 add}R pop 2 copy sub{(  )P}R D{D P 1 sub}R pop()=}for pop

ยินดีที่ได้เห็นว่าฉันไม่ใช่คนเดียวที่รัก PostScript ที่นั่น
AJMansfield


1

K 20

{x,'|:'x:|x$,\$1+!x}    

q)k){x,'|:'x:|x$,\$1+!x}8    
"1234567887654321"    
"1234567  7654321"    
"123456    654321"    
"12345      54321"    
"1234        4321"      
"123          321"    
"12            21"    
"1              1"    

1

TSQL, 148

แก้ไข: ลงไปที่ 148 ด้วยคำแนะนำของ manatwork และปรับแต่งเป็น ORDER BY

อ่านได้:

WITH t AS(
    SELECT 1n, CAST(1 AS VARCHAR(MAX)) o
 UNION ALL
    SELECT n+1,o+CHAR(n+49)
    FROM t
    WHERE n<8
)
SELECT o  + SPACE(16-2*n) + REVERSE(o)
FROM t
ORDER BY 1 DESC

แข็งแรงเล่นกอล์ฟ:

WITH t AS(SELECT 1n,CAST(1AS VARCHAR(MAX))o UNION ALL SELECT 1+n,o+CHAR(n+49)FROM t WHERE n<8)SELECT o+SPACE(16-2*n)+REVERSE(o)FROM t ORDER BY 1DESC

เอาท์พุท:

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

1
ทำได้ดีนี่. แต่คุณช่วยกรุณาโพสต์มันในรูปแบบที่คุณนับได้ถึง 153 ตัวอักษรด้วยหรือไม่ อย่างไรก็ตามคุณสามารถสำรอง 2 ตัวอักษรโดยใช้ตัวเลข1แทนสตริง'1'ทันทีที่คุณลงในcast varcharนี้ทำให้ผม 149 with t as(select 1n,cast(1as varchar(max))o union all select n+1,o+char(n+49)from t where n<8)select o+space(16-2*n)+reverse(o)from t order by o descตัวอักษร:
จัดการ

@ การผลิต: ฉันไม่สามารถทำซ้ำหมายเลข 153 ได้เพราะฉันลดลงเรื่อย ๆ ใช้คำแนะนำของคุณแม้ว่า ขอบคุณ!
comfortablydrei

1

Haskell, 79

r n x|x>n=' '|True=x
t="87654321"
main=mapM(putStrLn.(`map`("12345678"++t)).r)t

สิ่งนี้ทำงานโดยการแทนที่อักขระ> n ด้วย' 'โดยที่อักขระ n มาจาก "87654321" (ซึ่งเกิดขึ้นเป็นหางของสตริงเพื่อดำเนินการทดแทน)


1

PHP: 61 ตัวอักษร (หรือ 60 ตัวอักษรหากคุณแทนที่ \ n ด้วยบรรทัดใหม่ ASCII จริง)

(ได้แรงบันดาลใจจากคำตอบของ GigaWatt และ HamZa)

for($n=9;$n;$r[$n--]=" ")echo strtr("1234567887654321\n",$r);

http://ideone.com/FV1NXu


1

PowerShell: 38

รหัส Golfed

8..1|%{-join(1..$_+"  "*(8-$_)+$_..1)}

เกมส์

8..1|%{... }ไปป์จำนวนเต็มตั้งแต่ 8 ถึง 1 ไปยังวน ForEach-Object
-join(... )รวมเอาท์พุทของรหัสที่ซ้อนกันในสตริงเดียวโดยไม่มีตัวคั่น
1..$_เอาต์พุตจำนวนเต็มเรียงจาก 1 ถึงจำนวนเต็มปัจจุบันในลูป
+" "*(8-$_)เพิ่มช่องว่างสองครั้งคูณด้วยความแตกต่างระหว่าง 8 และจำนวนเต็มปัจจุบันไปยังเอาท์พุท
+$_..1เพิ่มจำนวนเต็มจากมากไปที่ 1 ถึงเอาต์พุต


1

Javascript กับ lambdas, 147

(s="12345678")[r="replace"](/./g,i=>s[r](RegExp(".{"+(i-1)+"}$"),Array(i*2-1).join(" ")))[r](/\d{1,8} */g,m=>m+(Array(m%10+1).join(m%10+1)-m)+"\n")

สามารถตรวจสอบได้ใน Firefox



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