Giải nén một số số


21

Nhiệm vụ của bạn là tạo ra một chương trình hoặc chức năng tạo ra một dây kéo có độ dài 10 dòng. Mỗi dòng của khóa kéo được thể hiện bằng hai dấu gạch ngang --:

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

Chương trình / chức năng sẽ lấy phần trăm (chia hết cho 10) làm đầu vào và đầu ra sẽ là khóa kéo "giải nén" (dấu gạch ngang) từ đầu theo tỷ lệ phần trăm, hiển thị mức 1 được lập chỉ mục, mức thấp nhất được lặp lại 2 lần, với tất cả các cấp trước lặp lại 4, 6, 8, ... vv. lần, trong khi giữ đáy của khóa kéo ở giữa.

Ví dụ

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

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

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

Đầu vào (phần trăm) có thể được định dạng theo bất kỳ cách nào bạn thích (50%, .5, 50, 5 [zero ngụ ý], v.v.) và nó sẽ luôn nằm trong phạm vi từ 0 đến 100 và chia hết cho 10. Khoảng cách trong ví dụ phải được bảo tồn trong đầu ra của bạn.


Có thể đầu vào bao giờ được 0%? Chúng ta có được phép lấy đầu vào chia cho 10 không? ví dụ thay vì 50%nhận được 5?
DJMcMayhem

1
Đầu vào (phần trăm) có thể được định dạng theo bất kỳ cách nào bạn thích (50%, .5, 50), có thể chỉ là 5?
Luis Mendo

@DrGreenEggsandIronMan đầu vào có thể là 0% và bạn có thể lấy đầu vào ở định dạng thuận tiện nhất.
đồ học

@LuisMendo, vâng, tôi sẽ chỉnh sửa câu hỏi đó, cảm ơn.
đồ học

Là một ngắt dòng hàng đầu thay vì một dấu vết được chấp nhận? Là đệm tuyệt đối được chấp nhận?
Tít

Câu trả lời:


10

Con trăn 2 - 184 151 146 byte

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

Số cuối cùng hơi rối với tôi một chút. Tôi có thể loại bỏ câu lệnh if thứ hai nếu tôi nhìn vào nó sau.

EDIT: Thx đến mbomb007 để xóa 3 byte. Cảm ơn charredgrass về các mẹo định dạng để giúp loại bỏ rất nhiều byte! :-D Cảm ơn TheBikingViking vì đã giúp đỡ thêm hai byte!


1
Sử dụng i>9thay vì i==10và loại bỏ không gian trong range(1, 11).
mbomb007

1
Mẹo nhỏ để chơi gôn trong python: bạn cắt giảm rất nhiều byte từ khoảng trắng bằng cách nén các câu lệnh của bạn vào một dòng. Ví dụ 3 dòng cuối cùng có thể trở thành p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1.
charredgrass

cảm ơn ! Điều đó giúp ích rất nhiều cho điều này và tôi chắc chắn sẽ ghi nhớ điều đó trong việc chơi golf trong tương lai
Jeremy

1
Bạn có thể tắt 2 byte bằng cách thay thế (i-1)trong dòng cuối cùng bằng ~-i. Điều này lợi dụng sự ưu tiên của toán tử và thực tế là một chút lật theo sau là phủ định cũng giống như trừ 1.
TheBikingViking

Điểm sử dụng range(1,11)và sau đó là (i-1)gì?
Nữ tu bị rò rỉ

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

Đã lưu hai byte bằng cách execxác định một vòng lặp, nhờ Dennis.

EDIT: Tôi đã thực hiện một cách tiếp cận hơi khác và lưu thêm hai byte.


1
Bạn có thể lưu 2 byte bằng cách sử dụng định dạng chuỗi bằng cách thay thế '-'+`x+1`*(n-x<<1-x/9)+'-'trong execvòng lặp bằng '-%s-'%`x+1`*(n-x<<1-x/9).
R. Kap

