Calculer la difficulté d'une question Code Golf


43

Briefing

La difficulté d'une question Code Golf peut être calculée comme suit:

formule

vest le nombre de points de vue qu'une question a

et aest le nombre de réponses qu'une question a

et ⌈ x est l' opérateur de plafond .

Également:

serrer

La difficulté actuelle de cette question: ***

Tâche

Ecrivez un programme qui prendra deux entiers (v and a)et affichera la difficulté en asterisks (*).

L'entrée peut être sous la forme d'un tableau, d'une chaîne séparée ou d'arguments de fonction séparés

Données de test

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

Exemple avec pseudocode

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

Le code le plus court en octets gagne! Les espaces de fin / fin sont autorisés.


3
Je trouve que LaTeX est plus difficile à comprendre qu'une simple chaîne de formules .. mais je suppose que tout ce que la majorité voudra ..
Shaun Wild

3
Vous devriez presque ajouter [ sournois ] pour la question sournoise.
Adám

5
C'est une question de code de golf. Pas un système réel implémenté dans le site. Qui se soucie si c'est injuste?
Shaun Wild

13
c'est un peu tôt donc il me manque quelque chose ici, mais pourquoi /700 * 10au lieu de /70?
Kevin L

4
@KevinL Ssshhhh;)
Shaun Wild

Réponses:


49

JavaScript (ES6), 40 39 octets

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

Parce que substringfournit le comportement de serrage et de "plafond" requis. Edit: Normalement, je suis trop fainéant pour le déranger, mais comme il a reçu 4 votes positifs, j’ai suivi le conseil de @ MarsUltor de sauvegarder 1 octet en curry.


Oh, c'est une bonne utilisation de la sous-chaîne :-)
Dylan Meeus

7
Utilisez currying:v=>a=>
ASCII uniquement

3
Pouvez-vous utiliser à la substrplace? Je sais que le second paramètre fait la différence, mais je ne suis pas sûr du premier ...
Dom Hastings

1
@DomHastings: Oui, bien que ce sliceserait encore plus court.
Yay295

5
@DomHastings Non, les deux substret sliceinterprètent un argument négatif comme un décompte à partir de la fin de la chaîne.
Neil

38

Je voulais faire ça depuis un moment ...

HTML + CSS 491 487 485 octets

-4 octets grâce à Conor O'Brien
-2 octets grâce à la libération des noyaux d'hélium

L'entrée est prise en tant que largeur et hauteur de la fenêtre de page; width étant le nombre de vues et height le nombre de réponses.

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

Vous pouvez l'essayer dans votre navigateur en entrant

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

comme une URL dans un nouvel onglet.


11
+1 pour sortir des sentiers battus - ehm, penser à la boîte ...
Adám

2
Avez-vous besoin de la balise p de fermeture?
Conor O'Brien

J'aime la façon dont les mises à jour changent lorsque je change la taille de la fenêtre.
YSC

@ ConorO'Brien: Bon point!
Yay295

1
Vous n'avez pas besoin des deux derniers }s aussi.
mardi

12

05AB1E, 11 octets

/70/î'*T×s£

Explication

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

Essayez-le en ligne


12

Javascript (ES6), 37 36 octets

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

Sauvé 1 octet en currying, grâce à TheLethalCoder


3
Pouvez-vous utiliser v=>a=>au lieu de (v,a)=>?
TheLethalCoder

@TheLethalCoder - Mise à jour. Merci!
Arnauld

2
Ça ne marche pas pour v=70, a=1ça?
Neil

1
@ Neil - C'est vrai. Il est décalé d'un point si le nombre de réponses est un diviseur exact du nombre de vues. Ou en d'autres termes, c'est anticiper la vue suivante. ;-)
Arnauld

11

Mathematica, 38 35 octets

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

Merci à @MartinEnder pour 3 octets


1
Bonjour et bienvenue chez PPCG! C'est une excellente réponse!
NoOneIsHere

@NoOneIsHere Merci! À l’origine, je pensais à Clipla syntaxe à peu près identique à celle de Clamp de OP, mais j’ai vu que StringRepeatle troisième argument optionnel était la troncature.
u54112

