Bazı numaraları çıkart


21

Göreviniz, 10 satır uzunluğunda fermuar oluşturan bir program veya işlev oluşturmak. Fermuarın her satırı iki çizgi ile gösterilir --:

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

Program / fonksiyon giriş olarak bir yüzde alır (10 ile bölünebilir) ve çıkış fermuarlı bir fermuar olacaktır. önceki tüm seviyeler 4, 6, 8, ... vb. tekrar etti. fermuarın altını ortalanmış halde tutarken,

Örnekler

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

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

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

Girdi (yüzde), ancak istediğiniz şekilde biçimlendirilebilir (% 50, .5, 50, 5 [sıfır ima], vb.) Ve her zaman 0 - 100 aralığında olur ve 10 ile bölünebilir. çıktılarınızda örnekler korunmalıdır.


Girdi hiç olabilir 0%mi? Girdiyi 10'a bölünerek almamıza izin var mı? örneğin yerine 50%, olsun 5?
DJMcMayhem

1
Girdi (yüzde) ancak istediğiniz şekilde biçimlendirilebilir (% 50, .5, 50), Sadece olabilir 5mi?
Luis Mendo

@DrGreenEggsandIronMan girişi% 0 olabilir ve girişi en uygun biçimde alabilirsiniz.
atlasolog

@LuisMendo, evet, soruyu düzenleyeceğim, teşekkürler.
atlasolog

Sondaki satır yerine satır sonu kesilmesi kabul edilir mi? Mutlak doldurma kabul edilir mi?
Titus,

Yanıtlar:


10

Python 2 - 184 151 146 Bayt

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

Son numara bana biraz karışıklık verdi. Daha sonra bakarsam ikinci ifadeyi çıkartabilirim.

EDIT: 3 bayt kaldırmak için mbomb007 Thx. Biçimlendirme ipuçları için çok sayıda baytın kaldırılmasına yardımcı olan charredgrass için teşekkürler! :-D TheBikingViking'e, bir başka iki byte'a yardım ettiğin için teşekkürler!


1
i>9Bunun yerine kullanın i==10ve içindeki boşluğu kaldırın range(1, 11).
mbomb007

1
Python'da golf oynamak için küçük bir ipucu: ifadelerinizi tek bir satıra sıkıştırarak boşluktan çok fazla bayt ayırın. Örneğin, son 3 satır olabilir p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1.
charredgrass

Teşekkürler ! Bu, bu çok yardımcı olur ve kesinlikle gelecek golf akılda akılda tutacağım
Jeremy

1
(i-1)Son satırda değiştirerek 2 bayt tıraş edebilirsiniz ~-i. Bu, operatör önceliğinden yararlanır ve bir olumsuzlamanın ardından bit çevirmenin çıkarmasıyla aynı olması 1.
TheBikingViking

range(1,11)Ve ardından kullanmanın amacı nedir (i-1)?
Leaky Nun

10

Python 2,74 bayt

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

execDennis sayesinde iki bayttan tasarruf yaparak bir döngüyü kurtardım.

EDIT: Biraz farklı bir yaklaşım izledim ve iki bayt daha biriktirdim.


1
Sen değiştirerek biçimlendirme dizesi kullanarak 2 bayt kaydedebilirsiniz '-'+`x+1`*(n-x<<1-x/9)+'-'içinde execçemberinde '-%s-'%`x+1`*(n-x<<1-x/9).
R. Kap

Hayır, etrafta parens lazım `x+1`*(n-x<<1-x/9).
Lynn,

4

PowerShell v2 +, 130 120 116 110 bayt

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

Düzenleme 1 - $xDeğişkenleri ortadan kaldırarak ve dizenin formüle edilme şeklini hafifçe yineleyerek 10 baytlık Golf Sahası .
Düzenleme 2 - Girişin nasıl gerçekleştiğini yineleyerek ve $iher bir çevrimi nasıl hesapladığınızı yineleyerek 4 bayt daha golf oynadı .
Düzenleme 3 - OP girişi ile kaydedilmiş 6 bayt, girişi 0..1010'a bölmeye gerek yoktur.

Şaşırtıcı derecede zor!

Olarak girdi Alır 1, 5vb saklanır$n . Setler yardımcı $ideğişken (değişken başlatılması gerektiğini çok ender zamanlardan biri 0daha sonra PowerShell) ve bir döngü başlar 10için 1.

Her yinelemede, dizgemize eşit $i, ardından sahte-üçlü olan birkaç boşlukla başlıyoruz (... , ...)[]. Sözde üçlünün içinde, -birkaç rakamdan oluşan bir dize seçeriz .$n-10+$_ veya 02 ile çarpılır) bir dize ya da dize seçeriz -10- seçim, 10'uncu yinelemede olup olmadığımıza bağlıdır 100. Bunu bir finalle birleştiriyoruz -. Sonuçta elde edilen dize boru hattına yerleştirilir.

