Так, звичайно, я доросла людина!


44

Я думаю, що ми все це робили в дитинстві: для деяких веб-сайтів потрібен вік від 18 років, тому ми віднімаємо лише кілька років від року народження та voilà, нам "18+.
Крім того, для більшості атракціонів у парках розваг мінімальна висота для входу становить 1,40 метра (тут як мінімум у Нідерландах). Звичайно, це можна обдурити менш легко, ніж вік, але ви можете носити взуття на товстих підборах, укладати волосся, носити шапку, стояти на носках тощо.

Вхід:

Ваша програма / функція приймає додатне ціле чи десятковий.

Вихід:

  • Чи є вхід цілим числом >= 18? Просто надрукуйте введення.
  • Чи є вхід цілим числом 0-17? Друк 18.
  • Чи є вхід десятковою >= 1.4? Просто надрукуйте введення.
  • Чи вхід є десятковою 0.0-1.4? Друк 1.4.

Правила виклику:

  • Припустимо, вхід завжди буде в діапазоні 0-122(найстаршій жінці колись було 122) або 0.0-2.72(найвищому чоловікові колись було 2,72).
  • Вам дозволяється сприймати дані як рядки, об'єкти чи будь-що інше.
  • Десяткові вводи ніколи не матимуть більше трьох знаків після коми після коми.
  • 2або 2.обидва не є дійсними виходами для 2.0. Ви можете безкоштовно виводити 2.00або 2.000замість цього 2.0.
    Так само, як і вхід, результат ніколи не матиме більше трьох знаків після коми.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила діють для вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод з відповідними параметрами, повноцінні програми. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.

Тестові приклади:

0      ->  18
1      ->  18
2      ->  18
12     ->  18
18     ->  18
43     ->  43
115    ->  115
122    ->  122

0.0    ->  1.4
1.04   ->  1.4
1.225  ->  1.4
1.399  ->  1.4
1.4    ->  1.4
1.74   ->  1.74
2.0    ->  2.0
2.72   ->  2.72

Чи можна вважати, що вхід не містить провідних нулів?
Toby Speight

@TobySpeight Так, немає провідних нулів.
Кевін Круїссен

2
0.0-2.72 (tallest man ever was 2.72).- Ти не 0.0коли народишся ...
Йохан Карлссон

1
@JohanKarlsson Я знаю, думав над тим, щоб додати мінімум, але я вирішив просто дозволити це почати з 0і 0.0. :) Додані tallest man ever was 2.72та oldest woman ever was 122просто додані як інформаційні факти для зацікавлених.
Kevin Cruijssen

9
"[...] тому ми просто додамо кілька років до року народження [...]" Чи не слід відняти кілька років від року народження?
wythagoras

Відповіді:



45

Python 2.7, 34 байти

lambda x:max(x,[18,1.4]['.'in`x`])

Що це за повернення 2.0?
Адам

2
@ Adámmax(2.0,[18,1.4][True]) == max(2.0,1.4) == 2.0
Lynn

3
Ні, це не так. Чому б ви не спробували його самостійно? :)
Лінн

5
@ Adám Я використовую repl.it або ideone.com для Python. Перегляньте будь-яку відповідь Python, яку я коли-небудь публікував, і вона, ймовірно, має посилання на один із цих двох.
mbomb007

1
ніколи не розумію, зрозумів. так що в основному істинні або помилкові карти на 0 або 1 індекс у цьому масиві, а потім застосовують max до двох чисел.
Олександру Пупсу

15

JavaScript (ES6), 27 31

Введення приймається як рядок. Щоб перевірити, чи має вхідне значення десяткових знаків, він додається до себе: якщо немає десяткової крапки, результат все-таки є дійсним числом, інакше це не так. Щоб розпізнати дійсне число (включаючи 0), я використовую поділ, оскільки в javascript 1/nє числовим, а не 0 для будь-якого числового n (зрештою, це значення Infinityдля n==0), інакше цеNaN

