解压一些数字


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

@DrGreenEg​​gsandIronMan输入可以为0%,您可以采用最方便的格式输入。
Atlasologist '16

@LuisMendo,是的,我将其编辑成问题,谢谢。
atlasologist '16

是否接受前导而不是尾随?是否接受绝对填充?
泰特斯(Titus)

Answers:


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

最后一个数字有点让我感到困惑。如果稍后查看,我也许可以删除第二条if语句。

编辑:Thx到mbomb007删除3个字节。感谢charredgrass提供了格式化提示,可帮助删除很多字节!:-D感谢TheBikingViking帮助您再提供两个字节!


1
使用i>9代替i==10并删除中的空格range(1, 11)
mbomb007 '16

1
在python中打高尔夫球的小技巧:通过将语句压缩到一行上,可以减少空格中的很多字节。例如,最后3行可以变为p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1
charredgrass

谢谢 !这对这很有帮助,在以后的高尔夫球
Jeremy

1
您可以通过(i-1)在最后一行替换为来减少2个字节~-i。这利用了运算符的优先级,并且在位翻转后加一个否定与减法相同1
TheBikingViking

使用range(1,11)then有(i-1)什么意义?
Leaky 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感谢Dennis,通过-循环化节省了两个字节。

编辑:我采取了一种略有不同的方法,并节省了另外两个字节。


1
通过'-'+`x+1`*(n-x<<1-x/9)+'-'exec循环中替换为,可以使用字符串格式节省2个字节'-%s-'%`x+1`*(n-x<<1-x/9)
R. Kap

否,我需要在周围加减价`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-通过消除$x变量并稍微重做字符串的公式化来获得10个字节。
编辑2-通过重做输入如何发生以及重做$i每个循环的计算方式来获得另外4个字节。
编辑3-OP保存6个字节,允许输入为0..10,因此无需除以10。

出奇的困难!

取输入作为15等,存储在$n。设置辅助$i变量(非常罕见倍,一个变量需要初始化为一个0在PowerShell中),然后从开始一个循环101

每次迭代时,我们均以等于的空格$i开头,然后是伪三进制(... , ...)[]。在伪三元内部,我们选择一个-带有多个数字的字符串($n-10+$_0,或乘以2),或者该字符串-10-选择基于我们是否在第10次迭代中,而我们的输入是100。我们将其与final连接起来-。该结果字符串将放置在管道上。

最后,我们增加$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

Pyth,37 34字节

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

测试套件。


3

蟒蛇, 95 84字节

我不知道lambda是合法的,谢谢@ 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 '16

2
您可以执行lambda而不是打印。摩根的建议下: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的数字来表示。我可能可以删除一些paren,但这对完全打高尔夫球很封闭。

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个字节

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

什么++"-"
someonewithpc

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,我忘了。
泰特斯(Titus)

@MamaFunRoll我有,但是不能用“”换成.length,所以我不是100%确信我是明确的-我将其添加在:)
Charlie Wynn

1

Python 2.7版,113个 108 77字节

n = input()
for x in range(0,10):
v = str(x + 1)*(nx)2
如果x
n> 89:v = '10'print
''* min(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))+'-'

很好的答案,欢迎光临本站!您可以通过改变缩进级别为1个空间起飞9个字节,而不是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%。可以打更多的球。

在线尝试!(爱迪生)


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);
  • for PHP 5.3 with register_globals=1and short_open_tags=1(and error_reporting=0
    在cli中使用php-cgi -f <filename> n=<number>
  • 从0到10的数字

  • 在Web浏览器中使用<scriptpath>?n=<number>以下命令调用:<pre>
  • 对于4.0.1 <PHP <5.3:替换?:?1:(+1)
  • 对于PHP> = 5.4:$n($n=$_GET[n])(+11)替换第一个

取消功能化(任何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胜过JavaScript。
我认为,这种方法非常实用。


STR_PAD_BOTH这是什么,K&R C?我们也#define用PHP做事吗?:-)

@cat:是的,PHP中有真正的定义。但只有静态;不象在C.
提多书


0

Perl,122个字节

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

无拘无束:

    (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])。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.