Unzip beberapa angka

21

Tugas Anda adalah membuat program atau fungsi yang menghasilkan ritsleting dengan panjang 10 baris. Setiap garis ritsleting diwakili oleh dua garis --:

--
--
--
--
--
--
--
--
--
--

Program / fungsi akan mengambil persentase (dapat dibagi 10) sebagai input, dan output akan menjadi ritsleting "terbuka ritsleting" (dipisahkan garis) dari persentase dengan persentase, mengungkapkan 1-diindeks, level terendah diulang 2 kali, dengan semua level sebelumnya diulang 4, 6, 8, ... dll. kali, sambil menjaga bagian bawah ritsleting terpusat.

Contohnya

>>10%
-11-
 --
 --
 --
 --
 --
 --
 --
 --
 --

>>50%
-1111111111-
 -22222222-
  -333333-
   -4444-
    -55-
     --
     --
     --
     --
     --

>>100%
-11111111111111111111-
 -222222222222222222-
  -3333333333333333-
   -44444444444444-
    -555555555555-
     -6666666666-
      -77777777-
       -888888-
        -9999-
         -10-

Input (persentase) dapat diformat sesuka Anda (50%, .5, 50, 5 [nol tersirat], dll.), Dan akan selalu berada dalam kisaran 0 hingga 100 dan habis dibagi 10. Jarak dalam contoh harus dipertahankan dalam output Anda.

ahli atlasologi
sumber
Mungkin inputnya pernah ada 0%? Apakah kami diizinkan mengambil input dibagi 10? misalnya bukannya 50%, dapatkan 5?
DJMcMayhem
1
Input (persentase) dapat diformat sesuka Anda (50%, .5, 50), Bisakah itu adil 5?
Luis Mendo
@DrGreenEggsandIronMan input dapat 0%, dan Anda dapat mengambil input dalam format yang paling nyaman.
atlasologist
@LuisMendo, ya, saya akan mengeditnya menjadi pertanyaan, terima kasih.
atlasologist
Apakah garis terdepan alih-alih yang tertinggal diterima? Apakah lapisan absolut diterima?
Titus

Jawaban:

10

Python 2 - 184 151 146 Bytes

def r(n):
  n/=10
  for i in range(1,11):
    if n<0:print"%s--"%p
    elif i>9:print" %s-10-"%p
    else:p=" "*~-i;print"%s-%s-"%(p,`i`*2*n);n-=1

Nomor terakhir agak kacau dengan saya. Saya mungkin bisa menghapus pernyataan if kedua jika saya melihatnya nanti.

EDIT: Thx to mbomb007 untuk menghapus 3 byte. Terima kasih kepada charredgrass untuk kiat pemformatan untuk membantu menghapus banyak dan banyak byte! :-D Terima kasih kepada TheBikingViking untuk membantu dengan dua byte lagi!

Jeremy
sumber
1
Gunakan i>9sebagai ganti i==10dan hapus spasi di range(1, 11).
mbomb007
1
Tip kecil untuk bermain golf dengan python: Anda mengurangi banyak byte dari spasi dengan mengompresi pernyataan Anda menjadi satu baris. Misalnya 3 baris terakhir bisa menjadi p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1.
charredgrass
terima kasih! Itu sangat membantu dengan yang ini dan saya pasti akan mengingatnya dalam bermain golf di masa depan
Jeremy
1
Anda dapat memotong 2 byte dengan mengganti (i-1)di baris terakhir dengan ~-i. Ini mengambil keuntungan dari prioritas operator dan fakta bahwa sedikit membalik diikuti oleh negasi sama dengan mengurangi 1.
TheBikingViking
Apa gunanya menggunakan range(1,11)lalu (i-1)?
Leaky Nun
10

Python 2, 74 byte

n=input()
x=0
exec"print' '*x+'-'+`x+1`*(n-x<<1-x/9)+'-';x=min(x+1,n);"*10

Disimpan dua byte dengan exec-mengulangi loop, terima kasih kepada Dennis.

EDIT: Saya mengambil pendekatan yang sedikit berbeda dan menyimpan dua byte lagi.

Lynn
sumber
1
Anda dapat menyimpan 2 bytes menggunakan tali format dengan mengganti '-'+`x+1`*(n-x<<1-x/9)+'-'di execlingkaran dengan '-%s-'%`x+1`*(n-x<<1-x/9).
R. Kap
Tidak, aku butuh orangtua di sini `x+1`*(n-x<<1-x/9).
Lynn
4

PowerShell v2 +, 130 120 116 110 byte

param($n)$i=0;10..1|%{" "*$i+(("-"+("$($i+1)"*([math]::Max($n-10+$_,0))*2)),"-10")[$n-$_-eq9]+"-";$i+=$i-ne$n}

Sunting 1 - Dipotong 10 byte dengan menghilangkan $xvariabel dan sedikit mengulangi bagaimana string diformulasikan.
Sunting 2 - Memotong 4 byte lainnya dengan mengulangi bagaimana input terjadi dan dengan mengulangi bagaimana $idihitung setiap loop.
Sunting 3 - Disimpan 6 byte oleh OP yang memungkinkan input sebagai0..10 , jadi tidak perlu dibagi 10.

Sangat sulit!

Mengambil input sebagai 1, 5, dll, disimpan dalam $n. Setel $ivariabel pembantu (salah satu waktu yang sangat jarang yang perlu diinisialisasi variabel ke 0dalam PowerShell), dan kemudian mulai loop dari 10ke 1.

Setiap iterasi, kami mengatur mulai string kami dengan jumlah ruang yang sama dengan $i, diikuti oleh pseudo-ternary (... , ...)[]. Di dalam pseudo-ternary, kami memilih string -dengan jumlah digit (lebih tinggi $n-10+$_atau 0, dikalikan dengan 2), atau string -10- pemilihan didasarkan pada apakah kita berada pada iterasi ke-10 dan input kami adalah 100. Kami menggabungkannya dengan final -. String yang dihasilkan ditempatkan ke pipa.

Akhirnya, kami bertambah $i, dan ini benar-benar rumit. Kami akhirnya menggunakan trik binary-cast-to-int untuk hanya meningkatkan $isampai mencapai $n, dan kemudian menjaganya pada nilai yang sama setelahnya. Ini memastikan kami telah mencapai "akhir" dari lekukan ritsleting pada tingkat yang sesuai.

Setelah loop selesai, string yang dihasilkan semuanya diakumulasikan pada pipeline dan outputnya implisit.

Contohnya

PS C:\Tools\Scripts\golfing> .\unzip-some-numbers.ps1 70
-11111111111111-
 -222222222222-
  -3333333333-
   -44444444-
    -555555-
     -6666-
      -77-
       --
       --
       --

PS C:\Tools\Scripts\golfing> .\unzip-some-numbers.ps1 100
-11111111111111111111-
 -222222222222222222-
  -3333333333333333-
   -44444444444444-
    -555555555555-
     -6666666666-
      -77777777-
       -888888-
        -9999-
         -10-
AdmBorkBork
sumber
3

Pyth, 37 34 byte

= h / QTjm + *; thS, dQj <* `d20eS, 0y-Qd" - "ST
= h / QTjm + *; thS, dQj * `d / y-Qdl`d" - "ST

Suite uji.

Biarawati Bocor
sumber
3

Python, 95 84 byte

Saya tidak menyadari lambda legal, terima kasih @R Green Eggs dan Iron Man

lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))
maniexx
sumber
1
Hai, jawaban pertama yang bagus! Anda dapat memindahkannya dari daftar pemahaman untuk menghemat 2 byte, joindapat mengambil generator secara langsung.
Morgan Thrapp
2
Anda dapat melakukan lambda alih-alih mencetak. Dengan saran Morgan: lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))(84 bytes)
DJMcMayhem
2

MATL , 48 41 35 byte

0:9"@GhX<Z"45h@QVG@-E@8>-OhX>Y"h45h

Cobalah online!

Luis Mendo
sumber
1

Ruby, 74 byte

Menggunakan format tersirat-nol yang ditentukan dalam pertanyaan, demikian 40%juga f[4]jika fungsi anonim ditugaskan f. Jika diperlukan persentase penuh, +6 byte untukn/=10;

Cobalah online!

->n{10.times{|i|puts' '*[i,n].min+"-#{i>8?10:(i+1).to_s*2*(n-i)if i<n}-"}}
Nilai Tinta
sumber
1

Python 3, 98, 90, 87 , 85 byte.

Membawa jumlah yang sudah dibagi 10. Saya mungkin bisa menghapus beberapa parens, tapi ini cukup tertutup untuk golf sepenuhnya.

lambda n:'\n'.join(' '*min(i,n)+'-%s-'%(str(i+1)*(n>i>8or(n-i)*2))for i in range(10))
Morgan Thrapp
sumber
1

Haskell, 83 byte

f n=unlines[[[1..y]>>" ",take(2*(n-y))$cycle$show$y+1]>>=(++"-")|y<-min n<$>[0..9]]
Lynn
sumber
Apa ++"-"?
someonewithpc
1

Javascript es7, 105 byte

A=>[...Array(10)].map((a,i)=>' '.repeat((d=A<i)?A:i)+('-'+(i+1+'').repeat(d?0:i<9?2*(A-i):1)+'-')).join`
`

telepon dengan

f=A=>[...Array(10)].map((a,i)=>' '.repeat((d=A<i)?A:i)+('-'+(i+1+'').repeat(d?0:i<9?2*(A-i):1)+'-')).join`
`


f(10)
f(5)
f(0)
Charlie Wynn
sumber
The program/function ...- bukan cuplikan
Titus
1
Jika Anda mengganti \ndengan baris baru yang sebenarnya, Anda dapat menyimpan satu byte.
Mama Fun Roll
1
@Itus Apa yang kamu bicarakan? "Cuplikan" ini adalah sebuah fungsi.
NiCk Newman
1
ah benar ES7, saya lupa.
Titus
@MamaFunRoll saya punya itu, tetapi tidak bisa "" membungkus dan lakukan. Panjang jadi saya tidak 100% yakin saya berada di tempat yang jelas - saya akan menambahkannya :)
Charlie Wynn
1

Python 2.7, 113 108 77 byte

n = input ()
untuk rentang x (0,10):
v = str (x + 1) * (nx) 2
jika x
n> 89: v = '10 '
print' '* min (x, n) + '-' + v + '-'

Pertama kali bermain golf. Akan terus berjalan, cobalah untuk mendapatkannya <100.
Asumsikan input adalah 1-10.

Sunting: Menggunakan beberapa trik dari jawaban @LeakyNun (terima kasih), kemudian mengatasinya sedikit lebih jauh dan mendapatkan ... pada dasarnya jawaban yang sama: / Tidak tahu tentang konversi string `int`, dan 2 - boolean biarkan saya singkirkan pernyataan if, yang membiarkan saya menyingkirkan seluruh variabel v. Sangat keren.

Versi saya:

n=input()
for x in range(10):print' '*min(x,n)+'-'+`x+1`*(n-x)*(2-(x>8))+'-'
greyShift
sumber
Jawaban yang bagus, dan selamat datang di situs! Anda bisa melepas 9 byte dengan mengubah level indentasi menjadi 1 spasi, bukan 4.
DJMcMayhem
Sebenarnya, Anda bisa membuat ini lebih pendek dengan ini:n=input(); for x in range(0,10):print' '*min(x,n)+'-'+('10'if x*n>89 else str(x+1)*(n-x)*2)+'-'
DJMcMayhem
0

Python 2, 81 byte

n=input()/10
for i in range(10):print(' '*min(i,n)+'-'+2*(n-i)/-~(i>8)*`i+1`+'-')

Ide itu!

Biarawati Bocor
sumber
0

Python 2.7, 110 99 95 91 byte:

G=input();i=1;exec"print' '*[~-i,G][i>G]+'-%s-'%[`i`*(2*-~G-i*2),'10'][(i>9)*G>9];i+=1;"*10

Program lengkap yang mengambil input oleh integer dalam rentang inklusif [1,10], di mana 10sarana 100%dan 1sarana 10%. Mungkin bisa bermain golf lebih sedikit.

Cobalah secara Online! (Ideone)

R. Kap
sumber
0

PHP 5.3, 92 91 byte

<?for(;$i<10;$i++)echo'
'.str_pad('-'.str_repeat($i+1,$n>9&&$i>8?:($n-$i)*2).'-',22,' ',2);
  • untuk PHP 5.3 dengan register_globals=1dan short_open_tags=1(dan error_reporting=0)
    panggilan cli denganphp-cgi -f <filename> n=<number>
  • nomor dari 0 hingga 10

  • untuk memanggil browser web dengan <scriptpath>?n=<number>: prepend<pre>
  • untuk 4.0.1 <PHP <5.3: ganti ?:dengan?1: (+1)
  • untuk PHP> = 5.4: ganti yang pertama $ndengan ($n=$_GET[n])(+11)

ungolfed sebagai fungsi (PHP apa pun> = 4.0.1)

function unzip($n) // $n from 0 to 10
{
    for($i=0;$i<10;$i++)                // $i = line number -1
        $s.='
'.str_pad(                              // pad the result of the following on both sides
            '-'.                            // prepend '-'
            str_repeat($i+1,                // print line number
                ($n>9&&$i>8 ? 1             // in tenth line, if $n is 10: once
                : ($n-$i)*2)                    // else  2*($n-$i) times
            ).'-'                           // append '-'
            , 22,' ', STR_PAD_BOTH);    // pad to 22 width with SPC on both sides
    return $s;
}

test suite

echo'<table border=1><tr>';
for($i=0;$i<11;$i++)echo'<th>',$i*10,'%</th>';
echo'</tr><tr>';
for($i=0;$i<11;$i++)echo'<td><pre>', unzip($i), '</pre></td>';
echo '</table>';

Sekarang ini baru bagi saya: PHP mengalahkan JavaScript.
Pendekatan ini golf ke min, saya pikir.

Titus
sumber
STR_PAD_BOTHApa ini, K&R C? Apakah kita #definejuga menggunakan PHP? :-)
cat
@ kucing: ya, ada definisi nyata dalam PHP. tetapi hanya statis; tidak suka di C.
Titus
0

Julia, 73 byte

x->join([" "^min(x,a)*"-$("$(a+1)"^(x>a?a>8?1:2(x-a):0))-"for a=0:9],'
')

Julia pertama menjawab! Kiat dihargai.

Cobalah online!

Mama Fun Roll
sumber
oh benar lol: P
Mama Fun Roll
0

Perl, 122 byte

$k=<>;for(my $i=0;$i++<10;){$s="-"."$i"x($k/10-$i+1);$p=length $s;$l=$l>$p?$l:$p;printf "%${l}s%s\n",$s,scalar reverse $s}
seseorang dengan pc
sumber
0

Gangguan Umum (Lispworks), 314 byte

(defun f()(let((s(string(read))))(let((n(/(parse-integer(subseq s 0(1-(length s))))10)))(if(> n 0)(progn(dotimes(r n)(progn(dotimes(c r)#1=(format t" "))(format t"-")(if(=(1+ r)10)(format t"10")(dotimes(j(* 2(- n r)))(format t"~S"(1+ r))))(format t"-~%")))(dotimes(d(- 10 n))(dotimes(c n)#1#)(format t"--~%")))))))

tidak dicetak:

    (defun f ()
      (let ((s (string (read))))
        (let ((n (/ (parse-integer (subseq s 0 (1- (length s)))) 10)))
          (if (> n 0)
              (progn
                (dotimes (r n)
                  (progn
                    (dotimes (c r)
                      (format t " "))
                    (format t "-")
                    (if (= (1+ r) 10)
                        (format t "10")
                      (dotimes (j (* 2 (- n r)))
                        (format t "~S" (1+ r))))
                    (format t "-~%")))
                (dotimes (d (- 10 n))
                  (dotimes (c n)
                    (format t " "))
                  (format t "--~%")))))))

Pemakaian:

    CL-USER 2515 > (f)
    10%
    -11-
     --
     --
     --
     --
     --
     --
     --
     --
     --
    NIL

    CL-USER 2516 > (f)
    50%
    -1111111111-
     -22222222-
      -333333-
       -4444-
        -55-
         --
         --
         --
         --
         --
    NIL

    CL-USER 2517 > (f)
    100%
    -11111111111111111111-
     -222222222222222222-
      -3333333333333333-
       -44444444444444-
        -555555555555-
         -6666666666-
          -77777777-
           -888888-
            -9999-
             -10-
    NIL
sadfaf
sumber
0

APL, 46 byte

{↑(⍳10){(''↑⍨1-⍺⌊a+1),1⌽'--',⍵⍴⍕⍺}¨10↑2×⌽⍳a←⍵}

Argumen harus diberikan sebagai persentase dibagi dengan 10 (yaitu: bilangan bulat sederhana, dalam kisaran [0,10]).

lstefano
sumber