Час коригувати деякі ціни!


19

Я впевнений, що ви знаєте про схему цін $ 9,99, замість того, щоб використовувати 10 доларів. Що ж, у вашій новій роботі сис-адміністратора у великому роздрібному магазині вони хочуть, щоб ціни дотримувалися аналогічної схеми:

  • Усі ціни є цілими доларами, без центів.
  • Усі ціни повинні закінчуватися 5 або 9, округлюючись до найближчих, але вгору, якщо остання цифра є правильною між 5 і 9. (Стосовно останньої цифри 2 і 7)
  • Найнижчий внесок - 1 долар, а найнижча ціна, що виводиться, повинна становити 5 доларів.

Ваш вхід - це список цілих чисел:

12
8
41
27
144
99
3

І на виході повинен бути список нових цін. У наведеному вище випадку:

15
9
39
29
145
99
5

Чи можемо ми взяти вклад по черзі? Або відокремлений чимось, крім нового рядка?
mınxomaτ

Для простоти я вважаю, що вказаний формат найкращий, тому ви можете зосередитись на вирішенні фактичної проблеми, а не на форматуванні. Але звичайно дозволено одне ціле число в одному рядку. :)
ciscoheat

1
Так, список, що відповідає мові, мабуть, легше обробляти. Але як довго я можу зберігати зміни технічних характеристик? Це одна з причин, коли я вагався розмістити що-небудь у коді гольфу.
ciscoheat

2
Newline тепер випадає як вимога, вказуючи лише "список". Я сподіваюся, що це зробить все краще, а не гірше ...!
ciscoheat

6
"Але як довго я можу продовжувати змінювати технічні характеристики? Це одна з причин, коли я вагався розмістити що-небудь у коді гольфу." Якщо ви цього не знаєте, ви можете розмістити ідеї для викликів у пісочниці, де ви зможете отримати зворотній зв'язок спільноти перед тим, як виклик буде розповсюджений, таким чином, щоб подібні речі можна було (сподіваємось) вказати та виправити до того, як зміни скасують існуючі відповіді.
Мартін Ендер

Відповіді:


13

Brainfuck, 4428 байт (недійсний)

Як тільки я зрозумів, що алгоритм працює, я втратив інтерес і не закінчив обробник вводу. Ось чому це рішення технічно вирішує проблему, але є дуже важким у використанні. Коли ви запускаєте програму в інтерактивному перекладачі (швидше краще), ви можете ввести своє "число". Його потрібно ввести в Base256, якщо ваш перекладач не підтримує перетворення чисел (моє). Таким чином, максимальна ціна, яку ви можете ввести, становить 255.

Потім він виконує циклічний модуль, якщо число більше 9, щоб розділити всі цифри, крім останньої. Результати поділу зберігаються, тоді як остання цифра округляється до 5 або 9. Потім вони додаються та друкуються. Потім програма очищає всі використані регістри (можливо, надмірне число) та запитує наступне число.

Він обробляє всі особливі випадки ( $1, і $20/$21 -> $19т.д.). Подивіться, як воно працює за номером 4тут (близько 3 хвилин, відео скорочено):

video demo

Код

