Codegolf — Как Долго Должна Работать Моя Микроволновая Печь?

  • Автор темы Lubenets
  • Обновлено
  • 23, Oct 2024
  • #1

Я голоден. Давайте подогреем что-нибудь в микроволновке. Учитывая числовые входные данные от 1 до 4 цифр, выведите количество секунд, в течение которых должна работать микроволновая печь.

Подробности

Хитрость заключается в том, чтобы выяснить, вводит ли пользователь секунды или комбинацию секунд и минут. Единицы и десятки следует интерпретировать как секунды, а сотни и тысячи — как минуты. Например, значение 90 should be interpreted as 12 minutes, 34 seconds and 130 должно быть 98 минут 76 секунд. Ввод текста 9876 and 1234 в обоих случаях время приготовления составит 90 секунд.

Вот еще несколько входов и выходов:

  • 1 = 1
  • 11 = 11
  • 111 = 71
  • 1111 = 671
  • 9 = 9
  • 99 = 99
  • 999 = 639
  • 9999 = 6039

Правила

Это , поэтому побеждает самая короткая программа в байтах. Стандартные лазейки не допускаются. Победившая запись должна вернуть правильный ответ при вводе любого целого числа от 1 до 9999.

#код-гольф #код-гольф #номер

Lubenets


Рег
08 Jan, 2011

Тем
78

Постов
177

Баллов
587
  • 26, Oct 2024
  • #3

Япт, 6 байт

(lambda(n)(- n(*(floor n 100)40)))

Проверьте это онлайн! x=scan();x-x%/0*40 converts to base-100, and code explanation stack ' push input to stack [input] : duplicate ToS [input, input] Z push 100 [input, input, 100] /v integer division (divide and floor) [input, ⌊input/100⌋] 40 push 40 [input, ⌊input/100⌋, 40] * multiply [input, ⌊input/100⌋*40] - subtract [input - ⌊input/100⌋*40] ! print преобразуется обратно в базу 60, в результате чего ./mw code.mwg -i 9999 . Also works with hours ( ':Z/v40*-! , количество секунд в часе).

 

Ssypchenko


Рег
08 Nov, 2005

Тем
74

Постов
221

Баллов
591
  • 26, Oct 2024
  • #4

Пиф — 9 8 байт

Преобразует входные данные в число по основанию 100, а затем интерпретирует его как число по основанию 60.

. Duplicate input. 'd% Mod 100. ~ Swap with other copy. 'd: Divide by 100. '<* Multiply by 60. + Add.

Тестовый набор.

 

TREAT


Рег
27 Oct, 2020

Тем
84

Постов
183

Баллов
623
  • 26, Oct 2024
  • #5

C, C++, Java, C#, D: 36 байт.

Д: 35 байт

С: 28 байт

Впервые у меня такой короткий ответ!

/o \i@/...

D может иметь специальную оптимизацию из-за системы шаблонов Golfy:

/o \i@/.'d%~'d:'<*+

В C есть специальная оптимизация с неявным int:

1

Код для тестирования

В С (нужно включить 1 ) :

.{100} 60$*

ТИО Ссылка

В С++ (нужно включить echo $[$1-$1/100*40] ) :

т÷60*¹т%+ т // Push number 100 ÷ // Integer division with the input 60 // Push number 60 * // Multiply with the previous result ¹ // Push input т // Push 100 again % // Modulo + // Add the first and the second result

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

В Ява :

т÷60*¹т%+

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

В С#

# input is initially in _ __=-~-~_-_ # set __ to (2+input-input) = 2 _-= # subtract from _: _/ # _ divided by: (__<<__^__)**__ # (2<<2 ^ 2) ** 2 = (8^2)**2 = 100 * # multiplied by (__-~__<<-~__) # (2 - ~2 << -~2) = 5 << 3 = 40 # value in _ is the implicit output

В Д (приходится импортировать __=-~-~_-_ _-=_/(__<<__^__)**__*(__-~__<<-~__) ) ( exactly, i have no idea how to use arrays in D ) :

$args|%{$_-40*($_-replace'..?$')}

ТИО Ссылка

 

Alodsa


Рег
01 Apr, 2015

Тем
67

Постов
159

Баллов
514
  • 26, Oct 2024
  • #6

TI-Basic (серия 83), 8 байт

H2d%}/60*+#

