Рассчитать сложность кода Гольф вопрос


43

брифинг

Сложность вопроса Code Golf можно рассчитать следующим образом:

формула

Где 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
Вы должны почти добавить [ закулисный ] для вопроса закулисный.
Адам

5
Это вопрос Code Golf. Не фактическая система, внедряемая в сайт. Кого волнует, если это нечестно?
Шон Уайлд,

13
вроде как рано, так что я могу что-то здесь упустить, но почему /700 * 10вместо /70?
Кевин Л.

4
@KevinL Ssshhhh;)
Шон Уайлд

Ответы:


49

JavaScript (ES6), 40 39 байт

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

Потому что substringобеспечивает требуемое зажимное и «потолочное» поведение. Изменить: Обычно я слишком ленив, чтобы беспокоиться, но, поскольку он получил 4 отзыва, я последовал совету @ MarsUltor, чтобы сэкономить 1 байт путем карри.


О, это хорошее использование подстроки :-)
Dylan Meeus

7
Используйте карринг:v=>a=>
только ASCII

3
Вы можете использовать substrвместо этого? Я знаю, что второй параметр имеет значение, но не уверен насчет первого ...
Дом Гастингс

1
@DomHastings: Да, хотя sliceбудет еще короче.
Yay295

5
@DomHastings Нет, оба substrи sliceинтерпретируют отрицательный аргумент как обратный отсчет от конца строки.
Нил

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

как URL в новой вкладке.


11
+1 за нестандартное мышление - эм, думая об этом ...
Адам

2
Вам нужен закрывающий тег p?
Конор О'Брайен

Мне нравится, как он обновляется, когда я меняю размер окна.
МСК

@ ConorO'Brien: Хороший вопрос!
Yay295

1
Вам тоже не нужны последние два }с.
betseg


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
@ Нил - Это верно. Он выключается на 1 балл, если количество ответов является точным делителем количества просмотров. Или, другими словами, это ожидание следующего представления. ;-)
Арно

11

Mathematica, 38 35 байт

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

Спасибо @MartinEnder за 3 байта


1
Здравствуйте и добро пожаловать в PPCG! Это отличный ответ!
NoOneIsHere

@NoOneIsHere Спасибо! Первоначально я думал о том Clip, что имеет почти такой же синтаксис, что и OP-Clamp, но потом я увидел, что у StringRepeatнего есть необязательный третий аргумент для усечения.
u54112

3
Для левой и правой потолочной скобки есть символы Юникода, которые вместе составляют всего 6 байтов вместо 9, которые вам нужны 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 байтов

Сохранено 1 байт благодаря Питеру Тейлору и 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там.
Нил

Думаю, еще один ответ, который может спасти один байт с карри:v=>a=>
Брайан Маккатон

@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

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

похоже на ответ Нилса. Использует тот факт, что Python2 делает целочисленное деление.


терпит неудачу, когда v=70иa=1
Leaky Nun

f=Может быть удален
Дырявый Nun

v, aможет статьv,a
Leaky Nun

Благодарность! должен работать сейчас. Может быть, неправильно для v = 0, a = 1 сейчас, но этот случай не может существовать, не так ли?
mathause

Это не было бы неправильно для 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);

Сохранено 10 байтов благодаря Адаму

Сохранено несколько байтов благодаря Арно


Вы можете сэкономить много, заменив (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|вместо этого $-=? (Мышление приоритета оператора может быть неправильным ...)
Дом Гастингс

@DomHastings 0|превращает отрицательное число в огромное число (ведущее в ноль *с), $-=обрезает в 0 (ведущее в десять *с), что мне и нужно
Тон Хоспел

Ах, конечно, это только положительное целое число! Спасибо за напоминание. Я уверен, что забуду это, когда мне это понадобится, хотя ... Dom
Дом Гастингс

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, 54 , 51 , 50 , 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!
Стефано Санфилиппо

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 Это то, чем я обычно пользуюсь, но в текущей версии я не вижу никакого вреда.
Мартин Эндер

Нет необходимости console.log, возвращение в порядке. Вы также можете сохранить байт v=>a=>вместо(v,a)=>
Cyoce


2

Медуза , 18 байт

P
#'*
mM/%i
10 %70

Принимает ввод в формате [a v]. Попробуйте онлайн!

объяснение

  • %является взаимным, так %70что 1/70.
  • i вводится как двухэлементный массив.
  • /%с входами iи %70уменьшает массив iпутем зеркального деления с начальным значением %70. Другими словами, он вычисляет v / (a ​​/ (1/70)) , что равно v / (70 * a) .
  • Mберет потолок этого значения и mберет максимум этого и 10.
  • #'*повторяет буквальный *символ, который много раз.
  • P выводит результат без кавычек.

2

MATLAB, 34 33 байта

Поскольку мне очень нравится этот вызов, вот один для MATLAB (выводит конечные пробелы):

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

Вдохновленный ответом @Luis Mendo. Спасибо @pajonk за сохранение одного байта.


Хороший подход! У меня был 40-байтный файл для отправки ... Кстати, вы можете сохранить один байт, используя [... '']вместо char(...). И вам действительно нужно, ceilкогда в конце вы сравниваете с целыми числами?
pajonk

2
спасибо @pajonk - на этом сайте можно кое-что узнать, чтобы мой код стал еще менее читаемым;)
mathause

2

м4, 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 часов кодирования. С положительной стороны, я наконец начал записывать общие конструкции, например, для циклов. Также пришлось сформулировать закругление / потолок, так что спасибо за это.

[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 байта сохранены путем дублирования-сохранения вместо сохранения-загрузки
  • 4 байта сохранены делением на 70
  • 6 байтов из предложений Даниеро (не строки, вместо этого ASCII; 10 => I)

[*]n=> 42P. Каждый экземпляр 10может быть заменен на I. []p=>IP
Даньеро

2

Haskell, 35 байт

Это решение так же совершенно отличается от ответа Лайкони, как и для чего-то такого тривиального. Тем не менее, оценка (на данный момент) точно такая же.

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

Это дает десять звезд, а затем сбрасывает некоторые. Легко расширить до произвольной сложности с бесконечным списком.

Мне удалось сбрить еще один байт. Но хотя все тестовые случаи работают, это не должно быть правильным в целом.

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


1

PowerShell v2 +, 47 байт

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

Отчасти ответ @ Neil's на JavaScript .

Принимает входные данные $argsи делит их, затем делит на 70и добавляет .499. Поскольку PowerShell выполняет банковское округление , это дает 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))*'*')

Сохранено 1 байт благодаря программе Man


Вам нужно включить импорт, но from math import *вы сэкономите пару байтов
NonlinearFruit

Включен импорт в подсчет байтов
Cody

Согласно спецификации, 0 - это минимальное количество звездочек, а не 1. Также сохраните весь 1 байт import*без пробелов.
Программист

Ой, я неправильно понял минимум. Спасибо за совет
Коди

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.