เปิดเครื่องรูดตัวเลขบางส่วน


21

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่สร้างซิปที่มีความยาว 10 บรรทัด ซิปแต่ละเส้นมีเครื่องหมายขีดคั่นสองอัน--:

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

โปรแกรม / ฟังก์ชั่นจะใช้เปอร์เซ็นต์ (หารด้วย 10) เป็นอินพุตและเอาต์พุตจะเป็นซิป "คลายซิป" (คั่นด้วยเครื่องหมายขีดกลาง) จากด้านบนเป็นเปอร์เซ็นต์โดยเผยให้เห็นระดับ 1 ดัชนีต่ำสุดซ้ำ 2 ครั้งพร้อม ระดับก่อนหน้าทั้งหมดซ้ำ 4, 6, 8, ... ฯลฯ ครั้งในขณะที่การรักษาด้านล่างของซิปเป็นศูนย์กลาง

ตัวอย่าง

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

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

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

อินพุต (เปอร์เซ็นต์) สามารถจัดรูปแบบตามที่คุณต้องการ (50%, .5, 50, 5 [ศูนย์โดยนัย] ฯลฯ ) และมันจะอยู่ในช่วง 0 ถึง 100 และหารด้วย 10 ระยะห่างใน ต้องเก็บรักษาตัวอย่างในผลลัพธ์ของคุณ


อินพุตอาจจะเคย0%? เราได้รับอนุญาตให้ป้อนค่าหารด้วย 10 หรือไม่ เช่นแทนที่จะ50%ได้รับ5?
DJMcMayhem

1
อินพุต (เปอร์เซ็นต์) สามารถจัดรูปแบบตามที่คุณต้องการ (50%, .5, 50),มันจะเป็นเพียงแค่5?
Luis Mendo

@DrGreenEggsandIronMan อินพุตสามารถเป็น 0% และคุณสามารถใช้อินพุตในรูปแบบที่สะดวกที่สุด
กายวิภาคศาสตร์

@ LuisMendo ใช่ฉันจะแก้ไขให้เป็นคำถามขอบคุณ
กายวิภาคศาสตร์

การขึ้นบรรทัดใหม่แทนการยอมรับต่อท้ายหรือไม่? ยอมรับการขยายเต็มแน่นอนหรือไม่
ติตัส

คำตอบ:


10

Python 2 - 184 151 146 ไบต์

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

หมายเลขสุดท้ายค่อนข้างยุ่งกับฉันเล็กน้อย ฉันอาจจะลบที่สองถ้าคำสั่งถ้าฉันดูในภายหลัง

แก้ไข: ขอบคุณถึง mbomb007 สำหรับการลบ 3 ไบต์ ขอบคุณ charredgrass สำหรับเคล็ดลับการจัดรูปแบบเพื่อช่วยลบล็อตและไบต์จำนวนมาก! :-D ต้องขอขอบคุณ TheBikingViking ที่ช่วยเหลือด้วยอีกสองไบต์!


1
ใช้i>9แทนและเอาพื้นที่ในi==10 range(1, 11)
mbomb007

1
เคล็ดลับเล็ก ๆ สำหรับการเล่นกอล์ฟในไพ ธ อน: คุณลดจำนวนไบต์จากช่องว่างโดยการบีบอัดข้อความของคุณลงในหนึ่งบรรทัด ตัวอย่างสุดท้าย 3 p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1สายจะกลายเป็น
charredgrass

ขอบคุณมาก! นั่นช่วยได้มากกับอันนี้และฉันจะระลึกไว้เสมอว่าในอนาคตการเล่นกอล์ฟ
Jeremy

1
คุณสามารถโกน 2 ไบต์โดยการแทนที่ในบรรทัดสุดท้ายด้วย(i-1) นี้ใช้ประโยชน์ของผู้ประกอบการมีความสำคัญและความจริงที่ว่าบิตพลิกตามด้วยการปฏิเสธเป็นเช่นเดียวกับการลบ~-i 1
TheBikingViking

จุดของการใช้คืออะไรrange(1,11)แล้ว(i-1)?
Leun Nun

10

Python 2, 74 ไบต์

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