Sonunda, artış $i , ve bu gerçekten zor oldu. Sadece $iulaşana kadar arttırmak için bin-to-int bir hile kullanarak yaralandık $nve daha sonra aynı değerde tuttuk. Bu, fermuar girintisinin "sonuna" uygun düzeyde ulaşmamızı sağlar.

Döngü bittiğinde, sonuç dizelerinin tümü boru hattında birikir ve çıktısı örtüktür.

Örnekler

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-


3

Python, 95 84 bayt

Lambdaların yasal olduğunu bilmiyordum, teşekkürler @ Dr Green Eggs ve Iron Man

lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))

1
Hey, ilk cevap harika! 2 bayttan tasarruf etmek için onu bir listeden joinçıkartabilirsiniz , doğrudan bir jeneratör alabilir.
Morgan Thrapp

2
Baskı yapmak yerine lambda yapabilirsiniz. Morgan'ın önerisiyle: lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))(84 bayt)
DJMcMayhem


1

Ruby, 74 bayt

Soruda belirtilen zımni sıfır biçimini kullanır 40%,f[4] anonim işlev atanmışsa f. Tam bir yüzde gerekiyorsa, +6 baytn/=10;

Çevrimiçi deneyin!

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

1

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

Zaten 10'a bölünmüş sayıları alır. Muhtemelen bazı parenleri kaldırabilirim, ancak bu tamamen golf oynamaya oldukça kapalı.

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

1

Haskell, 83 bayt

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

Nedir ++"-"?
someonewithpc

1

Javascript es7, 105 bayt

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

ile ara

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)

The program/function ...- snippet değil
Titus,

1
\nGerçek bir yeni satırla değiştirirseniz, bir bayt kaydedebilirsiniz.
Mama Fun Roll,

1
@Titus Ne hakkında konuşuyorsun? Bu "pasaj" bir fonksiyondur.
NiCk Newman,

1
Ah doğru. ES7, unuttum.
Titus,

@MamaFunRoll Bunu vardı, ama emin ben net oldu% 100 değildi bu yüzden "" içinde sarın ve .length yapamadı - Ben :) bunu ekleriz
Charlie Wynn

1

Python 2.7, 113 108 77 bayt

n = girişi ()
(0,10) aralığında x için :
v = str (x + 1) * (nx) 2
eğer x
> 89: v = '10 'ise
' '* min (x, n) + '-' + y + '-'

İlk kez golf oynuyor. Devam edeceğim, almaya çalışın <100.
Girişin 1-10 olduğunu varsayar.

Düzenleme: @LeakyNun 'ın cevabından bazı püf noktaları kullandı (teşekkürler), sonra biraz daha kırdı ve temelde aynı cevabı aldı: tüm v değişkeninden kurtulmama izin veren if ifadesinden kurtulun. Çok havalı.

Benim versiyonum:

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

Güzel cevap ve siteye hoş geldiniz! Girinti düzeyini 4 yerine 1 boşluğa değiştirerek 9 bayt
çıkarabilirsiniz

Aslında, bununla daha da n=input(); for x in range(0,10):print' '*min(x,n)+'-'+('10'if x*n>89 else str(x+1)*(n-x)*2)+'-'
kısaltabilirsiniz


0

Python 2.7, 110 99 95 91 bayt:

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

Dahil aralığında bir tamsayı ile girdi alır tam bir program [1,10], 10aracı 100%ve 1aracı 10%. Muhtemelen biraz daha aşağı golf olabilir.

Çevrimiçi Deneyin! (Ideone)


0

PHP 5.3, 92 91 bayt

<?for(;$i<10;$i++)echo'
'.str_pad('-'.str_repeat($i+1,$n>9&&$i>8?:($n-$i)*2).'-',22,' ',2);
  • PHP 5.3 için register_globals=1ve ile short_open_tags=1(veerror_reporting=0 )
    cli ile çağırınphp-cgi -f <filename> n=<number>
  • 0 ile 10 arasında bir sayı

  • ile web tarayıcısını aramak için <scriptpath>?n=<number> :<pre>
  • 4.0.1 için <PHP <5.3: değiştir ?:?1: (+1) ile
  • PHP için> = 5.4: ilki $nile değiştirin($n=$_GET[n]) (+11)

bir işlev olarak ungolfed (herhangi bir PHP> = 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 odası

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>';

Şimdi bu benim için yeni: PHP JavaScript'i yeniyor.
Sanırım bu yaklaşım min.


STR_PAD_BOTHBu nedir, K&R C? Yaptığımız #defineçok PHP şeyler? :-)
kedi

@ cat: yup, PHP'de gerçek tanımlar var. ama sadece statik; C. gibi değil
Titus,


0

Perl, 122 bayt

$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}

0

Ortak Lisp (Lispworks), 314 bayt

(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"--~%")))))))

ungolded:

    (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 "--~%")))))))

Kullanımı:

    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

0

APL, 46 bayt

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

Bu argüman yüzde 10'a bölünerek verilmelidir (yani: [0,10] aralığında basit bir tamsayı).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.