コードゴルフの質問の難易度を計算する


43

ブリーフィング

コードゴルフの質問の難易度は、次のように計算できます。

式

v質問の視聴回数はどこですか

そして、a質問があり回答数です

そして⌈ X ⌉は天井演算子

また:

クランプ

この質問の現在の難易度:***

仕事

2つの整数を取り(v and a)、難易度をで出力するプログラムを作成しasterisks (*)ます。

入力は、配列、分離された文字列、または分離された関数引数の形式にすることができます

テストデータ

Views   Answers Difficulty  Program Output
163     2       2           **
548     22      1           *
1452    24      1           *
1713    37      1           *
4162    32      2           **
3067    15      3           ***
22421   19      10          **********

擬似コードを使用した例

v: 1713    
a: 37
out = clamp(ceil(((v/a)/700)*10), 0, 10); // evaluates to 1
//program will output '*'

バイト単位の最短コードが勝ちです!末尾/先頭のスペースは許可されます。


3
LaTeXは単純な式の文字列であることを理解するのが難しいことに気付きます。しかし、大多数が望むものは何でも..
Shaun Wild

3
あなたは、ほとんど手に負えない質問に[ アンダーハンド ]を追加する必要があります。
アダム

5
これはコードゴルフの質問です。サイトに実装されている実際のシステムではありません。不公平だと誰が気にしますか?
ショーンワイルド

13
そのちょっと早いので、私はここで何かが欠けてもよいが、なぜ/700 * 10代わりに/70
ケビンL

4
@KevinL Ssshhhh;)
ショーンワイルド

回答:


49

JavaScript(ES6)、40 39バイト

v=>a=>"**********".substring(10-v/a/70)

そのためsubstringに必要な締め付けや行動をINGの「切り上げ」を提供します。編集:通常、私は面倒くさいのですが、4回の賛成票があるので、@ MarsUltorのアドバイスに従ってカレーで1バイト節約しました。


ああ、それは部分文字列の良い使用です:-)
ディランミース

7
カリー化を使用:v=>a=>
ASCIIのみ

3
substr代わりに使用できますか?私は確かに最初の...に関する2番目のパラメータは違いが知っているが、ではない
ドムヘイスティングス

1
@DomHastings:はい、sliceさらに短くなります。
Yay295

5
@DomHastingsいいえ、両方でsubstrありslice、負の引数は文字列の末尾からカウントバックすると解釈します。
ニール

38

私はこれをしばらくの間望んでいました...

HTML + CSS 491 487 485バイト

Conor O'Brienのおかげで-4バイト
-Helium Nucleiのリリースにより-2バイト

入力はページウィンドウの幅と高さとして扱われます。widthはビューの数、heightは回答の数です。

