いくつかの番号を解凍します


21

あなたの仕事は、10行の長さのジッパーを生成するプログラムまたは関数を作成することです。ジッパーの各行は2つのダッシュで表され--ます:

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

プログラム/関数は入力としてパーセンテージ(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%、0.5、50)のように、しかし、あなたをフォーマットすることができ、それだけであることができますか5
ルイスメンドー

@DrGreenEg​​gsandIronManの入力は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

最後の数字はちょっとめちゃめちゃになりました。後で見れば、2番目のifステートメントを削除できる可能性があります。

編集:3バイトを削除するためのmbomb007へのThx。たくさんのバイトを削除するためのフォーマットのヒントをくれたcharredgrassに感謝します!:-Dさらに2バイトを手伝ってくれたTheBikingVikingに感謝します!


1
i>9代わりに使用しi==10、のスペースを削除しますrange(1, 11)
mbomb007

1
Pythonでのゴルフの小さなヒント:ステートメントを1行に圧縮することにより、空白から多くのバイトを削減します。たとえば、最後の3行はになりp=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1ます。
チャーレッドグラス

ありがとう!これはこれで大いに役立ちます。将来のゴルフでそれを念頭に置いておくつもりです
ジェレミー

1
(i-1)最後の行をで置き換えることにより、2バイトを削ることができます~-i。これは、演算子の優先順位と、ビットフリップの後に否定が続くという事実を利用して、減算と同じ1です。
TheBikingViking

使用してのポイントは何ですかrange(1,11)当時とは(i-1)
リーキー修道女

10

Python 2、74バイト

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

execDennisのおかげで、ループを-ifyingすることで2バイトを節約しました。

編集:私はわずかに異なるアプローチを取り、さらに2バイト節約しました。


1
ループ内でを置き換えること'-'+`x+1`*(n-x<<1-x/9)+'-'で、文字列の書式設定を使用して2バイトを保存できます。exec'-%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変数(変数に初期化する必要があることは非常にまれな時代の1 0その後、PowerShellで)、およびからループを開始10します1

反復ごとに、に等しいスペースの数で文字列を開始し$i、その後に疑似三項を設定し(... , ...)[]ます。擬似3項の内部で、-桁数($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

Python、 95 84バイト

ラムダが合法だとは知らなかった、@ 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、ジェネレーターを直接使用できます。
モーガンスラップ16

2
印刷する代わりにラムダを実行できます。モーガンの提案:lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))(84バイト)
DJMcMayhem


1

ルビー、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で割った数を取ります。おそらく、いくつかのかっこを削除できますが、これは完全にゴルフに閉じられています。

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 ...-スニペットではない
タイタス

1
\n実際の改行に置き換えると、1バイト節約できます。
ママファンロール

1
@Titus何を言ってるの?この「スニペット」は機能です。
ニック・ニューマン

1
そうそう。ES7、忘れました。
タイタス

@MamaFunRoll私はそれを持っていましたが、 ""でラップできず、.lengthを実行できなかったので、明確に100%自信がない-私はそれを追加します:)
チャーリーウィン

1

Pythonの2.7、113 108 77バイト


範囲(0,10)のxの n = input():
v = str(x + 1)*(nx)2
x x
> 89:v = '10 'の場合
print' '* min(x、n)+ '-' + v + '-'

初めてゴルフをする。続けて、100未満にしようとします。
入力が1〜10であると仮定します。

編集:@LeakyNunの答えからいくつかのトリックを使用して(ありがとう)、それをもう少しクランチして取得しました...基本的に同じ答え:/ `int`文字列変換について知りませんでしたifステートメントを削除します。これにより、v変数全体を削除できます。とてもかっこいい。

私のバージョン:

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

いい答えです。サイトへようこそ!あなたは4の代わりに、1つのスペースのインデントレベルを変更することにより、9つのバイトをオフに取ることができる
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

パイソン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);
  • PHP 5.3の場合、register_globals=1およびshort_open_tags=1(およびerror_reporting=0
    CLIでの呼び出しphp-cgi -f <filename> n=<number>
  • 0から10までの数

  • を使用してWebブラウザで呼び出す<scriptpath>?n=<number>:prepend<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

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

ゴールドなし:

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