3
Il existe des caractères Unicode pour les supports de plafond gauche et droit qui ne forment ensemble que 6 octets au lieu des 9 requis Ceiling[].
Martin Ender

9

EXCEL, 29 octets

Si vous comptez Excel comme une représentation de VBA Excel, vous pouvez utiliser

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

vet asont le nom des cellules de référence.


3
Bonjour et bienvenue sur PPCG! C'est un bon premier post! Et valide aussi.
Rɪᴋᴇʀ

Bonjour aussi @EasterlyIrk. Merci pour votre accueil chaleureux :)
Anastasiya-Romanova 秀

8

CJam, 18 15 14 octets

Sauvé 1 octet grâce à Peter Taylor et 3 octets grâce à Adnan

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

Essayez-le en ligne

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

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

Ceci est la version C # de cette excellente réponse de Neil.

A sauvé 19 autres octets grâce à Neil


Essayez (int)System.Math.Floor(10-v/a/70)ou juste (int)(10-v/a/70).
Neil

@Neil On dirait que j'ai dû quitter le 70dsolitaire mais
ça

1
Désolé, je n'ai pas vu le d.
Neil

Une autre réponse qui pourrait sauver un octet avec currying, je pense:v=>a=>
Brian McCutchon

@BrianMcCutchon Je ne savais même pas comment je pouvais le faire en C # grâce
TheLethalCoder

7

Java 8, 57 octets

Utilise un lambda pour enregistrer des octets, effectue le calcul et des sous-chaînes pour renvoyer la réponse.

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

Voici ma classe pour le tester.

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

Mise à jour

  • -3 [16-08-19] Division de nombre entier utilisé
  • -10 [16-08-18] Suppression de l'importation inutile, grâce à @ OlivierGrégoire !
  • -18 [16-08-17] Renvoie la chaîne au lieu de print

2
Nice, une réponse Java qui n'est pas un train!
Ismael Miguel

4
Pas besoin de java.lang.puisque c'est le paquet inclus par défaut.
Olivier Grégoire

Vous arrondissez pas de plafond!

1
@Advancid Je l'ai testé et System.out.println((int)2.99);imprimé 2. Depuis que je prends la valeur prédéfinie de 10 puis celle-ci au sol, cela revient à retirer le plafond de 10.
NonlinearFruit

6

MATL , 12 octets

/70/0:9>42*c

Essayez-le en ligne!

Explication

L'arrondi et le bridage se font simultanément comme suit: le nombre x = v/a/70est comparé à chaque élément du tableau [0 1 ... 9]. Les nombres de ce tableau qui sont dépassés xdeviendront des astérisques et le reste sera constitué d'espaces.

/      % 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 octets

sauvegardé 3 + 2 octets et corrigé d'une erreur grâce à Leaky Nun

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

semblable à Neils répondre. Utilise le fait que Python2 effectue une division entière.


échoue quand v=70eta=1
Leaky Nun

Le f=peut être enlevé
Leaky Nun

v, apeut devenirv,a
Leaky Nun

Merci! devrait fonctionner maintenant. Peut-être faux pour v = 0, a = 1 maintenant, mais ce cas ne peut pas exister, n'est-ce pas?
Mathause

Ce ne serait pas faux pour v = 0, a = 1.
Leaky Nun

5

Haskell, 35 octets

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

[1..min(ceiling$v/a/70)10]crée une plage allant de 1 à la difficulté calculée (liste vide pour la difficulté 0). a>>brépète b length asouvent la liste .


4

Pyke, 13 à 9 octets

/70/\**T<

Essayez-le ici!

Explication:

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

4

C #, 97 89 87 77 42 41 octets

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

10 octets sauvés grâce à Adám

Enregistré quelques octets grâce à Arnauld


Vous pouvez économiser beaucoup en remplaçant (int)System.Math.Ceiling(v/a/70d)par (v+69)/(70*a)... Notez en outre que v / a ne peut pas être négatif, cpeut donc être simplifié beaucoup car vous n'avez pas besoin de vérifier cela.
Tom van der Zanden

4

Perl, 35 32 octets

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

Utilisez -Epour activer sayet donner les arguments dans l'ordre inverse:

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