>+<+[>>>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<[>[-]+<-]>
[<+>>>>>>>>>>>[-],>>[-]<[-]<[>+<<<<<<<<<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>>>
>>>>[-]>[<+<<<<<<<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>>>>>>[-]+++++++++>[<<<<+
>>>>-]<[<<<<<<+>+<<+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]
+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]>>[>>>>-<<<<[-]]<<<[-]<->>>>>>>>[<<<<<<<<->>>>
>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>[>>>>>+<<<<<<<<<<<<<<<->>>>>>>>>>[-]]<<<<<<<<<
-]>>>>>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<<<
<[>[-]+<-]>[<+>>>>>>>>>>>>[-]<[>+<<<<<<<<<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>
>>>>>[-]++++++++++>>>[<<<<<<<+>>>>>>>-]<<<<<<<[>>>>[<<<<<+<<+>>>>>>>-]<<<<<<<[>>>>>>>+<<
<<<<<-]>>[>-[<<+<+>>>-]<<<[>>>+<<<-]+>[<->[-]]<[>>-[>>>>>>>>-<<<<<<<<[-]]+<<[-]]>>-]>>>>
>>>>+<<<<<<<]>>>>>[-]>>[<<+<<<<<<<<+>>>>>>>>>>-]<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<<<-]>>>>>>
>[-]++++++++++>[<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>[>+<<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<
<<<-]>-]>>>>>>>>>[-]<<[>>+<<-][-]>>>[<<<+<<<<<<<<+>>>>>>>>>>>-]<<<<<<<<<<<[>>>>>>>>>>>+<
<<<<<<<<<<-]>>>>>>>[-]>>>[<<<+<<<<<<<+>>>>>>>>>>-]<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<<<-]>>>>
>>>[>+<<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>>>>>[-]<<<[>>>+<<<-][-]>[<+<<<<<
<<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>>>>>>[-]>>>[<<<+<<<<<<<+>>>>>>>>>>-]<<<<
<<<<<<[>>>>>>>>>>+<<<<<<<<<<-]>>>>>>>[>-<<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>
>>>>[-]<[>+<-]<<<<<<<<<-]>>>>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>-]
<<<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>>>>>>>>>[-]>>[<<+<<<<<<<<+>>>>>>>>>>-]<<<<<<<<<<[>>>>
>>>>>>+<<<<<<<<<<-]>>>>>>>[-]>[<<<<+>>>>-]<[<<<<<<+>+<<+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<
-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]>>[>>>>-<<
<<[-]]<<<[-]<->>>>>>>>[<<<<<<<<->>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>[>>>>>>>>>
>>>+<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>>[-]]<<<<<<<<<-]>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<+>>>>>
>>>>>>>>>>-]<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>>>>>>>>>[-]>[<+<<<<<<<<+>>>>>>>>>-]<<<<<<<<<[>
>>>>>>>>+<<<<<<<<<-]>>>>>>>[-]++++>[<<<<+>>>>-]<[<<<<<<+>+<<+>>>>>>>-]<<<<<<<[>>>>>>>+<<
<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]>>[>>
>>-<<<<[-]]<<<[-]<->>>>>>>>[<<<<<<<<->>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>[>>>>
>>+<<<<<<<<<<<<<<<<->>>>>>>>>>[-]]<<<<<<<<<-]<[>[-]+<-]>[<+>>>>>>>>>>>[-]+++++++++>>>>>>
>>+<<<<<<<<<<<<<<<<<<<->-]>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>-]<<<<<<<<<<<
<<<<<[>[-]+<-]>[<+>>>>>>>>>>[-]>[<+<<<<<<<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>
>>>>>[-]++>[<<<<+>>>>-]<[<<<<<<+>+<<+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>[>>[<+<<<+>>>>-
]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]<[>>>>>>>-<<<<<<<[-]]>>>[-]>>
>[-]>>>>[<<<<+<<<<<<<+>>>>>>>>>>>-]<<<<<<<<<<<[>>>>>>>>>>>+<<<<<<<<<<<-]>>>>>>>>>>>>[-]+
++++++++<<<<<[<<<+>>>-]>>>>>[<<<<<<<<<<<+>+<<+>>>>>>>>>>>>-]<<<<<<<<<<<<[>>>>>>>>>>>>+<<
<<<<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]
>>[>>>-<<<[-]]<<<[-]>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<<[[-]>>>>>>>[<<<<<<<+>+>>>>>>-]<<<
<<<[>>>>>>+<<<<<<-]<[>>>>>>>>-<<<<<<<<[-]]]->>>>>>>>[<<<<<<<<->>>>>>>>-]<<<<<<<<[>>>>>>>
>+<<<<<<<<-]>>>>>>>>[>>>>>>>>+<<<<<<<<<<<<<<<<<<->>>>>>>>>>[-]]<<<<<<<<<-]<[>[-]+<-]>[<+
>>>>>>>>>>[-]>>>[<<<+<<<<<<<<+>>>>>>>>>>>-]<<<<<<<<<<<[>>>>>>>>>>>+<<<<<<<<<<<-]>>>>>>>>
->>>[-]<<<[>>>+<<<-]>[-]>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<->-]>>>>>>>>>>>>>>>>>[<<<<<<
<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>>>>>>>>>>[-]+++++<<<<<
<<<<<-]>>>>>>>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>-]<<<<[<<<<
<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>>>>>>>>>[-]>>>[<<
<+<<<<<<<<+>>>>>>>>>>>-]<<<<<<<<<<<[>>>>>>>>>>>+<<<<<<<<<<<-]>>>>>>>[-]>>[<<+<<<<<<<+>>>
>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>>>>>>[>+<<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<
<<-]>>>>>>>>>>>[-]<<<[>>>+<<<-][-]>>>[<<<+<<<<<<<<+>>>>>>>>>>>-]<<<<<<<<<<<[>>>>>>>>>>>+
<<<<<<<<<<<-]>[-]>[-]>[-]>[-]>>>>[<<<<<+[>+<<<<+>>>-]<<<[>>>+<<<-]+>>>>----------[<<<<->
>>>[-]]<<<<[>>+>[-]<<<-]>>[>>+<<<<+>>-]<<[>>+<<-]+>>>>----------[<<<<->>>>[-]]<<<<[>+>[-
]<<-]>>>>>>>>-]<<<<<<<[<++++++++[>++++++>++++++<<-]>.>.[-]<[-]]>[<<++++++++[>>++++++<<-]
>>.[-]]<<++++++++[>>>++++++<<<-]>>>.[-]<<<++++++++++.[-]>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<
<->-]<[>[-]+<-]>[<+<->>-]<<]

Ви отримаєте голос за честолюбство, хочете, щоб я міг дати більше одного. :)
ciscoheat

8
Я думаю, що gif потребує попередження про епілепсію.
Алекс А.

12

CJam, 19 17 байт

q~{2-Ab)4>59s=N}/

Перевірте це тут.

Приймає введення як список у стилі CJam та повертає вихідний рядок у новому рядку.

Пояснення

qN/{   e# Run this block for each line of the input...
  ~    e#   Evaluate the current line to get the integer.
  2-   e#   Subtract 2 to get all but the last digit right.
  Ab)  e#   Convert to base 10 (discarding a potential minus sign) and split off
       e#   the last digit.
  4>   e#   Test if it's greater than 4.
  59s= e#   Select the correct digit from the string "59" based on this result.
  N    e#   Push a line feed.
}/