Không, tôi cần parens xung quanh `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}

Chỉnh sửa 1 - Đánh gôn 10 byte bằng cách loại bỏ $xbiến và làm lại một chút cách thức chuỗi được tạo.
Chỉnh sửa 2 - Đánh gôn thêm 4 byte bằng cách làm lại cách đầu vào xảy ra và bằng cách làm lại cách $itính từng vòng lặp.
Chỉnh sửa 3 - Đã lưu 6 byte bằng OP cho phép nhập dưới dạng 0..10, do đó không cần chia cho 10.

Đáng ngạc nhiên là khó khăn!

Đưa đầu vào như 1, 5vv, được lưu trữ trong $n. Đặt $ibiến của trình trợ giúp (một trong những lần rất hiếm mà một biến cần được khởi tạo 0trong PowerShell), sau đó bắt đầu một vòng lặp từ 10đến1 .

Mỗi lần lặp, chúng tôi thiết lập bắt đầu chuỗi của chúng tôi với một số khoảng trắng bằng $i, theo sau là một giả ba (... , ...)[]. Bên trong giả, chúng tôi chọn một chuỗi -có một số chữ số (cao hơn $n-10+$_hoặc 0, nhân với 2) hoặc chuỗi -10- lựa chọn dựa trên việc chúng tôi ở lần lặp thứ 10 và đầu vào của chúng tôi là 100. Chúng tôi kết hợp điều đó với một trận chung kết -. Chuỗi kết quả đó được đặt trên đường ống.

Cuối cùng, chúng tôi tăng lên $i, và điều này thực sự khó khăn. Chúng tôi sử dụng một thủ thuật nhị phân cast-to-int để chỉ tăng $ilên cho đến khi đạt được $n, và sau đó giữ nó ở cùng một giá trị sau đó. Điều này đảm bảo chúng tôi đã đạt đến "điểm cuối" của thụt khóa kéo ở mức thích hợp.

Khi vòng lặp kết thúc, các chuỗi kết quả được tích lũy trên đường ống và đầu ra là ẩn.

Ví dụ

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

Con trăn 95 84 byte

Tôi không biết lambdas là hợp pháp, cảm ơn @Dr Green Eggs and Iron Man

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

1
Này, câu trả lời đầu tiên tuyệt vời! Bạn có thể di chuyển nó ra khỏi một sự hiểu biết danh sách để tiết kiệm 2 byte, joincó thể lấy một trình tạo trực tiếp.
Morgan Thrapp

2
Bạn có thể làm một lambda thay vì in. Với đề xuất của Morgan: lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))(84 byte)
DJMcMayhem


1

Ruby, 74 byte

Sử dụng hàm ý-zero định dạng cụ thể trong câu hỏi, vì vậy 40%f[4]nếu hàm vô danh được gán cho f. Nếu cần một tỷ lệ phần trăm đầy đủ, +6 byte chon/=10;

Hãy thử trực tuyến!

->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 byte.

Lấy số đã chia cho 10. Tôi có thể loại bỏ một số parens, nhưng điều này khá kín để chơi golf hoàn toàn.

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 byte

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

Có gì ++"-"?
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`
`

gọi với

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 ...- không phải đoạn trích
Tít

1
Nếu bạn thay thế \nbằng một dòng mới thực sự, bạn có thể lưu một byte.
Mama Fun Roll

1
@Titus Bạn đang nói về cái gì? "Đoạn trích" này là một chức năng.
NiCk Newman

1
đúng rồi ES7, tôi quên mất.
Tít

@MamaFunRoll tôi đã có, nhưng không thể quấn trong "" và làm .length vì vậy tôi đã không phải là 100% tự tin tôi ở trong rõ ràng - Tôi sẽ thêm nó vào :)
Charlie Wynn

1

Python 2.7, 113 108 77 byte

n = input ()
cho x trong phạm vi (0,10):
v = str (x + 1) * (nx) 2
nếu x
n> 89: v = '10 '
in' '* min (x, n) + '-' + v + '-'

Lần đầu chơi golf. Gonna cứ tiếp tục, cố gắng để có được nó <100.
Giả sử đầu vào là 1-10.

Chỉnh sửa: Đã sử dụng một số thủ thuật từ câu trả lời của @LeakyNun (cảm ơn), sau đó bẻ khóa thêm một chút và ... về cơ bản là cùng một câu trả lời: / Không biết về chuyển đổi chuỗi `int` và 2 - boolean hãy để tôi thoát khỏi câu lệnh if, cho phép tôi thoát khỏi toàn bộ biến v. Rất tuyệt.

Phiên bản của tôi:

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

Câu trả lời tốt đẹp, và chào mừng đến với trang web! Bạn có thể tắt 9 byte bằng cách thay đổi mức thụt thành 1 khoảng
trắng

Trên thực tế, bạn có thể làm điều này thậm chí còn ngắn hơn với điều này: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 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

Một chương trình đầy đủ lấy đầu vào của một số nguyên trong phạm vi bao gồm [1,10], trong đó 10phương tiện 100%1phương tiện10% . Có lẽ có thể được đánh golf xuống một chút nữa.

Dùng thử trực tuyến! (Ý)


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);
  • cho PHP 5.3 với register_globals=1short_open_tags=1(và error_reporting=0)
    gọi trong cli vớiphp-cgi -f <filename> n=<number>
  • số từ 0 đến 10

  • để gọi trong trình duyệt web với <scriptpath>?n=<number> : trả trước<pre>
  • cho 4.0.1 <PHP <5.3: thay thế ?:bằng?1: (+1)
  • cho PHP> = 5.4: thay thế cái đầu tiên $nbằng ($n=$_GET[n])(+11)

không được coi là một hàm (bất kỳ 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;
}

bộ kiểm tra

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

Bây giờ điều này là mới đối với tôi: PHP đánh bại JavaScript.
Cách tiếp cận này được chơi golf đến phút, tôi nghĩ vậy.


STR_PAD_BOTHĐây là gì, K & R C? Chúng ta có #definenhững thứ trong PHP không? :-)
mèo

@cat: yup, có định nghĩa thực sự trong PHP. Nhưng chỉ tĩnh; không thích ở C.
Tít


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}

0

Lisp thông thường (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"--~%")))))))

không được trả lời:

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

Sử dụng:

    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 byte

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

Đối số nên được đưa ra dưới dạng phần trăm chia cho 10 (nghĩa là: một số nguyên đơn giản, trong phạm vi [0,10]).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.