Calcular a dificuldade de uma pergunta do Code Golf

43

Briefing

A dificuldade de uma pergunta do Code Golf pode ser calculada da seguinte forma:

Fórmula

Onde vestá o número de visualizações de uma pergunta

e aé o número de respostas que uma pergunta tem

e ⌈ x ⌉ é o operador de teto .

Além disso:

braçadeira

Dificuldade atual da pergunta: ***

Tarefa

Escreva um programa que use dois números inteiros (v and a)e produza a dificuldade asterisks (*).

A entrada pode estar na forma de uma matriz, uma sequência separada ou como argumentos de função separados

Dados de teste

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

Exemplo com pseudocódigo

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

O código mais curto em bytes vence! Espaços à direita / à direita são permitidos.

Shaun Wild
fonte
3
Acho que LaTeX mais difícil de entender que uma seqüência simples fórmula .. mas o que a maioria quer eu acho ..
Shaun selvagem
3
Você quase deve adicionar [ underhanded ] para a pergunta que está sendo escondida.
Adám 17/08/16
5
Esta é uma pergunta do Code Golf. Não é um sistema real sendo implementado no site. Quem se importa se é injusto?
Shaun Wild
13
é meio cedo, então talvez eu esteja perdendo alguma coisa aqui, mas por que em /700 * 10vez de /70?
Kevin L
4
@KevinL Ssshhhh;)
Shaun Wild

Respostas:

49

JavaScript (ES6), 40 39 bytes

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

Porque substringfornece o comportamento de fixação e "teto" necessário. Edit: Normalmente, eu sou muito preguiçoso para me preocupar, mas porque ele recebeu 4 votos positivos, segui o conselho da @ MarsUltor para economizar 1 byte ao currying.

Neil
fonte
Oh, que é um uso agradável de substring :-)
Dylan Meeus
7
Use currying:v=>a=>
somente ASCII
3
Você pode usar substr? Eu sei que o segundo parâmetro faz a diferença, mas não tenho certeza sobre o primeiro ...
Dom Hastings
1
@ DomHastings: Sim, mas sliceseria ainda mais curto.
Yay295
5
@DomHastings Não, ambos substre sliceinterpretam um argumento negativo como contagem regressiva do final da string.
Neil
38

Eu tenho vontade de fazer isso por um tempo ...

HTML + CSS 491 487 485 bytes

-4 bytes graças a Conor O'Brien
-2 bytes graças ao lançamento de núcleos de hélio

A entrada é considerada como a largura e a altura da janela da página; largura sendo o número de Visualizações e altura sendo o número de Respostas.

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

Você pode experimentá-lo no seu navegador digitando

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

como um URL em uma nova guia.

Yay295
fonte
11
+1 para pensar fora da caixa - ehm, pensar na caixa ...
Adám
2
Você precisa da tag p de fechamento?
Conor O'Brien
Eu amo como ele é atualizado à medida que altero o tamanho da janela.
YSC
@ ConorO'Brien: Bom ponto!
precisa saber é o seguinte
1
Você não precisa dos dois últimos }s também.
betseg 18/08/16
12

05AB1E, 11 bytes

/70/î'*T×s£

Explicação

/            # 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

Experimente online

Emigna
fonte
12

Javascript (ES6), 37 36 bytes

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

Economizou 1 byte ao currying, graças a TheLethalCoder

Arnauld
fonte
3
Você pode usar v=>a=>em vez de (v,a)=>?
TheLethalCoder
@TheLethalCoder - Atualizado. Obrigado!
Arnauld
2
Não funciona para v=70, a=1isso?
Neil
1
@ Neil - Isso mesmo. Desativa 1 ponto se o número de respostas for um divisor exato do número de visualizações. Ou, em outras palavras, está antecipando a próxima exibição. ;-)
Arnauld
11

Mathematica, 38 35 bytes

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

Obrigado a @MartinEnder por 3 bytes

u54112
fonte
1
Olá, e bem-vindo ao PPCG! Esta é uma ótima resposta!
NoOneIsHere 17/08/16
@NoOneIsHere Thanks! Originalmente, eu estava pensando Clip, que tem praticamente a mesma sintaxe que o Clamp do OP, mas então vi que StringRepeattem o terceiro argumento opcional para truncamento.
U54112
3
Existem caracteres Unicode para o suporte de teto esquerdo e direito que juntos compõem apenas 6 bytes em vez dos 9 necessários Ceiling[].
Martin Ender
9