บันทึกสองไบต์ด้วยการexecระบุลูปขอบคุณเดนนิส

แก้ไข: ฉันใช้วิธีที่แตกต่างกันเล็กน้อยและบันทึกอีกสองไบต์


1
คุณสามารถบันทึก 2 ไบต์ใช้สตริงการจัดรูปแบบโดยการแทนที่'-'+`x+1`*(n-x<<1-x/9)+'-'ในวงด้วยexec '-%s-'%`x+1`*(n-x<<1-x/9)
R. Kap

Nope ผมต้อง parens `x+1`*(n-x<<1-x/9)รอบ
ลินน์

4

PowerShell v2 +, 130 120 116 110 ไบต์

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

แก้ไข 1 - ตีกอล์ฟ 10 ไบต์โดยการกำจัด$xตัวแปรและทำซ้ำวิธีการกำหนดสตริง
แก้ไข 2 - ตีกอล์ฟอีก 4 ไบต์โดยการทำซ้ำวิธีการป้อนข้อมูลและการทำซ้ำการ$iคำนวณแต่ละลูป
แก้ไข 3 - บันทึก 6 ไบต์โดย OP อนุญาตให้อินพุตเป็น0..10ดังนั้นจึงไม่จำเป็นต้องหารด้วย 10

น่าแปลกที่ยาก!

จะเข้าเป็น1, 5และอื่น ๆ $nที่เก็บไว้ใน ตั้งค่า$iตัวแปรตัวช่วยเหลือ(หนึ่งในเวลาที่หายากมากซึ่งตัวแปรนั้นจำเป็นต้องเริ่มต้นใช้งาน0ใน PowerShell) จากนั้นเริ่มการวนซ้ำจาก10ไป1เป็น

แต่ละซ้ำเราตั้งเริ่มต้นสตริงของเราด้วยจำนวนของช่องว่างเท่ากับตามด้วยการหลอก$i ternary (... , ...)[]ภายใน pseudo-ternary เราเลือกสตริงที่-มีจำนวนหลัก (ที่สูงกว่า$n-10+$_หรือ0คูณด้วย 2) หรือสตริง-10- การเลือกนั้นขึ้นอยู่กับว่าเราอยู่ที่การทำซ้ำครั้งที่ 10 และอินพุตของเราคือ100. เรา concatenate -ว่าเป็นครั้งสุดท้าย สตริงผลลัพธ์นั้นถูกวางลงบนไพพ์ไลน์

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

เมื่อวนลูปเสร็จแล้วสตริงผลลัพธ์จะถูกสะสมทั้งหมดในไปป์ไลน์และเอาท์พุทจะเป็นนัย

ตัวอย่าง

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

งูหลาม 95 84 ไบต์

ฉันไม่รู้ว่า lambdas นั้นถูกกฎหมายขอบคุณ @Dr Green Eggs และ Iron Man

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

1
เฮ้คำตอบแรกที่ดี! คุณสามารถย้ายออกจากรายการความเข้าใจเพื่อบันทึก 2 ไบต์joinสามารถใช้เครื่องกำเนิดไฟฟ้าโดยตรง
Morgan Thrapp

2
คุณสามารถทำแลมบ์ดาแทนการพิมพ์ได้ ด้วยข้อเสนอแนะของมอร์แกน: lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))(84 ไบต์)
DJMcMayhem


1

Ruby, 74 ไบต์

ใช้นัยศูนย์รูปแบบที่กำหนดในคำถามเพื่อให้40%เป็นถ้าฟังก์ชั่นที่ไม่ระบุชื่อได้รับมอบหมายให้f[4] fถ้าต้องการเปอร์เซ็นต์เต็ม, +6 ไบต์สำหรับn/=10;

ลองออนไลน์!

->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 ไบต์

นำจำนวนที่หารด้วย 10 ไปแล้วฉันอาจลบบางส่วนของ parens ได้ แต่นี่ปิดไปแล้วที่จะเล่นกอล์ฟอย่างสมบูรณ์

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


1

Javascript es7, 105 ไบต์

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=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 ...- ไม่ใช่ตัวอย่าง
Titus

1
หากคุณแทนที่\nด้วยขึ้นบรรทัดใหม่ที่เกิดขึ้นจริงคุณสามารถบันทึกไบต์
Mama Fun Roll

1
@Titus คุณกำลังพูดถึงอะไร? "ตัวอย่างข้อมูล" นี้เป็นฟังก์ชั่น
NiCk Newman

1
อ่าขวา ES7 ฉันลืม
ติตัส

@MamaFunRoll ฉันมี แต่ไม่สามารถห่อ "" และทำ. ความยาวดังนั้นฉันจึงไม่มั่นใจ 100% ว่าฉันชัดเจน - ฉันจะเพิ่มใน :)
Charlie Wynn

1

Python 2.7, 113 108 77 ไบต์

n = อินพุต ()
สำหรับ x ในช่วง (0,10):
v = str (x + 1) * (nx) 2
ถ้า x
n> 89: v = '10 '
พิมพ์' '* นาที (x, n) + '-' + V + '-'

เล่นกอล์ฟเป็นครั้งแรก พยายามต่อไปให้ได้ <100
ถือว่าอินพุตเป็น 1-10

แก้ไข: ใช้เทคนิคบางอย่างจากคำตอบของ @LeakyNun (ขอบคุณ) จากนั้นก็บีบอัดให้ไกลขึ้นและได้รับ ... โดยทั่วไปคำตอบเดียวกัน: / ไม่รู้เกี่ยวกับการแปลงสตริง `int` และ 2 - บูลีนให้ฉัน กำจัดคำสั่ง if ซึ่งให้ฉันกำจัดตัวแปร v ทั้งหมด เด็ดมาก

รุ่นของฉัน:

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

คำตอบที่ดีและยินดีต้อนรับสู่เว็บไซต์! คุณสามารถลดขนาด 9 ไบต์ได้โดยเปลี่ยนระดับการเยื้องเป็น 1 ช่องว่างแทน 4
DJMcMayhem

ที่จริงแล้วคุณสามารถทำให้สิ่งนี้สั้นลงได้ด้วย: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.7, 110 99 95 91 ไบต์:

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

โปรแกรมเต็มรูปแบบที่รับอินพุตโดยจำนวนเต็มในช่วงรวม[1,10]โดยที่ค่า10เฉลี่ย100%และค่า1เฉลี่ย10%วิธีการอาจจะสามารถเล่นกอล์ฟได้มากขึ้นอีกเล็กน้อย

ลองออนไลน์! (Ideone)


0

PHP 5.3, 92 91 ไบต์

<?for(;$i<10;$i++)echo'
'.str_pad('-'.str_repeat($i+1,$n>9&&$i>8?:($n-$i)*2).'-',22,' ',2);
  • สำหรับ PHP 5.3 ที่มีregister_globals=1และshort_open_tags=1(และerror_reporting=0)
    โทรใน cli ด้วยphp-cgi -f <filename> n=<number>
  • หมายเลขตั้งแต่ 0 ถึง 10

  • เพื่อโทรในเว็บเบราว์เซอร์ด้วย <scriptpath>?n=<number> : prepend<pre>
  • สำหรับ 4.0.1 <PHP <5.3: แทนที่ ?:ด้วย?1:(+1)
  • สำหรับ PHP> = 5.4: แทนที่อันแรก$nด้วย($n=$_GET[n]) (+11)

ungolfed เป็นฟังก์ชัน (ทุก 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;
}

ชุดทดสอบ

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

ตอนนี้สิ่งนี้ใหม่สำหรับฉัน: PHP beats JavaScript
ฉันคิดว่าวิธีการนี้จะใช้วิธีนาที


STR_PAD_BOTHนี่คืออะไร K&R C? เราทำ#defineสิ่งต่าง ๆ ใน PHP ด้วยหรือไม่ :-)
แมว

@cat: yup มีการกำหนดจริงใน PHP แต่คงที่เท่านั้น ไม่เหมือนใน C.
Titus



0

Common Lisp (Lispworks), 314 ไบต์

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

การใช้งาน:

    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 ไบต์

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

อาร์กิวเมนต์ควรได้รับเป็นเปอร์เซ็นต์หารด้วย 10 (นั่นคือ: จำนวนเต็มอย่างง่ายในช่วง [0,10])

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