<style>p{overflow:hidden;width:1ch}@media(max-aspect-ratio:70/2){p{width:1ch}}@media(max-aspect-ratio:70/3){p{width:2ch}}@media(max-aspect-ratio:70/4){p{width:3ch}}@media(max-aspect-ratio:70/5){p{width:4ch}}@media(max-aspect-ratio:70/6){p{width:5ch}}@media(max-aspect-ratio:70/7){p{width:6ch}}@media(max-aspect-ratio:70/8){p{width:7ch}}@media(max-aspect-ratio:70/9){p{width:8ch}}@media(max-aspect-ratio:7/1){p{width:9ch}}@media(max-aspect-ratio:70/11){p{width:10ch</style><p>**********

次のように入力して、ブラウザで試すことができます

data:text/html,<style>p{overflow:hidden;width:1ch}@media(max-aspect-ratio:70/2){p{width:1ch}}@media(max-aspect-ratio:70/3){p{width:2ch}}@media(max-aspect-ratio:70/4){p{width:3ch}}@media(max-aspect-ratio:70/5){p{width:4ch}}@media(max-aspect-ratio:70/6){p{width:5ch}}@media(max-aspect-ratio:70/7){p{width:6ch}}@media(max-aspect-ratio:70/8){p{width:7ch}}@media(max-aspect-ratio:70/9){p{width:8ch}}@media(max-aspect-ratio:7/1){p{width:9ch}}@media(max-aspect-ratio:70/11){p{width:10ch</style><p>**********

新しいタブのURLとして。


11
EHM、箱の思考... -箱から出して考えるための1
アダム・

2
終了pタグが必要ですか?
コナーオブライエン

ウィンドウのサイズを変更すると更新されるのが大好きです。
YSC

@ ConorO'Brien:いいね!
Yay295

1
最後の2つも必要ありません}
-betseg

12

05AB1E、11バイト

/70/î'*T×s£

説明

/            # divide v by a
 70/         # divide by 70
    î        # round up, call this n
     '*T×    # push 10 asterisks
         s£  # take n up to 10 asterisk
             # implicitly print

オンラインで試す


12

Javascript(ES6)、37 36バイト

v=>a=>"*".repeat((v/=a*70)<9?v+1:10)

TheLethalCoderのおかげでカリー化により1バイト節約


3
v=>a=>代わりに使用できます(v,a)=>か?
TheLethalCoder

@TheLethalCoder-更新。ありがとう!
アーナウルド

2
うまくいかないのv=70, a=1ですか?
ニール

1
@Neil-そうです。回答の数がビューの数の正確な除数である場合、1ポイントずれています。言い換えれば、次の見解を予想しているということです。;-)
Arnauld

11

Mathematica、38 35バイト

StringRepeat["*",10,⌈#/#2/70⌉]&

3バイトの@MartinEnderに感謝


1
こんにちは、PPCGへようこそ!これは素晴らしい答えです!
-NoOneIsHere

@NoOneIsHereありがとう!もともとClip、OPのClampとほぼ同じ構文を持つを考えていましたが、その後StringRepeat、切り捨てのためのオプションの3番目の引数があることがわかりました。
u54112

3
左と右の天井ブラケットにはUnicode文字があり、一緒に必要な9文字の代わりに6バイトだけを構成しますCeiling[]
マーティンエンダー

9

EXCEL、29バイト

ExcelをVBA Excelの表現としてカウントする場合、次を使用できます。

=REPT("*",MIN(1+v/(70*a),10))

ここでvおよびaは、参照セルの名前です。


3
こんにちは、PPCGへようこそ!これは素晴らしい最初の投稿です!そしてまた有効。
Rɪᴋᴇʀ

@EasterlyIrkもこんにちは。暖かく歓迎してくれてありがとう:)
アナスタシヤ-ロマノバ秀

8

CJam、18 15 14バイト

Peter Taylorのおかげで1バイト、Adnanのおかげで3バイト節約

'*A*q~d/70/m]<

オンラインで試す

'*A*            e# Push "**********"
    q~d/        e# Get the input and divide the two numbers
        70/     e# Divide by 70
           m]   e# Ceil, yielding x
             <  e# Slice the string, taking the first x elements

8

C#、68 49 48バイト

v=>a=>"**********".Substring((int)(10-v/a/70d));

これは、ニールによるこの優れた答えのC#バージョンです。

ニールのおかげでさらに19バイト節約


試す(int)System.Math.Floor(10-v/a/70)か、ただ(int)(10-v/a/70)
ニール

@ニール私は70d一人で去らなければならなかったように見えますが、より良いおかげで動作します
-TheLethalCoder

1
申し訳ありませんが、見ていませんd
ニール

カリー化で1つのバイトを救うことができるもう一つの答えは、私は思う:v=>a=>
ブライアンMcCutchon

@BrianMcCutchon C#でどうすればそれができるのか気づかなかったおかげで
-TheLethalCoder

7

Java 8、57バイト

ラムダを使用してバイトを保存し、計算とサブストリングを実行して回答を返します。

(v,a)->"**********".substring(Math.max(0,(700*a-v)/70/a))

これがテスト用の私のクラスです。

public class DifficultyCalculator{
    static interface h{ String f(int v, int a);}
    static void g(h H){
        System.out.print(H.f(163,2));System.out.println("\t**");
        System.out.print(H.f(548,22));System.out.println("\t*");
        System.out.print(H.f(1452,24));System.out.println("\t*");
        System.out.print(H.f(1713,37));System.out.println("\t*");
        System.out.print(H.f(4162,32));System.out.println("\t**");
        System.out.print(H.f(3067,15));System.out.println("\t***");
        System.out.print(H.f(22421,19));System.out.println("\t**********");
    }
    public static void main(String[] args) {
        g( // 70
            (v,a)->"**********".substring(java.lang.Math.max(0,(int)(10-v/70d/a)))
        );
    }
}

更新

  • -3 [16-08-19]使用されている整数除算
  • -10 [16-08-18] @OlivierGrégoireのおかげで、不要なインポートを削除しました
  • -18 [16-08-17]印刷の代わりに文字列を返します

2
ニース、電車ではないJavaの答え!
イスマエルミゲル

4
java.lang.デフォルトのインクルードパッケージなので、必要はありません。
オリビエグレゴワール

天井ではなく丸くなっています!

1
@Advancid私はそれをテストしてSystem.out.println((int)2.99);印刷2し、10から事前にフロア化された値を取得し、10からフロアーを削除するのと同じです。–
NonlinearFruit

6

MATL、12バイト

/70/0:9>42*c

オンラインでお試しください!

説明

切り上げとクランプは、次のように同時に行われます。数値x = v/a/70は配列の各要素と比較されます[0 1 ... 9]。超過したその配列の番号はxアスタリスクになり、残りはスペースになります。

/      % Take the two numbers implicitly. Divide. (Example: for inputs 3067, 15
       % we get 204.47)
70/    % Divide by 70 (we get 2.92)
0:9    % Push array [0 1  ... 9]
>      % See which of those are exceeded by the previous number (2.92 exceeds
       % 0, 1 and 2, so we get [1 1 1 0 ... 0]). This does the rounding up
       % and the clamping
42*    % Multiply by 42, which is the ASCII code of '*' (we get [42 42 42 0 ... 0])
       % Char 0 will be displayed as space
c      % Convert to char. Implicitly display

5

Python2、32バイト

3 + 2バイトを節約し、Leaky Nunのおかげで1つのエラーで修正されました

lambda v,a:('*'*10)[:~-v/a/70+1]

ニールスの答えに似ています。Python2が整数除算を行うという事実を使用します。


とき失敗したv=70a=1
漏れ尼僧

f=削除することができます
漏れ修道女

v, aになることができますv,a
リーキー修道女

ありがとう!今すぐ動作するはずです。v = 0、a = 1の場合は間違っている可能性がありますが、このケースは存在できません。
マトハウス

v = 0、a = 1の場合、これは間違いではありません。
リーキー修道女

5

Haskell、35バイト

v#a=[1..min(ceiling$v/a/70)10]>>"*"

[1..min(ceiling$v/a/70)10]1から計算された難易度までの範囲を作成します(難易度0の空のリスト)。a>>bリストをb length a頻繁に繰り返します。



4

C#、97 89 87 77 42 41バイト

v=>a=>new string('*',(v/=a*70)<9?v+1:10);

Adámのおかげで10バイト節約

Arnauldのおかげで数バイト節約


あなたは置き換えることによって、全体の多くを救うことができる(int)System.Math.Ceiling(v/a/70d)ことにより、(v+69)/(70*a)さらにV /負にすることはできませんので、ということ...注意cあなたがそれをチェックする必要はありませんので、多くのことを簡素化することができます。
トムヴァンデルザンデン

4

Perl、35 32バイト

say"*"x(10-($-=10-pop()/70/pop))

を使用-Esayて、引数をアクティブにし、逆の順序で引数を指定します。

perl -E 'say"*"x(10-($-=10-pop()/70/pop))' 2 163

STDINの引数が許可されている場合、次は29バイトです。

(echo 163; echo 2) | perl -pe '$_="*"x(10-($-=10-$_/70/<>))'

まったく同じかどうかは思い出せませんが、0|代わりにできます$-=か?(思考演算子の優先順位が正しくない可能性があります...)
Dom Hastings

@DomHastingsは、0|(ゼロにつながる膨大な数に負の数を作る*秒)、$-=0にクリップ(10につながる*私はここに必要なものであるS)、
トンHospel

ああ、もちろん、これは正の整数にすぎません!思い出してくれてありがとう。私は確かに私はかかわらず、それを必要とするときことを忘れてしまうよ...😀
ドムヘイスティングス

4

R、68、50 52バイト

f=function(v,a)cat(rep("*",1+min(v/a/70,10)),sep="")

rep 0の数に暗黙的にminを配置します。

エラーを発見してくれた@plannapusと@ Anastasiya-Romanova秀に感謝します。


削除できますf=
チョイス

1
コードの出力はテストデータと等しくありません。同じ出力を取得するには、1+あと2バイトを追加する必要min(があります
Anastasiya-Romanova


3

Javascript ES6、48バイト

a=>b=>"*".repeat(Math.ceil(Math.min(a/b/70,10)))

3

C、545150、49のバイト

それvが正またはゼロとa正であると仮定するとx < min、天井の操作の結果が負になる可能性はないため、クランプケースは決して満たされません。さらに、非負の値の整数演算では常に結果の下限が得られる1ため、上限を追加します。

このソリューションにはwrite機能が必要で、少なくともLinuxで機能します。

F(v,a){write(1,"**********",(v/=a*70)>9?10:v+1);}

メインテスト:

int main() {
  F(163, 2);
  putchar('\n');
  F(548, 22);
  putchar('\n');
  F(1452, 24);
  putchar('\n');
  F(1713, 37);
  putchar('\n');
  F(4162, 32);
  putchar('\n');
  F(3067, 15);
  putchar('\n');
  F(22421, 19);
  putchar('\n');
}

1
に置き換える(v=v/a/70)(v/=a*70)1バイト節約されます。
ceilingcat

素敵なキャッチ@ceilingcat!
ステファノサンフィリッポ

2

javascript:82 73バイト

 (v,a)=>console.log("*".repeat(Math.min(Math.max(0,Math.ceil(v/a/70),10)))
  • アダムが指摘した後、いくつかのバイトを節約しました/ 700 * 10 = / 70を見落とし、括弧を削除しました

@Adám編集の内容
マーティンエンダー

@Adám回答のいずれかを読むと、ネタバレになります。現在、その文はほとんど役に立たず、人々が改訂履歴をクリックするだけなので、ロールバックします。
マーティンエンダー

@Adámそれは私が普段自分で使っていることですが、現在のバージョンでは害はありません。
マーティンエンダー

console.logそれは必要ありません、返品は問題ありません。v=>a=>代わりに1バイトを保存することもできます(v,a)=>
チョイス


2

クラゲ、18バイト

P
#'*
mM/%i
10 %70

形式で入力を取ります[a v]オンラインでお試しください!

説明

  • %逆数なので%70、1/70です。
  • i 2要素配列として入力されます。
  • /%入力とiし、%70アレイ低減i初期値と反転分割では%70。つまり、v /(70 * a)に等しいv /(a /(1/70))を計算します。
  • Mこの値mの上限を取り、その最大値とを取ります10
  • #'*リテラル*文字を何回も繰り返します。
  • P 引用符なしで結果を出力します。

2

MATLAB、34 33バイト

私はこの挑戦がとても好きなので、MATLABの1つです(末尾の空白を出力します):

@(v,a)[(ceil(v/a/70)>0:9)*42,'']

@Luis Mendoの回答に触発されました。1バイトを保存してくれた@pajonkに感謝します。


素敵なアプローチ!私は投稿する40バイトのものを持っていました...ところで、あなたはの[... '']代わりに1バイトを保存することができますchar(...)。そしてceil、最後に整数と比較するときは本当に必要ですか?
パジョン

2
ありがとう@pajonk-私のコードをさらに読みにくくするために、このサイトでいくつかのことを本当に学ぶことができます;)
mathause

2

M4、136の 135バイト

define(r,`ifelse($1,0,,eval($1>9),1,*`r(9)',*`r(decr($1))')')define(f,`r(ifelse(eval($1%($2*70)),0,eval($1/$2/70),eval($1/$2/70+1)))')

およびfを取り、正しい出力に展開するマクロを定義します。プログラムのほとんどは、天井の実装です。va


2

DC、110の108 104 98バイト

スライシングは問題ではないので、これはすごいことでした。また、dcは文字列を操作しません。5時間未満のコーディングになるような文字列を待っていました。プラス面として、私はついにforループのような一般的な構造を書き始めました。また、丸め/天井を策定する必要があったので、ありがとう。

[42P]sd[dsi[li0!=dli1-dsi0!=L]dsLx]sl[Isi[li0!=dli1-dsi0!=L]dsLx]sg[1+]saIk/70*0k1~0!=adI>ldI!>gIP

bashで呼び出されます:

echo 'v a (above)'|dc
# Wholly:
>> echo '163 2 [42P]sd[dsi[li0!=dli1-dsi0!=L]dsLx]sl[Isi[li0!=dli1-dsi0!=L]dsLx]sg[1+]saIk/70*0k1~0!=adI>ldI!>gIP'|dc
# outputs:
**
>> 

コードを(上記の)置き換え、及びv及びa上記それぞれ対応しています。一重引用符は重要です(そうしないと、bashの履歴を取得できます)。


説明:

[42P]sd   # Here we store a macro in register d to print 1 * without a newline

[dsi[li0!=dli1-dsi0!=L]dsLx]sl # Store the "less than" case, a for loop which
                        # uses the top-of the stack as it's number of iterations.
[Isi[li0!=dli1-dsi0!=L]dsLx]sg # Store the "greater than" case. It's the above,
                        # but it puts 10 on the stack to use instead.

[1+]sa # Store a macro to add 1 to whatever is the top-of-stack.


Ik # Set precision at non-zero to allow decimal division

/70* # Divide the top two of the stack, v/a; multiply by 70 (`/700*10` == `/70`)
             # dc is postfix and stack-based, so operators come after operands.

0k1~0!=a     # This is a ceiling function.
|> 0k  # set precision to 0 to perform integer division
|> 1~  # push the quotient of integer division by 1, and then the remainder. (r is top)
|> 0!=a # If the top-of-stack (decimal part) is not 0, add 1 to the quotient

dI>ldI!>g # Conditional statement
|> dI>l  # (d)uplicate the top, push 10 on. If 10 > the old top, execute the `l`ess-than
          # case, which loops top-of-stack times.
|> dI!>g # Complement of the above, using the `g`reater-than to loop 10 times.

IP # print a newline

これはおそらくよりゴルフに適していますが、時期尚早な最適化を避けるためにそれを完成させようとしていました。

  • 保存-ロードの代わりに複製-保存で2バイト保存
  • 70で割って4バイト節約
  • danieroの提案から6バイト(非文字列、代わりにASCII nums; 10 => I)

[*]n=> 42P。のすべてのインスタンスを10に置き換えることができますI[]p=>IP
daniero

2

Haskell、35バイト

この解決策は、ライコニの答えとはまったく異なります。それでも、スコアは(今のところ)まったく同じです。

v%a=take(ceiling$v/a/70)[0..9]>>"*" 

これにより、10個の星が生成され、いくつかの星が削られます。無限のリストで任意の難易度に簡単に拡張できます。

私はもう1バイト削ることができました。しかし、すべてのテストケースは機能しますが、これは一般的には正しくありません。

v%a=take(1+div v(a*70))[0..9]>>"*"


1

PowerShell v2 +、47バイト

-join(('*'*11)[1..($args[0]/$args[1]/70+.499)])

やや@NeilのJavaScript回答の移植版。

入力を受け取り$args、それらを除算し、それをで除算し70、を加算します.499。PowerShellは銀行家の丸めを行うので、これは事実上ceil小数点以下2桁の精度です。追加の精度が必要な場合は、必要な数の追加9sを追加します。

とともに1..、これは文字列への範囲インデックスを形成します。文字列がある'*'*11、すなわち'***********'。その結果、char-arrayになるため-join、一緒に文字列に戻します。その文字列はパイプラインに残り、出力は暗黙的です。ニールの答えのように、これは出力を1〜10星の間に効果的に「クランプ」します。

テストスイート

PS C:\Tools\Scripts\golfing> @(@(163,2), @(548,22), @(1452,24), @(1713,37), @(4162,32), @(3067,15), @(22421,19))|%{($_-join', ')+" -> " +(.\difficulty-of-a-question $_[0] $_[1])}
163, 2 -> **
548, 22 -> *
1452, 24 -> *
1713, 37 -> *
4162, 32 -> **
3067, 15 -> ***
22421, 19 -> **********

1

Python 3、69 68バイト

Python 2の答えをコピーしたくなかったので、私のほうが少し長めです。

from math import*
x=lambda v,a:print(max(0,min(ceil(v/a/70),10))*'*')

Program manのおかげで1バイト節約


あなたは輸入を含める必要がありますが、from math import *カップルのバイトを保存します
NonlinearFruit

インポートをバイトカウント
コーディ

仕様によれば、0は1ではなく最小の星です。またimport*、スペースなしで1バイト全体を節約します。
プログラム男

おっと、最小限の読み間違えた。ヒントをありがとう
コーディ

1
@Programmanもののスペックは0が最小である、非負、ゼロでない整数の除算と乗算が!= 0に保証され、シーリングオペレータが作ると言って何かを 0-1の間、私はそこにできたと仮定しますが、それ1.作りますビューが0の場合ですが、ビューが0の場合は応答が0になり、未定義の動作(0で除算)になります。0は不可能であり、言及するべきではないことを証明できる可能性があります。
デリオス

1

実際には、14バイト

:70a\\u9ukm'**

オンラインでお試しください!

0ビューと0回答が不可能であるという事実を利用しますceil(v/a) > 0

説明:

:70a\\u9ukm'**
:70             push 70 ([70 a v])
   a            invert stack ([v a 70])
    \\          integer division twice ([v//a//70])
      u         add 1 ([v//a//70 + 1])
       9uk      push 10, make stack into list ([[v//a//70+1, 10]])
          m     minimum of list
           '**  push "*", repeat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.