11

Пітон 2, 47

lambda l:[max(5,(n+3)/5*5-(n-2)/5%2)for n in l]

Якщо ми подивимось на послідовність округлих значень, то побачимо, що вони надходять у блоки по 5.

... 25, 29, 29, 29, 29, 29, 35, 35, 35, 35, 35, 39, ...

Ми знаходимо, з яким числовим блоком ми знаходимось (n+3)/5(називаємо це значення J). Потім ми отримуємо потрібне кратне число 5з J*5, і коригуємо такі речі, як 30вниз 29, віднімаючи 1всякий раз, коли Jпарне.

Для спеціального випадку 1віддання , 5а не -1ми передаємо результат max(5,_).


Щоб виправити версію Pyth, я думаю, ви можете це зробитиmeS,-*hJ/-d2K5K%J2KQ
FryAmTheEggman

2
або на 2 байти коротше:m-|*K5hJ/-d2K6%J2Q
Jakube

1
@Jakube Це розумно, а як ви це опублікували?
xnor

Добре, я буду. Але ви можете взяти ідею для вашої відповіді Python. Це економить один байт:lambda l:[((n+3)/5*5or 6)-(n-2)/5%2for n in l]
Jakube

8

Сітківка, 32 байти

Приймає введення у списку, розділеному комами. Повинно бути кома в кінці. Виходи в тому ж форматі.

T`d`aa555559`.,
T+`da`ad`\da
a
5

Пояснення:

T`               #Transliteration mode.
  d`aa555559`    #Map the digits 0-9 to aa55555999
             .,  #Map only the trailing digits.
T+`              #Do until input does not change.
   da`ad`        #Map a to 9, 0 to a, and 1-9 to 0-8
         \da     #Only do this to each a and the character before each a.
a                #Match all leftover a's. This only happens when the input contains the integer 1.
5                #Replace them with 5.

5

R, 51 49 47 43 байт

(f=((n=scan()-2)%/%5+1+(n<0))*5)-(f%%10==0)

Поліпшити це слід, але я думаю, що інша стратегія може бути кращою. Знімає вектор цілих чисел від сканування і виводить вектор цілих чисел. По суті, це використовує ціле ділення для округлення числа вниз, додає 1 і помножує його на п'ять. Все, що ділиться на 10, забрало 1. Якщо n = 1, то він збільшує ціле ділення на 1.

Тестовий запуск

