Да, конечно, я взрослый!

44

Я думаю, что все мы делали это в детстве: некоторым сайтам требуется минимальный возраст 18 лет, поэтому мы просто вычитаем несколько лет из года рождения и вуаля, нам «больше 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
Кевин Круйссен
источник
Можем ли мы предположить, что на входе нет ведущих нулей?
Тоби Спейт
@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было просто добавлено в качестве информационных фактов для тех, кто заинтересован.
Кевин Круйссен
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
Линн
3
Нет, это не так. Почему бы тебе не попробовать это самому? :)
Линн
5
@ Adám Я использую repl.it или ideone.com для Python. Просмотрите любой ответ Python, который я когда-либо опубликовал, и он, вероятно, имеет ссылку на один из этих двух.
mbomb007
1
не важно, понял. таким образом, в основном значение true или false отображается на 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и это то же самое число. Таким образом, невозможно получить входные данные в виде числа

edc65
источник
2
Результат 2.0должен быть 2.0, а не 18.
Нил
верно. 2.0%1и 1.0%1приведет к 0
aross
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)

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

Emigna
источник
2
Вы довольно медленно. Все еще заняло у вас 1,5 минуты. ; P (читай: Черт, это было быстро.) Конечно, это довольно просто.
Кевин Круйссен
2
@KevinCruijssen: Да, реализация довольно быстрая, и не требует много нажатий клавиш: P
Emigna
@EriktheGolfer: лучше? Если нет, не стесняйтесь редактировать его. Я экспериментировал с несколькими различными способами форматирования и не выбрал строго лучший. Предложения приветствуются.
Эминья,
@Emigna Я только что добавил два пропущенных важных пробела.
Эрик Outgolfer
2
@FrancescoCasula: я нашел более короткое решение, которое работает на
TIO
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(...)) ?
Nic Hartley
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.4и в18
user59178
@ user59178 Я мог бы использовать is_numericдля строки, но неis_int
Йорг Хюльсерманн
Вот почему есть +0, чтобы преобразовать его в числовой тип.
user59178 30.09.16
1
У меня работает правильно (пробовал оба php 5.5 и 7.0 на windows). Обратите внимание, что он имеет противоположные истинные / ложные условия по сравнению с strpos($i=$argv[1],".")версией, помните ли вы, чтобы поменять местами выходы троичного?
user59178 30.09.16
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 30.09.16
6

EXCEL: 26 31 29 байт

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

Формула может идти куда угодно, кроме А1, входной ячейки.

Исправлены ошибки и заменено предложением Эминьи.

Спасибо Александру за то, что он спас мне несколько байтов, используя правду


источник
1
Кроме того, не лучше ли определить имя nдля входной ячейки? Это может быть где угодно в документе, и это также на 2 байта короче.
Эминья
@ Emigna, я мог бы , но в этот момент это немного обманывает, я чувствую. 1 байт на имя - ничто, и если я сохраню этот формат, люди смогут легко копировать и вставлять.
Я не понимаю, чем это отличается от использования 1-буквенной входной переменной в лямбда-выражении в python, например. Но это ваш звонок :)
Emigna
Здравствуй! Как вы рассчитываете байты? Сохранить файл с формулой с именем по умолчанию или как-то еще?
Витя
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

Ява, 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).

corvus_192
источник
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 в качестве второго аргумента в соответствии с этим ответом .

adrianmp
источник
Учитывая ограничения, я думаю, что вы можете обойтись без замены s.Contains(".")наs[1]=='.'
JustinM - Восстановить Монику
Хм НВМ, забыл 0 тестовый случай. так близко тоже :(
ДжастинМ - Восстановить Монику
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 является редактируемым числовым полем.

РЕДАКТИРОВАТЬ

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

Альтернатива, вдохновленная @Mego

ElPedro
источник
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сожалению :(
Линн
Ах, сложность желе выше.
Эрик Outgolfer
@ Линн спасибо, исправлено по колоссальной стоимости; может быть, есть более короткий путь, чем этот.
Джонатан Аллан
4

C ++, 68 байт

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

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

Ungolfed + тесты

#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";
}
Cody
источник
Пользователь 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(к сожалению, C # не может привести doubleк, floatесли он doubleнаходится в object). Вывод будет либо в, intлибо stringв object.

(почти пропустил хотя бы 1 десятичное требование, добавил, что сейчас)

Ungolfed:

/*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кажется более читабельным. Или есть причина, по которой он не будет работать в текущей реализации / языке программирования?
Кевин Круйссен,
3
@KevinCruijssen 18толкает 1и 8. Чтобы вставить литерал 18, вы бы использовали :18, который длиннее, чем .
Mego
Ну, конечно же, стековые языки. Спасибо за объяснение! +1
Кевин Круйссен
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⊃⍨'.'∘∊

⍎⌈ максимум оцениваемого аргумента и

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

'.'∘∊ содержит ли аргумент точку

Адам
источник
3

C #, 95 байт

Golfed:

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

Ungolfed:

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 # интересно читать. Снова, добро пожаловать! :)
Кевин Круйссен
Привет, спасибо за полезные комментарии! Я полностью забыл о тех дополнительных скобках, которые у меня были, чтобы не потерять след от троичного оператора! Теперь я сэкономил 5 байт.
Пит Арден
Вы можете сохранить один байт, используя float.Parseвместо double.Parse. А также, если вы переместите объявление a в аргументы метода со значением по умолчанию, вы можете отбросить оператор return с помощью выражения bodied member. Например:string f(string s,int a=0)=>int.TryParse(s,out a)?a>17?s:"18":float.Parse(s)<1.4?"1.4":s;
ДжастинМ - Восстановить Монику
3

AWK - 29 байт

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

Использование:

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

Тестирование проводилось gawkна RHEL 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);
}
ecatmur
источник
3

C #, 71 байт

object A(object i){return i is int?(int)i>18?i:18:(double)i>1.4?i:1.4;}

попробуйте здесь

grabthefish
источник
3

С 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
cleblanc
источник
Это неверно ... Ввод 12 должен выводить 18
Beta Decay
@ 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, (вложенный turnary):

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 
rb101
источник
1
Добро пожаловать в PPCG! Обратите внимание, что ввод (по умолчанию) должен осуществляться через STDIN, аргументы функции или полные аргументы программы.
aross