x=>x<(y=1/(x+x)?18:1.4)?y:x

Тест

f=    
x=>x<(y=1/(x+x)?18:1.4)?y:x

;[
 ['0', '18' ],['1', '18' ],['2', '18' ],['12', '18' ],['18', '18' ],['43', '43' ],['115', '115'], ['122', '122' ]
,['0.0', '1.4'],['1.0', '1.4'],['1.04', '1.4'],['1.225', '1.4'],['1.399', '1.4'],['1.4', '1.4'],['1.74', '1.74'],['2.0', '2.0'],['2.72', '2.72']
].forEach(t=>{
  var i=t[0],k=t[1],r=f(i)
  console.log(i,k,r,k==r?'OK':'KO')
})

Моє попереднє (неправильне) рішення:

Взявши введення як число, ви можете скористатися оператором залишку, %щоб перевірити, чи число це ціле.

x=>x<(y=x%1?1.4:18)?y:x

або

x=>Math.max(x,x%1?1.4:18)

Але це не працює , як запит на виклик , щоб розрізняти між, скажімо, 2і 2.0і це те ж саме число. Тож неможливо отримати введення як число


2
Результат для 2.0повинен бути 2.0, ні 18.
Ніл

дійсно. 2.0%1і 1.0%1призведе до 0
1616

4
'javascript (es6) є багатослівним', ви бачите лише це на codegolf
dwana

@Neil вдруге подумав, що ти, мабуть, маєш рацію
edc65

3
1/(x+x)- тепер це образно!
Ніл

13

05AB1E , 13 11 байт

Використовує кодування CP-1252 .

ÐîQ18*14T/M

Пояснення

Ð             # triplicate input
 î            # round up
  Q           # check for equality
   18*        # multiply 18 by this (18 if input is int, else 0)
      14T/    # push 14 / 10
          M   # take max of stack (input and 1.4 or 18)

Спробуйте в Інтернеті


2
Ти ніби повільний. Все-таки у вас пішло 1,5 хвилини. ; P (читай: Чорт, це було швидко.) Це, звичайно, просто.
Кевін Кройсейсен

2
@KevinCruijssen: Так, впровадження відбувається досить швидко, не вимагаючи багатьох натискань клавіш: P
Emigna

@EriktheGolfer: Краще? Якщо не соромтеся відредагувати це. Я експериментував з декількома різними способами форматування, і не визначився із строго найкращим. Пропозиції вітаються.
Емінья

@Emigna Я щойно додав два пропущені ключові пробіли.
Ерік Аутгольфер

2
@FrancescoCasula: Я знайшов коротше рішення, яке працює на TIO :)
Emigna

8

Java 8, 90 61 57 байт

i->(i+"").contains(".")?(float)i<1.4?1.4:i:(int)i<18?18:i

-4 байти, що повертаються Objectзамість String; і деякі додаткові байти, що перетворюють Java 7 на 8.
-4 байт, приймаючи введення Objectзамість цього String.

Пояснення:

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

i->                      // Method with Object as both parameter and return-type
  (i+"").contains(".")?  //  If the input as String contains a dot:
   (float)i<1.4?         //   If the input is a float below 1.4:
    1.4                  //    Return double 1.4
   :                     //   Else:
    i                    //    Return the input-float as is
  :(int)i<18?            //  Else if the input is an integer below 18:
   18                    //   Return integer 18
  :                      //  Else:
   i                     //   Return the input-integer as is

Чи потрібно ставити дужки навколо оператора if / else?
Роман Ґраф

1
@ RomanGräf Так; тернар має нижчий пріоритет, ніж +це означає, що якщо ви видалите круглі дужки, це перетвориться на(""+i.contains(...)) ?
Нік Хартлі


7

PHP, 40 байт

модифікував @ user59178 Дякую

<?=max(is_int(0+$i=$argv[1])?18:1.4,$i);

PHP, 42 байти перша версія

<?=max(strpos($i=$argv[1],".")?1.4:18,$i);

is_int($i=$argv[1]+0)на 2 байти коротше strpos($i=$argv[1],".")і може служити тій самій цілі, якщо ви 1.418
поміняєте місцями

@ user59178 Я міг би використовувати is_numericна струні, але ніis_int
Jörg Hülsermann

ось чому є +0, щоб перетворити його в числовий тип.
користувач59178

1
Для мене це працює правильно (спробував і php 5.5, і 7.0 на Windows). Зауважте, що він має протилежні істинним / хибним умовам strpos($i=$argv[1],".")версії, чи пам’ятали ви поміняти висновки терміналу?
user59178

1
Насправді, при ближчому читанні, це має бути, <?=max(is_int(0+$i=$argv[1])?18:1.4,$i);а не <?=max(is_int($i=$argv[1]+0)?18:1.4,$i);уникати виходу 2, коли дано 2.0.
user59178

6

EXCEL: 26 31 29 Байт

=MAX(A1;IF(MOD(A1;1);1,4;18))

Формула може йти в будь-якому місці, крім A1, вхідної комірки.

Виправлені помилки та замінено пропозицією Еміньї.

Дякую Олександру, що врятував мені кілька байт, використовуючи правди


1
Крім того, чи не краще визначити ім'я nдля вхідної комірки? Тоді він може бути в будь-якому місці документа, і він також на 2 байти коротше.
Емінья

@Emigna я міг би , але в цей момент це стає трохи обман-у я відчуваю. 1 байт на ім’я не є чим прокручувати, і якщо я зберігаю цей формат, люди можуть легко копіювати та вставляти.

Я не бачу, чим це відрізняється, ніж, наприклад, використання вхідної змінної на 1 букву в лямбда в python. Але це ваш дзвінок :)
Емінья,

Привіт! Як обчислюють байти? Збережіть файл із формулою із назвою за замовчуванням чи якось ще?
Вітята

1
Ви можете видалити '= 0' і переключити результати: 1,4 по-перше, 18 секунд. Оскільки, у вас є кома як десятковий роздільник, це може не працювати для більшості людей.
Олександру Пупсу


5

Perl, 29 27 байт

Включає +2 для -lp

Введіть дані про STDIN

adult.pl <<< 1.24

adult.pl:

#!/usr/bin/perl -lp
$_>($a=/\./?1.4:18)or*_=a

Якщо ви не заперечуєте над новим рядком, якщо ви справді були повноцінною дорослою людиною, тоді випускати lваріант на 26 байт теж працює


5

GNU sed, 40 + 1 = 41 байт

(оцінка +1 за використання -rпрапорця для перекладача)

s/^.$|^1[^9]$/18/
/^0|1\.[0-3]/s/.*/1.4/

Повідомлення:

#!/bin/sed -rf

# First, anything that's a single digit or is '1' followed by a
# digit other than '9' is replaced with '18'.
s/^.$|^1[^9]$/18/

# Now, any line beginning with '0' or containing '1.0' to '1.3' is
# replaced with '1.4'.
/^0|1\.[0-3]/s/.*/1.4/

Ми використовуємо обмеження на введення, тому не потрібно перевіряти початок рядка, коли ми бачимо "1." - ми знаємо, що перед десятковою комою є лише одна цифра.

Результати тесту:

$ ./94832.sed <<END
> 0
> 1
> 2
> 12
> 18
> 43
> 122
> 
> 0.0
> 1.04
> 1.225
> 1.399
> 1.4
> 1.74
> 2.0
> 2.72
> END
18
18
18
18
18
43
122

1.4
1.4
1.4
1.4
1.4
1.74
2.0
2.72

5

Haskell, 50 байт

x#y=show$max x$read y 
f s|elem '.'s=1.4#s|1<2=18#s

Приклад використання: f "1.0"-> "1.6".

Суворий тип Haskell вимагає використання рядків як введення та виведення. Howevers, read, maxі showє поліморфними і обробляти всі числові типи.


Я думав, що буду розумним і обійдуся без охоронців, але це в кінцевому підсумку зробило це трохи довше :( Моя версія:(#)x=map(show.max x.fst).reads;f s=head$18#s++1.4#s
Cubic

@Cubic: Гарне використання reads. З невеликою модифікацією це на один байт коротше мого. Будь ласка, опублікуйте це як окрему відповідь. x#y=show.max x.fst<$>reads y;f s=head$18#s++1.4#s.
німі

Дійсно класна ідея збереження паронів з інфіксацією fmap!
Кубічний

5

Java, 79 70 байт

int f(int x){return x<18?18:x;}
float f(float x){return x<1.4?1.4f:x;}

Визначає два методи з перевантаженням, в яких використовується умовний оператор.

Назвіть це як f(5)або f(1.4f).


1
Привіт. x<18?18:xі x<1.4f?1.4f:xкоротші, ніж Math.max. Думаю, вам можуть бути цікаві для читання поради щодо гольфу на Java . :)
Кевін Крейсейссен

Так, звичайно, є. Як я міг їх
забути

Я люблю це! Навіщо кодувати логіку самостійно, коли ви можете завантажити її до компілятора!
corsiKa


4

C #, 69 байт

s=>s.Contains(".")?float.Parse(s)<1.4?"1.4":s:int.Parse(s)<18?"18":s;

Спробуйте в Інтернеті!

Повна програма з тестовими кейсами:

using System;

namespace YesImAnAdult
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string,string>f= s=>s.Contains(".")?float.Parse(s)<1.4?"1.4":s:int.Parse(s)<18?"18":s;

            Console.WriteLine(f("0"));  //18
            Console.WriteLine(f("1"));  //18
            Console.WriteLine(f("2"));  //18
            Console.WriteLine(f("12")); //18
            Console.WriteLine(f("18")); //18
            Console.WriteLine(f("43")); //43
            Console.WriteLine(f("122"));    //122

            Console.WriteLine(f("0.0"));    //1.4
            Console.WriteLine(f("1.04"));   //1.4
            Console.WriteLine(f("1.225"));  //1.4
            Console.WriteLine(f("1.399"));  //1.4
            Console.WriteLine(f("1.4"));    //1.4
            Console.WriteLine(f("1.74"));   //1.74
            Console.WriteLine(f("2.0"));    //2.0
            Console.WriteLine(f("2.72"));   //2.72
        }
    }
}

Досить просте рішення. Зауважте, що в деяких системах float.Parse () може повернути неправильні результати. Передайте CultureInfo.InvariantCulture як другий аргумент відповідно до цієї відповіді .


Враховуючи обмеження, я думаю, ви можете піти з заміни s.Contains(".")наs[1]=='.'
JustinM - Поновіть Моніку

Хм, нвм, забув тестовий випадок 0. так близько :(
JustinM

1
@Phaeze: Так, це не вдалося б на будь-якому однозначному введенні з IndexOutOfRangeException. В іншому випадку ви можете голитися байт геть s[1]==46, або навіть більш агресивний підхід (передбачається , що у вас є тільки цифри і символ з індексом 1 «») (має ASCII - код 46 «»): s[1]<47.
adrianmp

1
Оо мені це подобається, спробую запам’ятати. Дякую за те, що я перетворив мою ідіотизм у навчальну
нагоду

4

Мова формули IBM / Lotus Notes, 58 49 байт

@If(@Like(@Text(a);"%.%");@If(a<1.4;1.4;a);@If(a<18;18;a))

Формула обчисленого поля, де a - редаговане числове поле.

EDIT

@If(@Like(@Text(a);"%.%");@Max(1.4;a);@Max(18;a))

Альтернатива натхненна @Mego


4

Желе , 16 15 13 байт

ŒṘċ”.ị1.4,18»

TryItOnline
Або подивіться всі тестові випадки, також у TryItOnline

Як?

ŒṘċ”.ị1.4,18» - Main link: n
      1.4,18 - pair literals 1.4 and 18:   [1.4,18]
     ị       - index (1-based & modular ie:^  1, 0^)
  ċ          -     count (occurrences of)
   ”.        -         string "." (present in)
ŒṘ           -         string representation of n
           » - maximum (of this and n)

2
Це повертається 18до 2.0, до жаль :(
Lynn

Ах, складність Желе перевершує.
Ерік Аутгольфер

@Lynn спасибі, виправлені за величезну ціну; можливо, існує коротший шлях, ніж цей.
Джонатан Аллан

4

C ++, 68 байт

int A(int a){return a<18?18:a;}float A(float h){return h<1.4?1.4:h;}

Ця відповідь - це фактично дві функції з однаковою назвою, і компілятор працює для мене, до якого потрібно зателефонувати, тому він діє як одна функція, без мене потрібно брати один вхід і вирішувати, що це таке. Оскільки вхід на плаваючу крапку гарантовано буде такою ж точністю, як і на виході, я можу його безпечно повернути, не потребуючи також усічення.

Бездоганний + тести

#include <iostream>

int A(int a)
{
   return a < 18 ? 18 : a;
}

float A(float h)
{
   return h < 1.4 ? 1.4 : h;
}

int main()
{
  std::cout << 0 << " " << A(0) << "\n";
  std::cout << 19 << " " << A(19) << "\n";
  std::cout << 1.1 << " " << A(1.1f) << "\n";
  std::cout << 2.2 << " " << A(2.2f) << "\n";
}

Користувач Szali Szali запропонував зберегти два байти, перетворивши floats в autos. Я відхилив редагування відповідно до політики, але не соромтесь редагувати його самостійно, якщо ви підтвердили, що воно працює.
Мартін Ендер

Все, що дублювання тексту! Ви можете зберегти кілька символів, створивши два визначення за допомогою макросу.

Дякую @MartinEnder Їх редагування не збирається у всіх компіляторах C ++, і вводить всілякі дивні випадки, коли інші раптово можуть бути передані, тому я збираюся приймати свої 2 байти, щоб моя відповідь була трохи більш портативною.
Коді

@Cody Це ваш дзвінок, але що стосується PPCG, мови визначаються їх реалізацією, тому відповіді не повинні бути портативними або особливо безпечними. Поки є компілятор, де працює програма (і потрібні входи працюють, незалежно від того, чи працювали б також недійсні), це абсолютно добре.
Мартін Ендер

4

C #, 58 байт

x=>x is int?(int)x>17?x:18:(float)x<1.4?"1.4":$"{x:.0##}";

Немає шаленого розбору рядків для C #. Вхідні дані, як очікується, бути intчи float(С # , до жаль , не може відкидати , doubleщоб , floatякщо doubleзнаходиться у object). Вихід буде або в, intабо stringв object.

(майже пропустив принаймні 1 десяткову вимогу, додав, що зараз)

Безголівки:

/*Func<object, object> Lambda = */ x =>
    x is int // if parameter is an int
        ? (int)x > 17 // check if x is at least 18
            ? x // at least 18 so return x
            : 18 // less than 18 so return 18
        : (float)x < 1.4 // x is float, check if at least 1.4
            ? "1.4" // less than 1.4 so return 1.4
            : $"{x:.0##"} // at least 1.4 so return x and ensure at least 1 decimal place
;

Альтернативна реалізація, яка також становить 58 байт.

x=>x is int?(int)x>17?x:18:$"{((float)x<1.4?1.4:x):.0##}";

4

Власне, 16 байт

;:.7τ9τ($'.íuIkM

Спробуйте в Інтернеті!

Пояснення:

;:.7τ9τ($'.íuIkM
;                 dupe input
 :.7τ             1.4 (.7*2) - note that :1.4 is the same length, but an additional delimiter would be needed to separate it from the following 1
     9τ           18 (9*2)
       ($'.íu     1-based index of "." in string representation of input, 0 if not found
             I    1.4 if input contains a "." else 18
              kM  maximum of remaining values on stack 

Я ніколи не програмував насправді раніше, але навіщо використовувати замість просто 18? Я знаю, що це те саме число байтів, тому це насправді не має значення, але 18здається більш читабельним. Або є причина, що вона не працюватиме в поточній мові впровадження / програмування?
Kevin Cruijssen

3
@KevinCruijssen 18натискає 1та і 8. Щоб натиснути буквене позначення 18, ви скористаєтеся :18, яке довше, ніж .
Mego

Ну звичайно, мови на основі стека. Дякую за пояснення! +1
Kevin Cruijssen

4

Emacs Lisp, 37 байт

(lambda(x)(max(if(floatp x)1.4 18)x))

Відгадки з "типу даних", чи слід використовувати цілочисельну чи плаваючу версію. ( floatpповертає tдля 1.0, але не для 1.) Параметр - це число як ціле чи плаваюче, тобто воно повинно задовольняти numberp.


4

Haskell, 49 байт

x#y=show.max x.fst<$>reads y;f s=head$18#s++1.4#s

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


3

Dyalog APL , 14 байт Подальші характеристики

⎕IO←0що за замовчуванням у багатьох системах. В якості аргументу бере рядок.

⍎⌈18 1.4⊃⍨'.'∘∊

⍎⌈ max оцінюваного аргументу та

18 1.4⊃⍨ {18,1.4} вибрано

'.'∘∊ чи містить аргумент період


3

C #, 95 байт

Гольф:

string y(string p){int a;return int.TryParse(p,out a)?a>17?p:"18":double.Parse(p)<1.4?"1.4":p;}

Безголівки:

class YesOfCourseImAnAdult
  {
    public string y(string p)
    {
      int a;
      return int.TryParse(p, out a) ? a > 17 ? p : "18"
       : double.Parse(p) < 1.4 ? "1.4" : p;
    }
  }

Тестові приклади:

var codeGolf = new YesOfCourseImAnAdult();
Console.WriteLine(codeGolf.y("0"));
Console.WriteLine(codeGolf.y("1"));
Console.WriteLine(codeGolf.y("2"));
Console.WriteLine(codeGolf.y("12"));
Console.WriteLine(codeGolf.y("18"));
Console.WriteLine(codeGolf.y("43"));
Console.WriteLine(codeGolf.y("122"));

Console.WriteLine(codeGolf.y("0.0"));
Console.WriteLine(codeGolf.y("1.04"));
Console.WriteLine(codeGolf.y("1.225"));
Console.WriteLine(codeGolf.y("1.399"));
Console.WriteLine(codeGolf.y("1.4"));
Console.WriteLine(codeGolf.y("1.74"));
Console.WriteLine(codeGolf.y("2.0"));
Console.WriteLine(codeGolf.y("2.72"));

Вихід:

18
18
18
18
18
43
122

1.4
1.4
1.4
1.4
1.4
1.74
2.0
2.72

1
Привіт, Ласкаво просимо до PPCG! Ваш поточний підхід може бути скорочений як - небудь так: string y(string p){int a;return int.TryParse(p,out a)?a<1?"18":p:double.Parse(p)<1.4?"1.4":p;}(видалені дужки, >=1.4щоб <1.4шляхом заміни "1.4"і p, змінився decimalдо doubleтак Mце пішли Крім того , хто - то тільки що відправив. Інший підхід в C # , який трохи коротше , Ви могли б знайти. Поради для гри в гольф в C # цікаво читати. Знову ласкаво просимо! :)
Кевін Кройсейсен

Привіт, дякую за корисні коментарі! Я повністю забув про ті додаткові дужки, які мені довелося зупинити, коли я втрачав трек від оператора Ternary-Ternary! Зараз я врятував 5 байт.
Піт Арден

Ви можете зберегти один байт, використовуючи float.Parseзамість double.Parse. А також, якщо ви перемістите декларацію a в аргументи методу зі значенням за замовчуванням, ви можете скинути своє повернення за допомогою елемента body Bod. наприклад:string f(string s,int a=0)=>int.TryParse(s,out a)?a>17?s:"18":float.Parse(s)<1.4?"1.4":s;
JustinM

3

AWK - 29 байт

($0<c=$0~/\./?1.4:18){$0=c}1

Використання:

awk '{c=$0~/\./?1.4:18}($0<c){$0=c}1' <<< number

Тестування проводилося за допомогою gawkRHEL 6. Я намагався зі всіма тестовими випадками, на жаль, у мене немає AWKна машині, яка має доступ до Інтернету, тому копіювати-вставити неможливо.

Чи є більш компактний спосіб зробити це AWK?


3

C, 50 байт:

#define A(x)(x/2+(x+1)/2-x?x<1.4?1.4:x:x<18?18:x)

Кількість байтів включає новий рядок в кінці визначення макросу.

Тест :

#define A(x)(x/2+(x+1)/2-x?x<1.4?1.4:x:x<18?18:x)
#include <assert.h>
int main() {
  assert(A(0) == 18);
  assert(A(1) == 18);
  assert(A(2) == 18);
  assert(A(12) == 18);
  assert(A(18) == 18);
  assert(A(43) == 43);
  assert(A(115) == 115);
  assert(A(122) == 122);
  assert(A(0.0) == 1.4);
  assert(A(1.04) == 1.4);
  assert(A(1.225) == 1.4);
  assert(A(1.399) == 1.4);
  assert(A(1.4) == 1.4);
  assert(A(1.74) == 1.74);
  assert(A(2.0) == 2.0);
  assert(A(2.72) == 2.72);
}


3

C, 119 111 105 100

m;f(char*s){float atof(),l=atof(s);for(m=s;*s&&*s++!=46;);puts(*s?l<1.4?"1.4":m:atoi(m)>18?m:"18");}

Тестували с

main(c,v)char**v;{
    f("0");
    f("1");
    f("2");
    f("12");
    f("18");
    f("44");
    f("115");
    f("122");
    f("0.0");
    f("1.04");
    f("1.225");
    f("1.339");
    f("1.4");
    f("1.74");
    f("2.0");
    f("2.72");
}

Вихідні дані

18
18
18
12
18
44
115
122
1.4
1.4
1.4
1.4
1.4
1.74
2.0
2.72

Це недійсно ... Вхід 12 повинен вивести 18
бета-розпад

@BetaDecay ти маєш рацію. Мені потрібно додати додатковий & символ. Дякуємо, що вказали на це.
cleblanc

2

Пакетна, 102 байти

@set/ps=
@if %s:.=%==%s% (if %s% lss 18 set s=18)else if %s:~0,1%%s:~2,1% lss 14 set s=1.4
@echo %s%

Спочатку визначається, чи є вхід цілим числом, перевіряючи, чи видалення всіх .s впливає на рядок. Якщо це так, то значення легко порівнюється проти 18, інакше перший і третій символи об'єднуються в число, яке порівнюється з 14.


2

PHP: 40 байт

$i=is_int($i)?$i>17?$i:18:$i>1.4?$i:1.4;

psuedocode (вкладений поворот):

if (i is an integer) then 
  if (i is bigger than 17) then i=18 else i=i  
otherwise (its a decimal)   
  if (i is bigger than 1.4) then i=i else i=1.4 
end if 

1
Ласкаво просимо до PPCG! Зверніть увагу, що введення (за замовчуванням) повинно здійснюватися через STDIN, аргументи функції або аргументи повного програмного забезпечення.
16:30
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.