计算“标准高尔夫”问题的难度


43

简报

高尔夫球法典问题的难度可以这样计算:

式

v问题的观看次数在哪里

a是一个问题的答案数

和⌈ X ⌉是天花板操作

也:

钳

这个问题的当前难度:***

任务

编写一个将使用两个整数(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
对于要处理的问题,您几乎应该添加[ 不足 ] 。
2013年

5
这是一个Code Golf问题。站点中未实现任何实际系统。谁在乎这是否不公平?
肖恩·

13
还算早,所以我可能在这里错过了一些东西,但是为什么/700 * 10而不是/70呢?
凯文L

4
@KevinL Ssshhhh;)
肖恩·

Answers:


49

JavaScript(ES6),40 39字节

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

因为substring提供了所需的夹紧和“吊装”性能。编辑:通常我懒得打扰,但是因为它有4票赞成票,所以我遵循@MarsUltor的建议,以节省1个字节。


哦,这是
对子

7
使用currying:v=>a=>
仅ASCII的

3
您可以substr改用吗?我知道第二个参数会有所不同,但不确定第一个参数...
Dom Hastings

1
@DomHastings:是的,尽管slice会更短。
Yay295 '16

5
@DomHastings没有,都substrslice解释阴性参数作为从字符串的结尾开始计算了。
尼尔

38

我一直想这样做...

HTML + CSS 491 487 485字节

-4字节归功于Conor O'Brien
-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>**********

作为新标签中的网址。


11
+1对框跳出思维- EHM,盒子的思考...
亚当

2
您是否需要关闭p标签?
科纳·奥布莱恩

我喜欢它在更改窗口大小时如何更新。
YSC

@ ConorO'Brien:好点!
Yay295 '16

1
您也不需要最后两个}
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-更新。谢谢!
Arnauld

2
不行v=70, a=1吗?
尼尔

1
@Neil-是的。如果答案数与视图数的精确除数相差1点。或者换句话说,它正在期待下一个观点。;-)
Arnauld

11

Mathematica,38 35字节

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

感谢@MartinEnder 3个字节


1
您好,欢迎来到PPCG!这是一个很好的答案!
NoOneIsHere

@NoOneIsHere谢谢!最初我想到的是Clip,它的语法与OP的Clamp几乎相同,但是后来我看到它StringRepeat具有可选的第三个截断参数。
u54112 '16

3
左,右天花板括号中有Unicode字符,它们总共仅占6个字节,而不是您需要的9个字节Ceiling[]
马丁·恩德

9

EXCEL,29个字节

如果将Excel视为VBA Excel的表示形式,则可以使用

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

其中va是参考单元格的名称。


3
嗨,欢迎来到PPCG!这是一篇不错的第一篇文章!又有效也。
Rɪᴋᴇʀ

大家好@EasterlyIrk。感谢您的热烈欢迎:)
Anastasiya-Romanova秀

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

这是Neil 出色回答的C#版本。

多亏了尼尔,又节省了19个字节


尝试(int)System.Math.Floor(10-v/a/70)还是只是(int)(10-v/a/70)
尼尔

@Neil看起来我不得不70d独自一人,但工作得更好,谢谢
TheLethalCoder

1
抱歉,没有看到d那里。
尼尔

我认为可以用一个字节节省另一个字节的答案,我认为:v=>a=>
Brian McCutchon '16

@BrianMcCutchon甚至都没有意识到我该如何用C#做到这一点
TheLethalCoder

7

Java 8,57字节

使用lambda保存字节,执行计算和子字符串以返回答案。