Требуется ОС версии 1.15 или выше.

 

Elstan


Рег
28 May, 2006

Тем
71

Постов
172

Баллов
537
  • 26, Oct 2024
  • #7

округ Колумбия, 10 байт

Input % 100 + 60 * ⌊Input / 100⌋

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

Объяснение: в постоянном токе, когда вы нажимаете что-то. в стеке он идет сверху

s \ Split input into digits jvj \ Join the first two and the last two 60* \ Multiply the first by 60 ^+ \ Add the values # \ Print ||answer||

Баш до н.э. + Сед, 30 28 байт

-2 байта благодаря @seshoumara.

sjvj60*^+#

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

Принимает ввод со стандартного ввода. Пошел на более творческий подход: вставки. 2dH/40*-# before the last 1 or 2 digits, and prepends a n->[60,1]*divrem(n,100) к началу, чтобы учитывать входные данные только с 1 или 2 цифрами. Затем результат передается в n->n\100*60+n0 .

 

Михоко


Рег
30 Jun, 2020

Тем
85

Постов
185

Баллов
610
  • 26, Oct 2024
  • #10

Желе, 5 байт

В качестве монадической ссылки (спасибо за предупреждение, caird!):

0 100⊤

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

... Или по полной программе:

60⊥0 100⊤⊢

Это можно легко перенести на 05AB1E, поэтому:

05AB1E, 5 байт

?[A1]Mod 1E2+60*[Int(A1/100)]

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

Просто преобразует входное целое число в базовое 100 а затем преобразует результат из базы 60 до целого числа. Следовательно, это эквивалентно Ввод % 100 + 60 * ⌊Ввод / 100⌋

 

Земфира Максутова


Рег
28 Oct, 2020

Тем
93

Постов
215

Баллов
680
  • 26, Oct 2024
  • #13

Дж, 12 байт

? Read input. : Duplicate. _100% Mod 100. } Move off to auxiliary stack. #00/ Divide by 100, using the stack depth to get a 1, instead of _1. _60* Multiply by 60. {+ Retrieve the earlier result and add it. ! Print.

Это решение Python 2, выраженное в J. Оно состоит из хука и вилки:

?:_100%}#00/_60*{+!

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

 

Burigra


Рег
04 Apr, 2013

Тем
75

Постов
213

Баллов
608
  • 26, Oct 2024
  • #14

Пакетный, 23 байта

(-)<*>(*40).(`div`40) ||answer||

Хаскелл, 18 байт

f t=t-t`div`100*40

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

Порт Анота.

Бесточечное решение, 21 байт

@cmd/cset/a%1-%1/100*40 ||answer||

Лабиринт, 19 байт

┌─┬───────────────────────┐ │-│┌──┬────────┬─────────┐│ │ ││40│┌─┬─┬──┐│┌─┬─┬───┐││ │ ││ ││*│&│<.│││%│&│100│││ │ ││ │└─┴─┴──┘│└─┴─┴───┘││ │ │└──┴────────┴─────────┘│ └─┴───────────────────────┘ %&100 - divides the number by 100 *&<. - finds the floor of the left argument and multiplies it to the left arg. 40 - - - subtracts the result of the above fork from the input

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

Объяснение

-40*&<.%&100

Затем IP заходит в тупик и начинает двигаться назад. Когда он достигает a=>(a/100^0)*60+a0 it attempts a division by zero which terminates the program.

 

KorP


Рег
10 May, 2005

Тем
83

Постов
190

Баллов
645
  • 26, Oct 2024
  • #15

Excel VBA, 29 байт

Анонимная функция немедленного окна VBE, которая принимает входные данные из диапазона n->n-n/100*40 and outputs to the VBE immediate window.

тв60β ||answer||

АПЛ (Диалог), 11 10 байт

bȷ2ḅ60

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

Как?