EXCEL, 29 bytes

Se você contar o Excel como uma representação do VBA Excel, poderá usar

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

onde ve asão o nome das células de referência.

Anastasiya-Romanova 秀
fonte
3
Olá, e bem-vindo ao PPCG! Este é um bom primeiro post! E válido também.
Rɪᴋᴇʀ
Oi também @EasterlyIrk. Obrigado pela recepção calorosa :)
Anastasiya-Romanova秀
8

CJam, 18 15 14 bytes

Economizou 1 byte graças a Peter Taylor e 3 bytes graças a Adnan

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

Experimente online

'*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
Gato de negócios
fonte
8

C #, 68 49 48 bytes

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

Esta é a versão em C # desta excelente resposta de Neil.

Guardou outros 19 bytes graças a Neil

TheLethalCoder
fonte
Tente (int)System.Math.Floor(10-v/a/70)ou apenas (int)(10-v/a/70).
194 Neil
@Neil Parece que eu tive que deixar a 70dsós, mas funciona melhor graças
TheLethalCoder
1
Desculpe, não vi o dlá.
Neil
Outra resposta que poderia salvar um byte com currying, eu penso:v=>a=>
Brian McCutchon
@BrianMcCutchon nem percebi como eu poderia fazê-lo em C # graças
TheLethalCoder
7

Java 8, 57 bytes

Usa uma lambda para salvar bytes, executa o cálculo e as substrings para retornar a resposta.

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

Aqui está a minha turma para testá-lo.

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

Atualizar

  • -3 [16-08-19] Divisão inteira utilizada
  • -10 [16-08-18] Removida a importação desnecessária, graças a @ OlivierGrégoire !
  • -18 [16-08-17] Retornar string em vez de print
NonlinearFruit
fonte
2
Bom, uma resposta Java que não é um trem!
Ismael Miguel
4
Não é necessário, java.lang.pois é o pacote incluído padrão.
Olivier Grégoire
Você não está arredondando o teto!
1
@Advancid eu testei e System.out.println((int)2.99);impressões 2e desde que eu tomar o valor pré-pavimentado de 10 e no chão então, é o mesmo que tomar o teto longe de 10.
NonlinearFruit
6

MATL , 12 bytes

/70/0:9>42*c

Experimente online!

Explicação

O arredondamento e a fixação são feitos simultaneamente da seguinte forma: o número x = v/a/70é comparado com cada elemento da matriz [0 1 ... 9]. Os números dessa matriz excedidos xse tornarão asteriscos, e o restante serão espaços.

/      % 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
Luis Mendo
fonte
5

Python2, 32 bytes

economizou 3 + 2 bytes e corrigido por um erro graças a Leaky Nun

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

semelhante à resposta de Neils. Usa o fato de que Python2 faz divisão inteira.

Mathause
fonte
falha quando v=70e #a=1
Leaky Nun
O f=pode ser removido
Leaky Nun
v, apode se tornarv,a
Leaky Nun
obrigado! deve funcionar agora. Pode estar errado para v = 0, a = 1 agora, mas esse caso não pode existir, pode?
mathause
Isso não seria errado para v = 0, a = 1.
Leaky Nun
5

Haskell, 35 bytes

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

[1..min(ceiling$v/a/70)10]cria um intervalo de 1 à dificuldade calculada (uma lista vazia para a dificuldade 0). a>>brepete a lista b length afrequentemente.

Laikoni
fonte
4

Pyke, 13 9 bytes

/70/\**T<

Experimente aqui!

Explicação:

/         -    num_1 / num_2
 70/      -   ^ / 70
    \**   -  "*" * ^
       T< - ^[:10]
Azul
fonte
4

C #, 97 89 87 77 42 41 bytes

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

Economizou 10 bytes graças a Adám

Economizou alguns bytes graças a Arnauld

TheLethalCoder
fonte
Você pode economizar muito substituindo (int)System.Math.Ceiling(v/a/70d)por (v+69)/(70*a)... Observe que, além disso, o v / a não pode ser negativo; portanto, cpode ser muito simplificado, pois você não precisa verificar isso.
Tom van der Zanden
4