(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.因为它是默认包含的软件包。
奥利维尔·格雷戈雷(OlivierGrégoire),

您是四舍五入而不是上限!

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

由于Leaky Nun节省了3 + 2字节并纠正了一个错误

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

类似于尼尔的答案。使用Python2进行整数除法的事实。


何时v=70a=1
-Leaky Nun

f=可去除
漏尼姑

v, a可以成为v,a
Leaky Nun

谢谢!应该现在工作。对于v = 0,现在a = 1可能是错误的,但是这种情况不存在,可以吗?
mathause

对于v = 0,a = 1,这不会是错误的。
Leaky Nun

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 / A不能为负,因此c可以简化很多,因为你并不需要检查这一点。
汤姆·范德赞丹

4

Perl,35 32字节

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

使用-E激活say,并给予以相反的顺序的参数:

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|将负数变成一个巨大的数字(导致零*s),将其$-=剪辑为0(导致10 *s),这就是我在这里需要的
Ton Hospel

啊,当然,它永远只有一个正整数!感谢您的提醒。我敢肯定,我会忘记,当我需要它,虽然...😀
大教堂黑斯廷斯

4

R,68、50 52字节

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

rep 隐式地将最小值设置为0。

感谢@plannapus和@ Anastasiya-Romanova秀发现我的错误。


您可以删除f=
Cyoce

1
您的代码输出不等于测试数据。您应该添加2个字节1+后,min(为了获得同样的产出
阿纳斯塔西-诺娃秀


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

不错@ceilingcat!
Stefano Sanfilippo,

2

JavaScript:82 73个字节

 (v,a)=>console.log("*".repeat(Math.min(Math.max(0,Math.ceil(v/a/70),10)))
  • 在Adám指出我忽略了/ 700 * 10 = / 70并删除了括号后,保存了一些字节

@Adám进行的编辑是什么?
马丁·恩德

@Adám如果人们阅读了任何答案,他们将已经有破坏者。回滚,因为当前该句子相当无用,只会使人们单击修订历史记录。
Martin Ender

@Adám这就是我通常使用的自己,但是在当前版本中我看不到任何危害。
马丁·恩德

不需要console.log它,返回就可以了。您也可以使用保存一个字节,v=>a=>而不是(v,a)=>
Cyoce


2

水母,18字节

P
#'*
mM/%i
10 %70

接受格式为的输入[a v]在线尝试!

说明

  • %是倒数,所以%70是1/70。
  • i 输入为两个元素的数组。
  • /%输入i并通过初始值的翻转除法%70减少数组。换句话说,它计算v /(a /(1/70)),等于v /(70 * a)i%70
  • M取该值的上限,并m取和的最大值10
  • #'**多次重复文字字符。
  • P 打印不带引号的结果。

2

MATLAB,34 33字节

因为我非常喜欢这个挑战,所以这里有一个MATLAB(输出尾随空白):

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

灵感来自@Luis Mendo的答案。感谢@pajonk节省了一个字节。


不错的方法!我有40个字节要发布... BTW,您可以使用[... '']代替保存一个字节char(...)。而且,您真的需要在ceil什么时候与整数进行比较?
pajonk

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采用v和的宏a,并扩展为正确的输出。大部分程序是天花板的实施。


2

直流,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:
**
>> 

更换(上图)与代码,并va与上述其各自的对应物。单引号很重要(否则您将获得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个字节
  • 保存4字节除以70
  • daniero建议的6个字节(非字符串,改为ASCII数字; 10 => I)

[*]n=> 42P。的每个实例10都可以替换为I[]p=>IP
daniero

2

Haskell,35个字节

这个解决方案与Laikoni的回答完全不同,因为它可以解决这些琐碎的事情。但是分数(目前)是完全相同的。

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

产生十颗星星,然后刮掉一些。易于扩展到具有无限列表的任意难度。

我确实设法减少了一个字节。但是,尽管所有测试用例都能正常工作,但总体而言这并不正确。

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

2

TI-Basic,39个字节

Prompt V,A
sub("**********",1,max(0,min(10,int(V/A/70)+1

1

PowerShell v2 +,47个字节

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

@Neil的JavaScript answer的端口。

需要输入$args和分裂他们,然后除以通过70,并增加了.499。由于PowerShell进行banker的四舍五入,这实际上ceil可以精确到两位小数点。如果需要更高的精度,请9根据需要添加尽可能多的。

与一起1..,这会在字符串中形成范围索引。字符串是'*'*11,即'***********'。这导致一个字符数组,因此我们将-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

字节计数中包含了导入
Cody

根据规范,0是最小的星星,而不是1。另外,整个1字节将由import*空格保存。
Program man

糟糕,我误读了下限。感谢您的提示
科迪

1
@Programman尽管规范说0为最小值,但非负非零整数的除法和乘法保证为!= 0,并且上限运算符将使0-1之间的任何值等于1,尽管我认为可以在0个视图的情况下,但是0个视图表示0个答案,这导致未定义的行为(除以0)。很有可能证明0是不可能的,甚至不应该被提及。
Delioth '16

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