Обчисліть складність питання про Code Code


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
Ви майже повинні додати [ невміло ] для того, що питання є недоступним.
Adám

5
Це питання Code Golf. На сайті не реалізована реальна система. Кого хвилює, якщо це несправедливо?
Shaun Wild

13
своєрідно рано, тому я, можливо, щось тут не пропускаю, але чому /700 * 10замість цього /70?
Кевін Л

4
@KevinL Ssshhhh;)
Shaun Wild

Відповіді:


49

JavaScript (ES6), 40 39 байт

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

Тому що substringзабезпечує необхідну затискаючу та "стельову" поведінку. Редагувати: Зазвичай я занадто ліниво турбуватись, але, оскільки у нього було 4 відгуки, я дотримувався поради @ MarsUltor, щоб зберегти 1 байт, проклавши.


О, це приємне використання підрядків :-)
Ділан Мейус

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 байту завдяки випуску гелієвого ядра

Введення приймається як ширина та висота вікна сторінки; ширина - кількість переглядів, а висота - кількість відповідей.

<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 за роздуми з коробки - ем, роздуми про коробку ...
Adám

2
Вам потрібен закриваючий тег p?
Conor O'Brien

Мені подобається, як воно оновлюється, коли я змінюю розмір вікна.
YSC

@ ConorO'Brien: Добрий момент!
Yay295

1
Останні два }s теж вам не потрібні .
betseg


12

Javascript (ES6), 37 36 байт

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

Заощаджено 1 байт за допомогою каші, завдяки TheLethalCoder


3
Можна використовувати v=>a=>замість (v,a)=>?
TheLethalCoder

@TheLethalCoder - оновлено. Дякую!
Арнольд

2
Не працює, v=70, a=1чи не так?
Ніл

1
@Neil - Саме так. Він відключається на 1 бал, якщо кількість відповідей є точним дільником кількості переглядів. Або кажучи іншими словами, це передчуває наступний погляд. ;-)
Арнольд

11

Математика, 38 35 байт

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

Завдяки @MartinEnder за 3 байти


1
Привіт, і ласкаво просимо до PPCG! Це чудова відповідь!
NoOneIsHere

@NoOneIsHere Дякую! Спочатку я думав Clip, який має майже той самий синтаксис, що і затискач ОП, але потім я побачив, що StringRepeatмає необов'язковий третій аргумент для усікання.
u54112

3
Для лівого та правого кронштейнів стелі є символи Unicode, які разом складають лише 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).
Ніл

@Neil Схоже, що мені довелося залишити в 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]

схожий на Neils answer. Використовує той факт, що Python2 робить ціле ділення.


не вдається, коли v=70іa=1
Leaky Nun

Банку f=можна вилучити
Лина монашка

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

Дякую! повинні працювати зараз. Може бути неправильним для v = 0, a = 1 зараз, але цей випадок не може існувати, чи не так?
матауза

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

Збережено 10 байт завдяки Adám

Збережено кілька байт завдяки Арнольду


Ви можете зберегти цілу партію, замінивши (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 (веде до десяти *с), що мені тут потрібно
Тон Євангелія

Ах, звичайно, це лише колись додатне ціле число! Дякуємо за нагадування. Я впевнений, що забуду, що коли мені це потрібно, 😀
Дом Гастінгс

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

@ Adám Саме цим я зазвичай користуюся, але я не бачу шкоди в поточній версії.
Мартін Ендер

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

2

Діалог APL , 15 байт

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

'*'⍴⍨персонаж повторював це багато разів:
10⌊хв (10, ...
⎕÷введення, поділене на введення
70×сімдесяти разів)

СпробуйтеAPL онлайн!


Чи було б гравцем використовувати алгоритм Мендо?
Leaky Nun

@LeakyNun Я не думаю, що так:'*'/⍨(⎕÷70×⎕)>⍳10
Adám

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 Мендо. Дякуємо @pajonk за збереження одного байта.


Гарний підхід! У мене був 40-байтний файл для публікації ... До речі, ви можете зберегти один байт, використовуючи [... '']замість 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 годин кодування. З позитивного боку я нарешті почав записувати загальні конструкції, як для циклів. Також довелося сформулювати закруглення / стелю, тому спасибі за це.

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

Викликається в баш:

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відповідними аналогами вище. Одиночні цитати є важливими (інакше ви отримуєте інформацію про історію баша).


Пояснили:

[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
daniero

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

Дещо порт відповіді JavaScript на Ніла @ Neil .

Бере введення $argsта ділить їх, потім ділить це на 70і додає .499. Оскільки PowerShell здійснює округлення банкіра , це фактично ceilдо двох десяткових точок точності. Якщо потрібна додаткова точність, застосуйте стільки додаткових 9s, скільки потрібно.

Поряд з 1.., це формує індекс діапазону в рядок. Рядок є '*'*11, тобто '***********'. Це призводить до масиву char, тому ми -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

Включено імпорт до кількості байтів
Коді

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

На жаль, я неправильно прочитав. Дякую за підказку
Коді

1
@Programman Хоча специфікація каже, що 0 мінімальна, ділення та множення невід'ємних, ненульових цілих чисел гарантовано до! = 0, а оператор на стелі зробить що- небудь між 0-1 і зробить це 1. Хоча я гадаю, що міг би бути у випадку 0 переглядів, проте 0 поглядів передбачає 0 відповідей, що призводить до невизначеної поведінки (поділ на 0). Ймовірно, можна довести, що 0 неможливо і навіть не слід згадувати.
Delioth

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.