Si les arguments sur STDIN sont autorisés, 29 octets sont les suivants:

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

Je ne me souviens plus si c'était exactement pareil, mais pouvez-vous en avoir à la 0|place $-=? (La priorité des opérateurs qui pensent peut ne pas être juste ...)
Dom Hastings

@DomHastings transforme 0|un nombre négatif en un nombre énorme (conduisant à zéro *s), $-=clips à 0 (conduisant à dix *s), ce dont j'ai besoin ici
Ton Hospel

Ah, bien sûr, ce n'est qu'un nombre entier positif! Merci pour le rappel. Je suis sûr que j'oublierai que quand j'en aurai besoin ...
Dom

4

R, 68, 50 52 octets

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

rep place implicitement une minute sur le nombre 0.

Merci à @plannapus et @ Anastasiya-Romanova pour avoir repéré mon erreur.


Vous pouvez supprimerf=
Cyoce

1
Les sorties de votre code ne sont pas égales aux données de test. Vous devez ajouter 2 octets supplémentaires 1+après min(pour obtenir les mêmes sorties
Anastasiya-Romanova 秀


3

Javascript ES6, 48 octets

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

3

C, 54 , 51 , 50 , 49 octets

En supposant que ce vsoit positif ou nul et apositif, le x < mincas de serrage n'est jamais rempli, car il n'y a aucun moyen que le résultat de l'opération de plafond puisse être négatif. De plus, le calcul des nombres entiers sur les valeurs non négatives donne toujours le plancher du résultat; nous ajoutons donc 1pour obtenir le plafond.

Cette solution nécessite une writefonction, fonctionne au moins sur Linux.

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

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

1
Remplacer (v=v/a/70)par (v/=a*70)enregistre 1 octet.
ceilingcat

Belle prise @ceilingcat!
Stefano Sanfilippo

2

javascript: 82 73 octets

 (v,a)=>console.log("*".repeat(Math.min(Math.max(0,Math.ceil(v/a/70),10)))
  • sauvé quelques octets après qu'Adám eut fait remarquer que j'avais oublié le / 700 * 10 = / 70 , et la suppression des parens

@ Adám c'est quoi avec l'édition?
Martin Ender

@ Adám Si les gens lisent l'une des réponses, ils auront déjà le spoiler. Revenir en arrière, car actuellement cette phrase est relativement inutile et incite simplement les gens à cliquer sur l'historique des révisions.
Martin Ender

@ Adám C'est ce que j'utilise habituellement moi-même, mais je ne vois pas de problème dans la version actuelle.
Martin Ender

Pas la peine console.log, le retour c'est bien. Vous pouvez également enregistrer un octet avec v=>a=>au lieu de(v,a)=>
Cyoce

2

Dyalog APL , 15 octets

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

'*'⍴⍨le caractère répété plusieurs fois:
10⌊min (10, ...
⎕÷entrée divisée par
70×soixante-dix fois l'
entrée

TryAPL en ligne!


Serait-il plus golfeur d'utiliser l'algorithme de Mendo?
Leaky Nun

@ LeakyNun Je ne pense pas.'*'/⍨(⎕÷70×⎕)>⍳10
Adám

2

Méduse , 18 octets

P
#'*
mM/%i
10 %70

Prend l'entrée dans le format [a v]. Essayez-le en ligne!

Explication

  • %est réciproque, donc %701/70.
  • i est entrée, sous forme de tableau à deux éléments.
  • /%avec des entrées iet %70réduit le tableau ipar division inversée avec la valeur initiale %70. En d'autres termes, il calcule v / (a ​​/ (1/70)) , ce qui est égal à v / (70 * a) .
  • Mprend le plafond de cette valeur, et mprend le maximum de cela et 10.
  • #'*répète le *caractère littéral à plusieurs reprises.
  • P affiche le résultat sans guillemets.

2

MATLAB, 34 33 octets

Parce que j'aime tant ce défi, en voici un pour MATLAB (affiche les espaces à la fin):

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

Inspiré par la réponse de @Luis Mendo. Merci à @pajonk pour avoir sauvegardé un octet.


Belle approche! J'avais un 40 octets à publier ... BTW, vous pouvez enregistrer un octet en utilisant à la [... '']place de char(...). Et avez-vous vraiment besoin du ceilmoment où, à la fin, vous comparez avec des entiers?
pajonk

2
merci @pajonk - on peut vraiment apprendre certaines choses sur ce site pour rendre mon code encore moins lisible;)
mathause

2

m4, 136 135 octets

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

Définit une macro fqui prend vet a, et se développe jusqu'à la sortie correcte. La majeure partie du programme est une mise en œuvre du plafond.


2

dc, 110 108 104 98 octets

C'était un doozy puisque trancher n'est pas une chose. En outre, dc ne manipule pas les chaînes. J'attendais vraiment une chaîne qui nécessiterait moins de 5 heures de codage. Sur le plan positif, j'ai finalement commencé à écrire des constructions communes, comme des boucles for. Aussi dû formuler arrondi / plafond, alors merci pour cela.

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

Invoqué dans 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:
**
>> 

Remplacer (ci-dessus) par le code, et vet aavec leurs homologues respectifs ci-dessus. Les guillemets simples sont importants (sinon, vous obtiendrez des informations sur l'histoire de bash).


A expliqué:

[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

C’est probablement plus facile à jouer au golf, mais j’essayais de le terminer pour éviter une optimisation prématurée.

  • 2 octets enregistrés en dupliquant-enregistrez au lieu d'enregistrer-charger
  • 4 octets enregistrés divisant par 70
  • 6 octets des suggestions de daniero (non-chaînes, chiffres ASCII à la place; 10 => I)

[*]n=> 42P. Chaque instance de 10peut être remplacée par I. []p=>IP
daniero

2

Haskell, 35 octets

Cette solution est tout aussi différente de la réponse de Laikoni car elle procure un résultat aussi trivial. Pourtant, le score (pour l'instant) est exactement le même.

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

Cela produit dix étoiles, puis en rase certaines. Facile à étendre à la difficulté arbitraire avec une liste infinie.

J'ai réussi à supprimer un octet de plus. Mais bien que tous les cas de test fonctionnent, cela ne devrait pas être correct en général.

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

2

TI-Basic, 39 octets

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

1

PowerShell v2 +, 47 octets

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

Un peu la réponse JavaScript de @ Neil .

Prend les entrées $argset les divise, puis les divise en 70et ajoute .499. Etant donné que PowerShell effectue l’arrondissement bancaire, laceil précision est de deux décimales. Si une précision supplémentaire est requise, fixez autant de points supplémentaires 9que nécessaire.

Avec 1.., cela forme un index de plage dans une chaîne. La chaîne est '*'*11, c'est à dire '***********'. Cela donne un tableau de caractères, donc nous -joinle regroupons dans une chaîne. Cette chaîne est laissée sur le pipeline et la sortie est implicite. Comme la réponse de Neil, cela "pince" efficacement la sortie entre 1 et 10 étoiles.

Suite de tests

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 octets

Je ne voulais pas copier la réponse Python 2, alors la mienne est un peu plus longue.

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

Sauvé 1 octet grâce à l'homme du programme


Vous devez inclure les importations, mais vous from math import *économiserez quelques octets.
NonlinearFruit

Importation incluse dans le nombre d'octets
Cody

Selon la spécification, 0 est le nombre minimum d'étoiles, pas 1. Enregistrez également un octet entier import*sans espace.
Homme du programme

Oups, j'ai mal interprété le minimum. Merci pour le tuyau
Cody

1
@Programman Bien que la spécification dit 0 est minimum, la division et la multiplication des non-négatif, des entiers non nuls est garanti à! = 0, et l'opérateur de plafond fera quoi que ce soit entre 0-1 et faire 1. Bien que je suppose qu'il pourrait y sois le cas de 0 vues, cependant 0 vues implique 0 réponses, ce qui conduit à un comportement indéfini (division par 0). Il est probablement prouvable que 0 est impossible et ne devrait même pas être mentionné.
Delioth

1

En fait, 14 octets

:70a\\u9ukm'**

Essayez-le en ligne!

Profite du fait que 0 vues et 0 réponses sont impossibles, et donc ceil(v/a) > 0.

Explication:

: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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.