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


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 

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

3
@KevinCruijssen 18натискає 1та і 8. Щоб натиснути буквене позначення 18, ви скористаєтеся :18, яке довше, ніж 9τ.
— 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.