b³ḅ60 - encode in base 100, stopping at the second LSB, effectively producing /..$/;$_-=40*$` .

t;f(){scanf("%d",&t);printf("%d",t0+t/100*60);} - decode in base 60

 

Хомячок.homyaka.net


Рег
12 Jan, 2014

Тем
72

Постов
208

Баллов
598
  • 26, Oct 2024
  • #16

ПАРИ/ГП, 16 байт

Простой:

bc

К сожалению, этот хороший метод слишком длинный для использования:

0 ||answer||

Напористый, 10 9 байт

Кевин переиграл меня на моем родном языке... (используя подход из овс' отвечать)

*60+

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

10 байт

bc<<<0`sed 's/..\?$/*60+&/'`

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

? # read and push the input number on the stack 9A # push 100: 9 * 10^1 + A[10] * 10^0 :D ~ # divide 2nd nr. by the top nr., push quotient, then remainder r60* # swap top 2 nr., then multiply the top by 60 +p # add top 2 nr., then print result

11 байт

Для еще одного байта мы можем использовать ?9A~r60*+p approach:

Ans-40int(sub(Ans

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

 

Bartesha


Рег
15 Feb, 2008

Тем
83

Постов
185

Баллов
620
  • 26, Oct 2024
  • #17

PowerShell, 38 33 байта

-5 байт благодаря mazzy

void main() { int[] arr = [1,11,111,1111,9,9,999,9999]; for(int i = 0; i < arr.length; i++) writeln(arr[i]," = ",r(arr[i])); }

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

Использует ту же формулу, которую популяризирует ovs. Усечение по-прежнему обходится дорого в PowerShell. Теперь используется улучшенное регулярное выражение, чтобы вместо этого вырезать последний один или два символа для деления.

 

Игорь Морозов1


Рег
29 Jun, 2006

Тем
72

Постов
191

Баллов
571
  • 26, Oct 2024
  • #18

Символический Питон, 66 48 46 байт

Благодаря Джо Кинг за -16 байт!

std.stdio

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


Объяснение

class Program { int r(int i){return i/100*60+i0;} static void Main(string[] args) { var p = new Program(); int[] testArr = new int[8] { 1,11,111,1111,9,99,999,9999 }; foreach(int a in testArr) { Console.WriteLine(a + " = " + p.r(a)); } } } ||answer||

05AB1E, 9 байт

public class MainApp { int r(int i){return i/100*60+i0;} public static void main(String[]a) { MainApp m = new MainApp(); int testArr[] = new int[]{ 1,11,111,1111,9,99,999,9999 }; for (int v : testArr) { System.out.println(v + " = " + m.r(v)); } } }

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

Объяснение:

int main() { std::initializer_list<int> testList{ 1,11,111,1111,9,99,999,9999 }; for (auto x : testList) { std::cout << r(x) << '\n'; } }

Вероятно, есть какой-то трюк с базовыми преобразованиями, который можно реализовать в 05AB1E, но я его не нашел.

 

Vita60


Рег
04 Jun, 2017

Тем
73

Постов
191

Баллов
566
  • 26, Oct 2024
  • #20

сетчатка, 11 байт

int main() { int testArr[] = {1,11,111,1111,9,99,999,9999}; for(int i=0;i<8; ++i) { printf("%d = %d\n",testArr[i],r(testArr[i])); } return 0; }

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

Ввод и вывод в унарном. Для удобства набор тестов преобразует десятичные числа в десятичные.

Выполнить такое преобразование оснований только для двух цифр на удивление просто в унарном формате. Мы просто сопоставляем серии из 100 stdio.h s and replace them with 60 r(i){return i/100*60+i0;} с. Все, что осталось, будет соответствовать двум последним цифрам десятичного представления и останется неизменным.

 

Yukidom


Рег
18 Aug, 2015

Тем
80

Постов
211

Баллов
621
  • 26, Oct 2024
  • #21

Алиса, 19 байт

T r(T)(T i){return i/100*60+i0;}

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

Объяснение

Жаль, что я удалил divмод от языка, я думаю...

int r(int i){return i/100*60+i0;}

Это обычная структура для линейных программ с десятичным вводом-выводом, работающих исключительно в кардинальном (арифметическом) режиме.

ijQ*TT60 ||answer||

Млечный Путь, 10 байт

10000 -> 3600

использование: floor(n/100)*60 + n0

Объяснение:

ì60 ||answer||

Р, 21 байт

ìL

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

 

TimVir


Рег
02 Jun, 2020

Тем
81

Постов
225

Баллов
640
  • 26, Oct 2024
  • #23

РЕКСС, 25 байт

lambda t:t-t/100*40

(Просто еще один перевод @ovs)

 

Anuetorunes


Рег
23 Nov, 2013

Тем
69

Постов
214

Баллов
569
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно