Cetak lengkungan angka naik / turun

28

Saya pikir "lengkungan" adalah cara terbaik untuk menggambarkan pola angka ini:

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

Didefinisikan secara formal, setiap baris terdiri dari angka 1 hingga 9-n, (n-1)*2spasi, dan angka 9-nsampai 1 (di mana ngaris saat ini).

Tugas Anda adalah menulis, menggunakan kode sesingkat mungkin, skrip / program kecil yang mencetak pola di atas dengan batasan sebagai berikut:

  1. Anda tidak boleh membuat hardcode seluruh pola. Anda hanya dapat membuat hardcode satu baris dari pola paling banyak.
  2. Program Anda harus mencetak baris baru (kombinasi dari \natau \r) di akhir setiap baris.

Siap ... siap .... siap!

Nathan Osman
sumber
1
Trik kecil tambahan akan tersedia dengan garis atas 123456787654321sama dengan 11111111^2 ;-)
Egor Skriptunoff
3
@EgorSkriptunoff 11111111^2 == 123465787654321 != 1234567887654321(perhatikan yang diulang 8)
Bob
Ini adalah semacam kebalikan dari Cetak berlian ini
Peter Taylor
6
Itu terlihat seperti tirai .
Volatilitas

Jawaban:

22

Python 2, 65 55 53 51

s=12345678
while s:r='%-8d'%s;print r+r[::-1];s/=10

Dipersingkat menggunakan beberapa ide ugoren .

Keriangan
sumber
Heh, saya tahu ada ruang untuk perbaikan: P
Nathan Osman
2
Anda dapat menyimpan banyak s=s[1:]per loop danwhile s:
ugoren
11

GolfScript (25 karakter)

8,{.~10,<1>\' '*.2$-1%n}/
Peter Taylor
sumber
9

APL (18)

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

Penjelasan:

  • 1↓⎕D: string digit ("0123456789") minus elemen pertamanya
  • ↑∘(1↓⎕D)¨⌽⍳8: pilih karakter [8..1] pertama ('12345678', '1234567' ...)
  • : format sebagai matriks (mengisi karakter yang tidak digunakan dengan kosong)
  • k,⌽k←: simpan di k, dan tampilan kdiikuti oleh mirroring vertikalk
marinus
sumber
4

Ruby: 61 50 karakter

s="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}

Contoh dijalankan:

bash-4.2$ ruby -e 's="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}'
1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1
manatwork
sumber
4

Jalanan - 3 x 18 = 54

Saya merasa harus melakukan sesuatu dengan befunge, sudah terlalu lama sejak saya menggunakannya terakhir kali. Masalah ini terasa paling tepat untuk bahasa.

Sangat lambat karena loop cetak yang membutuhkan sekitar 8 tindakan per karakter (gaya penghitungan berbeda).

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

JavaScript, 71

s='1234567887654321',i=10;while(--i)console.log(s=s.split(i).join(' '))
steveworley
sumber
s="1234567887654321";for(i=10;--i;)console.log(s=s.split(i).join(" "))untuk 70 karakter, @SteveWorley
WallyWest
3

C, 83 karakter

main(a,b,n){
    for(a=12345678,n=1e8,b=n-a-1;a;a/=10)
        printf("%-8d%8d\n",a,b),
        b%=n/=10;
}
ugoren
sumber
3

Python 2, 75 62

Itu tidak akan mengalahkan jawaban Volatilitas, tapi inilah pendekatan lain menggunakan string python yang dapat berubah ( bytearray):

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

Edit

Saya menemukan versi yang lebih pendek, menggunakan str.replace:

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

Perl, 41

ditambah -Esaklar. Total karakter pada baris perintah: 50

membutuhkan setidaknya perl5, versi 10.

perl -E'say@!=1..8-$_,$"x(2*$_),reverse@!for-0..7'
amon
sumber
Saya akan mengatakan ini adalah 42, karena fakta bahwa tampilan standar -Eadalah penambahan satu byte pada program.
Timtech
3

Mathematica 92 85 67 54 51

Metode # 1 : (54 karakter) Membuat array menggunakan baris #, col #, dan jarak dari tepi kiri-kanan.

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

Metode # 2 : (67 karakter) Pad rentang yang selalu memperpendek.

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

Metode # 3 : (85 karakter) Selektif mengisi setiap baris array.

Mulailah dengan daftar 8 karakter spasi. Ganti posisi 1 dan 16 dengan "1"; ganti "2" di posisi 2 dan 15, dll.

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

Metode # 4 : (86 karakter) Selektif mengosongkan setiap baris array.

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

Metode # 5 : Menggunakan string (92 karakter)

p=8;s="12345678";
Print[#,StringReverse@#]&/@NestList[StringReplace[#,ToString@p-- ->  " "]&,s,7];
DavidC
sumber
Yang baru itu apik! Saya akan memberi +1 lagi jika saya bisa. :-) btw, Anda dapat menjatuhkannya (), dan ganti #1dengan #:Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]
Mr.Wizard
Terima kasih atas tipsnya. Ya, Arrayterkadang dapat membuat tabel yang bagus tanpa harus menambahkan iterator.
DavidC
3

PHP, 68

(Terinspirasi oleh jawaban Hamza)

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

Dimainkan pada kenyataan bahwa str_replace PHP dapat menerima array untuk pencarian dan string untuk diganti, itu akan mengganti setiap item dalam array dengan string yang diberikan. Setelah setiap iterasi, angka saat ini ditambahkan ke array pencarian, menghapusnya dari loop berikutnya.

Contoh kode dalam aksi: http://ideone.com/9wVr0X

Tuan Llama
sumber
hehe nice +1
HamZa
tampaknya tidak menempatkan jumlah ruang yang tepat di tengah
nathan hayfield
@nathanhayfield: Bagaimana bisa begitu? Baris pertama memiliki 0 spasi, kedua memiliki 2, kemudian 4, 6, 8, dll.
Bpk. Llama
tidak ketika saya menjalankannya di writecodeonline.com/php
nathan hayfield
Itu karena output tidak dibungkus dengan <pre>tag. Ketika ditafsirkan sebagai teks html, spasi diciutkan dan baris baru diabaikan, tetapi jika Anda memeriksa sumbernya, Anda akan melihat sebaliknya.
Bpk. 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

Kodesemu:

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
Sparr
sumber
2

Python 2.x - 73 65 63 61 karakter

c=1;s='87654321'
while c<9:print s[::-1]+s;s=' '*c+s[c:];c+=1
TerryA
sumber
2

PHP, 76

for($i=9;$i>1;){$r[]=$i--;echo str_replace($r,' ','1234567887654321')."\r";}
Hamza
sumber
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"

Anda dapat menggeneralisasi untuk 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"
tmartin
sumber
2

Javascript, 67 karakter

Terlambat oleh jawaban steveworley (saya akan berkomentar jika saya bisa):

Cuplikan kode

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>

Kehadiran baris baru terakhir memang mengikuti aturan.

perbarui: potong 2 karakter dengan menghapus tanda kurung (prioritas operator) dan 1 dengan menghapus ruang yang tidak dibutuhkan

Sepertinya itu mengganggu saya, karena tidak peduli berapa banyak cara berbeda saya mencoba untuk mempersingkat atau menyederhanakan dengan menghapus hardcoding segmen kode, panjangnya tetap sama sampai saya membiarkan aturan "Saya pikir ini penting" yang tertulis di bawah ini berlaku.

(Jika pencetakan dianggap sebagai apa yang muncul kembali ketika ini dijalankan di konsol chrome)

Sophiα2329
sumber
Itu tidak terlihat seperti jawaban yang lain, angkanya tidak selaras di kolom kanan.
AL
@AL Peringatan tidak perlu jika Anda membaca output apa yang keluar dari btw konsonan.
Sophiα2329
Untuk menyelaraskan kolom kanan, harus ada 1 spasi alih-alih 2 dalam argumen string bergabung. Dengan 2 spasi, ini benar selaras dalam peringatan browser berbasis chrome.
Qwertiy
Saya memperbarui posting Anda (hasil edit harus diterima) untuk menampilkan hasilnya dalam cuplikan tanpa peringatan JS, hanya diperlukan satu ruang dalam hal ini.
AL
2

Brainfuck: 542 Bytes

-[----->+<]>--.+.+.+.+.+.+.+..-.-.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.+.+.+[-->+<]>++++..----[->++<]>-.-.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.+.[-->+<]>+++++....-----[->++<]>.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.--[--->++<]>--......-----[->++<]>-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.-[--->++<]>--........++[-->+++<]>+.-.-.-.>++++++++++.[->+++++
<]>-.+.+.[--->++<]>--..........++[-->+++<]>.-.-.>++++++++++.[->+++++
<]>-.+.--[--->++<]>............[-->+++<]>++.-.>++++++++++.[->+++++
<]>-.-[--->++<]>..............[-->+++<]>+.
NaCl
sumber
1

Mathematica , 59

61 menggunakan ide saya sendiri:

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

Atau 59, meminjam dari jawaban David:

Grid@Array[Join[k=PadRight[Range[9-#],8," "],Reverse@k]&,8]
Tuan Wisaya
sumber
Saya baru saja menyimpan 4 karakter dengan menggunakan Grid, terinspirasi oleh entri Anda.
DavidC
1

R: 52

for(i in 8:1)cat(1:i,rep(" ",16-2*i),i:1,"\n",sep="")
flodel
sumber
1

Haskell, 84

Titik awal bagi seseorang untuk meningkat:

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

Kemungkinan besar bagiannya adalah untuk membuat l++reverse ltitik bebas, membiarkan kita menyingkirkan letpernyataan, tapi aku akan menemukan itu ap, yang membutuhkan impor.

shiona
sumber
1

PostScript: 105 karakter

Penanganan string tidak mudah dalam PS tetapi dapat membuat kode yang relatif sederhana:

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

Versi yang sedikit lebih panjang di 120 karakter tetapi dapat menghasilkan lengkungan angka yang berbeda dengan mengganti 8 di awal baris kedua dengan angka apa pun di kisaran 1 hingga 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
MrMRDubya
sumber
Sangat menyenangkan untuk melihat bahwa saya bukan satu-satunya yang suka PostScript di luar sana.
AJMansfield
1

GoRuby 2.1

36 karakter

8.w(1){|x|a=[*1..x].j.lj 8;s a+a.rv}

Tidak disatukan

8.downto(1) do |x|
  a = [*1..x].join.ljust(8)
  puts a + a.reverse
end
Patrick Oscity
sumber
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"    
ppp
sumber
1

TSQL, 148

Sunting: turun ke 148 dengan saran manatwork dan mengubah ke ORDER BY.

Dapat dibaca:

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

Golf:

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

Keluaran:

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1
nyaman
sumber
1
Bagus Tapi bisakah Anda mempostingnya juga dalam format di mana Anda menghitung 153 karakter? Bagaimanapun, Anda dapat menyimpan 2 karakter dengan menggunakan angka 1alih-alih string di '1'mana Anda langsung castmemasukkannya varchar. Ini memberi saya 149 karakter: 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.
manatwork
@Manatwork: Saya tidak bisa mereproduksi nomor 153, karena saya terus semakin rendah. Namun, terapkan saran Anda. Terima kasih!
comfortablydrei
1

Haskell, 79

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

Ini berfungsi dengan mengganti karakter> n dengan ' ', di mana karakter n bersumber dari "87654321" (yang merupakan ekor dari string untuk melakukan substitusi aktif).

Joey Adams
sumber
1

PHP: 61 karakter (atau 60 karakter jika Anda mengganti \ n dengan baris ASCII yang sebenarnya)

(Terinspirasi oleh jawaban GigaWatt dan HamZa)

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

http://ideone.com/FV1NXu

bwoebi
sumber
1

PowerShell: 38

Kode golf

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

Panduan

8..1|%{... }integer pipa dari 8 ke 1 ke dalam loop ForEach-Object.
-join(... )bergabung dengan output dari kode bersarang menjadi string tunggal tanpa pembatas.
1..$_output bilangan bulat naik dari 1 ke bilangan bulat saat ini dalam loop.
+" "*(8-$_)menambahkan spasi ganda, dikalikan dengan perbedaan antara 8 dan integer saat ini, ke output.
+$_..1menambahkan integer, turun dari integer saat ini ke 1, ke output.

Iszi
sumber
1

Javascript dengan 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")

Dapat diperiksa di Firefox.

Qwertiy
sumber
1

CJam, 22 karakter

Bukan jawaban yang valid (karena bahasa dikembangkan setelah pertanyaan), dan juga bukan yang terpendek, tetapi begini:

8,{S*_,9-~,:)\_2$W%N}%

Cobalah online di sini

Pengoptimal
sumber
0

Lua, 62

s='1234567887654321'for i=8,1,-1 do print(s)s=s:gsub(i,' ')end
Egor Skriptunoff
sumber