Perl, 35 32 bytes

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

Use -Epara ativar saye fornecer os argumentos na ordem inversa:

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

Se argumentos em STDIN são permitidos, o seguinte é 29 bytes:

(echo 163; echo 2) | perl -pe '$_="*"x(10-($-=10-$_/70/<>))'
Ton Hospel
fonte
Não me lembro se seria exatamente o mesmo, mas você pode ter em 0|vez de $-=? (Pensando precedência do operador pode não estar certo ...)
Dom Hastings
@DomHastings 0|faz um número negativo em um número enorme (levando a zero *s), $-=clips para 0 (levando a dez *s), que é o que eu preciso aqui
Ton Hospel
Ah, é claro, é apenas um número inteiro positivo! Obrigado por lembrar. Eu tenho certeza que vou esquecer que quando eu precisar dele embora ... 😀
Dom Hastings
4

R, 68, 50 52 bytes

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

rep coloca implicitamente um mínimo no número 0.

Obrigado a @plannapus e @ Anastasiya-Romanova 秀 por detectar meu erro.

user5957401
fonte
Você pode removerf=
Cyoce
1
As saídas do seu código não são iguais aos dados de teste. Você deve adicionar mais 2 bytes 1+depois min(, a fim de obter os mesmos resultados
Anastasiya-Romanova秀
3

Javascript ES6, 48 bytes

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

fonte
3

C, 54 , 51 , 50 , 49 bytes

Supondo que vseja positivo ou zero e apositivo, a x < mincaixa de fixação nunca é atendida, pois não há como o resultado da operação no teto ser negativo. Além disso, a matemática inteira com valores não negativos sempre produz o piso do resultado, então adicionamos 1para obter o teto.

Esta solução requer uma writefunção, funciona no Linux pelo menos.

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

Teste principal:

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');
}
Stefano Sanfilippo
fonte
1
A substituição (v=v/a/70)por (v/=a*70)salva 1 byte.
ceilingcat
Boa captura @ceilingcat!
Stefano Sanfilippo
2

javascript: 82 73 bytes

 (v,a)=>console.log("*".repeat(Math.min(Math.max(0,Math.ceil(v/a/70),10)))
  • salvei alguns bytes depois que Adám apontou que eu ignorava o / 700 * 10 = / 70 , e a remoção de parênteses
Dylan Meeus
fonte
@ Adám, o que há com a edição?
Martin Ender
@ Adám Se as pessoas lerem alguma das respostas, já terão o spoiler. Revertendo, porque atualmente essa frase é bastante inútil e apenas faz as pessoas clicarem no histórico de revisões.
Martin Ender
@ Adám É o que eu costumo usar, mas não vejo nenhum dano na versão atual.
Martin Ender
Não há necessidade console.log, o retorno é bom. Você também pode salvar um byte em v=>a=>vez de(v,a)=>
Cyoce 18/08/16
2

Dyalog APL , 15 bytes

'*'⍴⍨10⌊⌈⎕÷70×⎕

'*'⍴⍨o caractere repetiu isso muitas vezes:
10⌊min (10, ...
⎕÷entrada dividida por
70×setenta vezes a
entrada

TryAPL online!

Adão
fonte
Seria mais golfista usar o algoritmo de Mendo?
Leaky Nun
@LeakyNun Acho que não:'*'/⍨(⎕÷70×⎕)>⍳10
Adám 17/08/16
2

Água-viva , 18 bytes

P
#'*
mM/%i
10 %70

Recebe entrada no formato [a v]. Experimente online!

Explicação

  • %é recíproco, assim %70como 1/70.
  • i é entrada, como uma matriz de dois elementos.
  • /%com entradas ie %70reduz a matriz ipor divisão invertida com valor inicial %70. Em outras palavras, ele calcula v / (a ​​/ (1/70)) , que é igual a v / (70 * a) .
  • Massume o teto desse valor e massume o máximo disso e 10.
  • #'*repete o *caractere literal várias vezes.
  • P imprime o resultado sem aspas.
Zgarb
fonte
2

MATLAB, 34 33 bytes

Como eu gosto muito desse desafio, aqui está um para o MATLAB (saídas à esquerda de espaços em branco):

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

Inspirado na resposta de @Luis Mendo. Agradecemos a @pajonk por salvar um byte.

Mathause
fonte
Boa abordagem! Eu tinha um de 40 bytes para postar ... BTW, você pode salvar um byte usando em [... '']vez de char(...). E você realmente precisa de ceilquando, no final, você está comparando com números inteiros?
Pajonk
2
graças @pajonk - pode realmente aprender algumas coisas sobre este site para fazer o meu código ainda menos legível;)
mathause
2

m4, 136 135 bytes

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

Define uma macro fque leva ve a, e se expande para a saída correta. A maior parte do programa é uma implementação de teto.

Homem do programa
fonte
2

dc, 110 108 104 98 bytes

Isso foi um delírio, já que fatiar não é uma coisa. Além disso, dc não manipula seqüências de caracteres. Eu realmente estava esperando por uma string que seria <5 horas de codificação. No lado positivo, finalmente comecei a escrever construções comuns, como para loops. Também tive que formular o arredondamento / teto, então obrigado por isso.

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

Chamado no 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:
**
>> 

Substituindo (acima) pelo código e / ve apor suas respectivas contrapartes acima. As aspas simples são importantes (caso contrário, você obtém o histórico do bash).


Explicado:

[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

Provavelmente é mais capaz de jogar golfe, mas eu estava tentando finalizá-lo para evitar a otimização prematura.

  • 2 bytes salvos ao salvar duplicados em vez de salvar salvos
  • 4 bytes salvos dividindo por 70
  • 6 bytes das sugestões de daniero (sem strings, números ASCII; 10 => I)
Delioth
fonte
[*]n=> 42P. Cada instância de 10pode ser substituída por I. []p=>IP
daniero 17/08/16
2

Haskell, 35 bytes

Esta solução é tão completamente diferente da resposta de Laikoni quanto para algo tão trivial. No entanto, a pontuação (por enquanto) é exatamente a mesma.

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

Isso produz dez estrelas, depois raspa algumas. Fácil de estender à dificuldade arbitrária com uma lista infinita.

Eu consegui raspar mais um byte. Mas, embora todos os casos de teste funcionem, isso não deve estar correto em geral.

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

TI-Basic, 39 bytes

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

PowerShell v2 +, 47 bytes

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

De certa forma, um porto da resposta JavaScript de @ Neil .

Pega entrada $argse as divide, depois divide por 70e adiciona .499. Como o PowerShell faz o arredondamento do banqueiro , isso é efetivamente ceilduas casas decimais de precisão. Se for necessária precisão adicional, prenda quantos 9s adicionais forem necessários.

Junto com o 1.., isso forma um índice de intervalo em uma sequência. A cadeia é '*'*11, ie '***********'. Isso resulta em uma matriz de caracteres, para que -joinjuntos de volta em uma string. Essa cadeia é deixada no pipeline e a saída é implícita. Como a resposta de Neil, isso efetivamente "prende" a saída entre 1 e 10 estrelas.

Suíte de teste

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 -> **********
AdmBorkBork
fonte
1

Python 3, 69 68 bytes

Eu não queria copiar a resposta do Python 2, então a minha é um pouco mais longa.

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

Economizou 1 byte graças ao Program man

Cody
fonte
Você precisa incluir importações, mas from math import *salvará alguns bytes #
NonlinearFruit
Incluiu a importação para a contagem de bytes
Cody
De acordo com a especificação, 0 são as estrelas mínimas, não 1. Salve também um byte inteiro import*sem espaço.
Program man
Opa, eu interpretei errado o mínimo. Obrigado pela dica
Cody
1
@ Programman Embora a especificação diga que 0 é mínimo, é garantida a divisão e multiplicação de números inteiros não-negativos, diferentes de zero! = 0, e o operador de teto fará qualquer coisa entre 0-1 e o fará 1. Embora eu suponha que poderia seja o caso de 0 visualizações, no entanto 0 visualizações implica 0 respostas, o que leva a um comportamento indefinido (divisão por 0). Provavelmente é provável que 0 seja impossível e nem deva ser mencionado.
Delioth 17/08/16
1

Na verdade, 14 bytes

:70a\\u9ukm'**

Experimente online!

Aproveita o fato de que 0 visualizações e 0 respostas são impossíveis e, portanto, ceil(v/a) > 0 ,.

Explicação:

: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
Mego
fonte