是的,我当然是成年人!


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)的范围内。
  • 您可以将输入作为字符串,对象或您喜欢的其他任何形式。
  • 小数点输入在小数点后最多不能超过三个小数位。
  • 22.两者都不是的有效输出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出生的时候不是...
Johan Karlsson

1
我知道@JohanKarlsson,曾想过要增加一个最小值,但我决定让它从0和开始0.0。:)已添加tallest man ever was 2.72oldest woman ever was 122已添加为有兴趣的人作为参考事实。
凯文·克鲁伊森

9
“ [...]因此我们只将出生年份增加了几年[...]”您不应该从出生年份中减去几年吗?
wythagoras

Answers:



45

Python 2.7,34个字节

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

这对于2.0会返回什么?
2013年

2
@Adám– max(2.0,[18,1.4][True]) == max(2.0,1.4) == 2.0
林恩

3
不,不是。为什么不自己尝试呢?:)
林恩

5
@Adám我将repl.itideone.com用于Python。查看我发布的所有Python答案,它可能具有指向这两个之一的链接。
mbomb007'9

1
没关系,明白了。因此从本质上讲,将true或false映射到该数组中的0或1索引,然后将max应用于两个数字。
亚历山德鲁·普萨

15

JavaScript(ES6),27 31

输入为字符串。要检查输入值是否有小数,将其附加到自身:如果没有小数点,则结果仍然是有效数字,否则就无效。为了识别一个有效的数字(包括0),我使用的分裂和在JavaScript 1/n是数字,而不是0的任意数字n (最终值Infinityn==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%11.0%1导致0
ross

4
“ javascript(es6)是冗长的”,您只会在codegolf上看到它
dwana

@Neil再次认为您可能是对的
edc65 '16

3
1/(x+x)-现在很有想象力!
尼尔

13

05AB1E13 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 '16

@Emigna我刚刚添加了两个缺少的关键空格。
Erik the Outgolfer

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运算符周围放置方括号?
罗曼·格拉夫(RomanGräf)

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.418
user59178

@ user59178我可以用is_numeric一个字符串,但不is_int
约尔格Hülsermann

这就是为什么要使用+0,将其转换为数字类型的原因。
2016年

1
它对我来说正常工作(在Windows上同时尝试了PHP 5.5和7.0)。请注意,它具有与strpos($i=$argv[1],".")版本相反的真/假条件,您还记得交换三元的输出吗?
user59178

1
实际上,仔细阅读时,在给定2.0时需要<?=max(is_int(0+$i=$argv[1])?18:1.4,$i);而不是<?=max(is_int($i=$argv[1]+0)?18:1.4,$i);避免输出2。
user59178

6

EXCEL:26 31 29字节

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

公式可以输入A1以外的任何地方。

修复了错误,并替换为Emigna的建议。

感谢Alexandru使用真相为我节省了一些字节


1
另外,n为输入单元格定义名称不是更好吗?它可以在文档中的任何位置,也要短2个字节。
Emigna '16

@Emigna我可以,但是到那时我感觉有点作弊。每个名称1个字节是不容小at的,如果保持这种格式,人们可以轻松地复制和粘贴。

我看不到与在python的lambda中使用1个字母的输入变量有什么不同。但这是您的电话:)
Emigna '16

嗨!您如何计算字节?使用默认名称的公式保存文件,或者以其他方式保存?
Vityata '16

1
您可以删除'= 0'并切换结果:1.4首先,18秒。另外,由于逗号作为小数点分隔符,因此这对大多数人来说可能不起作用。
亚历山德鲁·普萨

5

Brachylog,14个字节

#$:18ot|:1.4ot

在线尝试!

说明

    #$             Input is an integer
      :18o         Sort the list [Input, 18]
          t        Take the last element
|              Or
    :1.4o          Sort the list [Input, 1.4]
         t         Take the last element

5

Perl,29 27字节

包括+2 -lp

在STDIN上输入

adult.pl <<< 1.24

adult.pl

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

如果您真的是一个成年人,那么如果您不介意额外的换行符,那么也可以忽略l26字节的选项


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, readmaxshow多态和处理所有数值类型。


我以为我会很聪明,并且不用警卫就可以做到,但这最终使它变长了:(我的版本:(#)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
nimi

用中缀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高尔夫技巧通读。:)
Kevin Cruijssen '16

是的,他们当然是。我怎么能忘记他们……
corvus_192

我喜欢这个!当您可以将逻辑卸载到编译器时,为什么还要自己编写逻辑!
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]=='.'
Phaeze

嗯,nvm,忘记了0个测试用例。太近了:(
菲兹

1
@Phaeze:是的,它将在任何具有IndexOutOfRangeException的1位数字输入上失败。否则可以剃一个字节了与s[1]==46,或甚至更积极的方法(假设你只有数字和索引1处的字符“”)(具有46的ASCII码“”): s[1]<47
adrianmp

1
噢,我喜欢那样,会努力记住。感谢您将我的愚蠢变成学习上的机会:)
Phaeze

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启发的替代方法


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
可悲的182.0,这返回了:(
林恩

啊,果冻的复杂性更高。
暴民埃里克

@琳恩谢谢,不惜付出高昂的代价;也许有比这更短的方法。
乔纳森·艾伦

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 保存两个字节。我已根据政策拒绝了该修改但是如果您确认该修改有效,请随时自行编辑。
Martin Ender

所有这些文本重复!您可以通过宏生成两个定义来保存几个字符。

谢谢@MartinEnder。他们的编辑不能在所有的C ++编译器中编译,并且会引入各种奇怪的情况,而其他类型却突然可以传入,因此我将接受我的2个字节,以使答案更便于移植。
科迪

@Cody是您的电话,但是就PPCG而言,语言是由其实现定义的,因此答案不必是可移植的或特别安全的。只要有一个可以在其中运行该程序的编译器(并且所需的输入可以工作,无论无效的输入是否也可以工作),那都很好。
Martin Ender

4

C#,58个字节

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

C#不需要疯狂的字符串解析。输入应为intfloat(遗憾的是,如果,C#无法将强制double转换为)。输出将或者或在。floatdoubleobjectintstringobject

(几乎错过了至少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似乎更具可读性。还是有原因不能在当前的实现/编程语言中运行?
凯文·克鲁伊森

3
@KevinCruijssen 18按下a 1和an 8。要推送文字18,您将使用:18比文字更长的文字
Mego

嗯,当然是基于堆栈的语言。感谢您的解释!+1
Kevin Cruijssen '16

4

Emacs Lisp,37个字节

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

从“数据类型”猜测是否应使用整数或浮点版本。(floatp返回t1.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个字节

打高尔夫球:

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;改变decimaldouble这样M的走了还有,别人刚刚发布。在C#中的不同的方法就是略短,您可能会发现,提示高尔夫在C#中有趣的通读。再次欢迎您!:)
Kevin Cruijssen

嗨,谢谢您的有用评论!我完全忘记了那些多余的花括号,以防止自己从三元-三元运算符中迷失方向!我现在总共节省了5个字节。
皮特·阿登

您可以使用float.Parse代替来保存一个字节double.Parse。另外,如果将a的声明使用默认值移动到方法参数中,则可以通过使用表达式主体成员来删除return语句。例如:string f(string s,int a=0)=>int.TryParse(s,out a)?a>17?s:"18":float.Parse(s)<1.4?"1.4":s;
Phaeze

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在具有Internet访问权限的计算机上使用,因此无法进行复制粘贴。

有没有更紧凑的方法可以做到这一点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#,71个字节

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

在这里尝试


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

这是无效的...输入12应该会输出18
Beta衰减

@BetaDecay你是对的。我需要添加其他&字符。感谢您指出了这一点。
cleblanc '16

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;

伪代码(嵌套嵌套):

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,函数参数或完整的程序参数输入。
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.