> (f=((n=scan()-2)%/%5+1+(n<0))*5)-(f%%10==0)
1: 1
2: 12
3: 8
4: 41
5: 27
6: 144
7: 99
8: 3
9: 
Read 8 items
[1]   5  15   9  39  29 145  99   5
> 

5

Python 3, 74 82 байт

a=eval(input())
for i in a:print(round(i,-1)+[5,-1][max(4,i-2)%10>4])

Я боровся за стислість за значеннями менше 11 і вимогою 1 оцінити до 5.


Здається, що ваша програма займає лише одне ціле число?
daniero

@daniero правильний, виправлено зараз, щоб прийняти список.
Тодд

4

Pyth, 21 18 29 28 байт

Дякуємо @Jakube за вирізання 3-х байт!

KeQJ-QKI<K2tJ.q;I<K6+J5;E+J9

Спробуйте тут.

EDIT: Мабуть, це було недійсно. Я зафіксував це ціною 11 байт; Я спробую більше пограти в гольф.


eQце те саме %Q10, що і ви можете I<KeQ6+-QK5;E+-QK9
вписати

Класно, я про це не знав!
РК.

Без проблем. Хоча ваш підхід невірний. Ви повинні округлити до 9, якщо остання цифра становить 0або1
Jakube

Ах, я попрацюю над цим.
РК.

4

Pyth, 21 байт

m?tdtt+d@jC"²a<"6ed5Q

На жаль, мені доведеться витратити 4 байти, щоб правильно обробити $ 1.


Досить розумний. 1Однак ви можете обробляти лише 2 байти. mt|t+d@jC"²a<"6ed6Q
Якубе

4

Піт, 18 байт

m-|*K5hJ/-d2K6%J2Q

Спробуйте в Інтернеті: Демонстрація або Тестовий набір

Ця відповідь заснована на рішенні Python / Pyth @ xor. Основна відмінність полягає в тому, що я по- 1різному поводжусь із спеціальною справою . Фактичний результат для цього 1був би 0 - 1 = -1. Використовуючи Python, orя можу замінити на 0a 6, в результаті чого 6 - 1 = 5. Це економить біль від прийняття максимуму 5та результату.

Пояснення:

m-|*K5hJ/-d2K6%J2Q
m                Q   map each number d of the input list Q to:
    K5                  K = 5
       J/-d2K           J = (d - 2) / K
   *K hJ                   K * (J + 1)
  |                     or
             6             6 # if K*(J+1)==0
 -            %J2       minus (J mod 2)

3

Hassium , 133 байт

func main(){i=[12,8,41,27,144,99,3];foreach(e in i){f=e%10;if(!(e/10==0))print(e/10);if(f<5)r=5;else if(f>5)r=9;elser=f;println(r);}}

Запустіть і перегляньте розширене онлайн: http://hasiumlang.com/Hassium/index.php?code=4f1c14f4d699b11da7a6392a74b720c4


Вибачте за те, що посилання було розірвано, ми виконували деяку роботу з базою даних. Працює зараз.
Яків Місіріан

Як зазначено у коді wiki тега гольфу , відповіді повинні бути повноцінними програмами або функціями. Фрагменти, які просто жорстко вводять, не дозволяються, якщо в питанні прямо не вказано інше.
Денніс

3

TI-BASIC, 19 байт

int(Ans/5+.6
max(5,5Ans-not(fPart(Ans/2

Використовує алгоритм xnor. TI-BASIC отримує векторизацію та множення безкоштовно, але ми витрачаємо ще декілька байтів, оскільки в ньому немає модуля.


1

Haskell, 114 байт

g n
 |n>6=9-n
 |n>1=5-n
 |1>0=(-n-1)
f n=show$(read n)+(g$read$(:[])$last n)
main=interact(unlines.(map f).lines)

Пояснення:

Функція gповертається, 9-nякщо n>6або ще, 5-nякщо n>1або ще -n-1. gнадається остання цифра і повертає те, що слід додати до вхідного числа. fвикористовує gдля отримання рішення (плюс багато рядкових маніпуляцій). mainвиводить результат fдля кожного рядка введення.


1

Рубі, 55 50 + 1 байт

Запустіть його n прапором, наприклад , так: ruby -n prices.rb. Введіть кожну ціну в окремий рядок.

x=$_.to_i
p x<7?5:(x-2).round(-1)+(~/[2-6]$/?5:-1)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.