Vâng, tất nhiên tôi là người lớn!


44

Tôi nghĩ rằng tất cả chúng ta đã làm điều này khi còn bé: một số trang web yêu cầu độ tuổi tối thiểu là 18, vì vậy chúng tôi chỉ trừ đi một vài năm kể từ năm sinh và voilà, chúng tôi là '18+.
Ngoài ra, đối với hầu hết các chuyến đi tại các công viên giải trí, chiều cao tối thiểu để vào là 1,40 mét (ở đây ít nhất là ở Hà Lan). Tất nhiên điều này có thể bị lừa ít dễ dàng hơn so với tuổi, nhưng bạn có thể đi giày có gót dày, dựng tóc, đội mũ, đứng trên ngón chân, v.v.

Đầu vào:

Chương trình / hàm của bạn chấp nhận số nguyên dương hoặc số thập phân.

Đầu ra:

  • Là đầu vào một số nguyên >= 18? Đơn giản chỉ cần in đầu vào.
  • Là đầu vào một số nguyên 0-17? In 18.
  • Là đầu vào một số thập phân >= 1.4? Đơn giản chỉ cần in đầu vào.
  • Là đầu vào một số thập phân 0.0-1.4? In 1.4.

Quy tắc thử thách:

  • Giả sử đầu vào sẽ luôn nằm trong phạm vi 0-122(người phụ nữ lớn tuổi nhất là 122) hoặc 0.0-2.72(người đàn ông cao nhất từng là 2,72).
  • Bạn được phép lấy đầu vào dưới dạng Chuỗi, đối tượng hoặc bất kỳ thứ gì bạn thích.
  • Các đầu vào thập phân sẽ không bao giờ có nhiều hơn ba chữ số thập phân sau dấu thập phân.
  • 2hoặc 2.cả hai không đầu ra hợp lệ cho 2.0. Bạn được tự do đầu ra 2.00hoặc 2.000thay vì 2.0tuy nhiên.
    Giống như đầu vào, đầu ra sẽ không bao giờ có nhiều hơn ba chữ số thập phân sau điểm.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm:

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

Chúng ta có thể cho rằng đầu vào là không có số 0 đứng đầu không?
Toby Speight

@TobySpeight Có, không có số không hàng đầu.
Kevin Cruijssen

2
0.0-2.72 (tallest man ever was 2.72).- Bạn không phải 0.0khi bạn sinh ra ...
Johan Karlsson

1
@JohanKarlsson Tôi biết, đã nghĩ đến việc thêm tối thiểu, nhưng tôi quyết định chỉ để nó bắt đầu 00.0. :) Việc thêm tallest man ever was 2.72oldest woman ever was 122chỉ được thêm dưới dạng thông tin cho những người quan tâm.
Kevin Cruijssen

9
"[...] Vì vậy, chúng tôi chỉ thêm một vài năm vào năm sinh [...]" Bạn có nên trừ đi một vài năm kể từ năm sinh không?
wythagoras

Câu trả lời:



45

Python 2.7, 34 byte

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

Điều này trở lại cho 2.0 là gì?
Adám

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

3
Không, nó không. Tại sao bạn không tự thử? :)
Lynn

5
@ Adám Tôi sử dụng repl.it hoặc ideone.com cho Python. Xem bất kỳ câu trả lời Python nào tôi từng đăng và có lẽ nó có liên kết đến một trong hai câu trả lời đó.
mbomb007

1
đừng bận tâm, hiểu rồi về cơ bản, ánh xạ đúng hoặc sai thành 0 hoặc 1 chỉ mục trong mảng đó và sau đó áp dụng tối đa cho hai số.
Alexandru Pupsa

15

JavaScript (ES6), 27 31

Đầu vào được thực hiện dưới dạng một chuỗi. Để kiểm tra xem giá trị đầu vào có phải là số thập phân hay không, nó sẽ tự gắn vào: nếu không có dấu thập phân thì kết quả vẫn là một số hợp lệ, nếu không thì không. Để nhận ra một số hợp lệ (bao gồm 0), tôi sử dụng phép chia như trong javascript 1/nlà số và không phải 0 cho bất kỳ số nào n (cuối cùng giá trị là Infinitycho n==0), nếu không thì đó làNaN

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

Kiểm tra

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')
})

Giải pháp trước (sai) của tôi:

Lấy đầu vào là một số, bạn có thể sử dụng toán tử còn lại %để kiểm tra xem số đó có phải là số nguyên không.

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

hoặc là

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

Nhưng điều này không hoạt động như yêu cầu thách thức để phân biệt giữa, nói 22.0và đó là cùng một số. Vì vậy, nó không có khả năng để có được đầu vào là một số


2
Kết quả cho 2.0nên 2.0, không 18.
Neil

thật. 2.0%11.0%1sẽ có kết quả trong 0
từ

4
'javascript (es6) là verbose', bạn chỉ thấy điều đó tại codegolf
dwana

@Neil về ý nghĩ thứ hai có lẽ bạn đúng
edc65

3
1/(x+x)- bây giờ là tưởng tượng!
Neil

13

05AB1E , 13 11 byte

Sử dụng mã hóa CP-1252 .

ÐîQ18*14T/M

Giải trình

Ð             # 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)

Dùng thử trực tuyến


2
Bạn hơi chậm. Vẫn mất bạn 1,5 phút. ; P (đọc: Chết tiệt, nhanh quá.) Tất nhiên điều đó khá đơn giản.
Kevin Cruijssen

2
@KevinCruijssen: Vâng, việc triển khai khá nhanh trong một lang không yêu cầu nhiều thao tác nhấn phím: P
Emigna

@EriktheGolfer: Tốt hơn? Nếu không cảm thấy tự do để chỉnh sửa nó. Tôi đã thử nghiệm một vài cách định dạng khác nhau và chưa quyết định chọn cách tốt nhất. Gợi ý chào mừng.
Emigna

@Emigna Tôi vừa thêm hai khoảng trống quan trọng.
Erik the Outgolfer

2
@FrancescoCasula: Tôi đã tìm thấy một giải pháp ngắn hơn hoạt động trên TIO :)
Emigna

8

Java 8, 90 61 57 byte

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

-4 byte trả về Objectthay vì String; và một số byte bổ sung chuyển đổi Java 7 thành 8.
-4 byte lấy đầu vào Objectthay vì String.

Giải trình:

Hãy thử nó ở đây.

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

Có nhất thiết phải đặt dấu ngoặc quanh toán tử if / other không?
Roman Gräf

1
@ RomanGräf Có; chim nhạn có quyền ưu tiên thấp hơn +, có nghĩa là nếu bạn loại bỏ dấu ngoặc đơn, nó sẽ biến thành(""+i.contains(...)) ?
Nic Hartley


7

PHP, 40 byte

được sửa đổi bởi @ user59178 Cảm ơn bạn

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

PHP, 42 byte phiên bản đầu tiên

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

is_int($i=$argv[1]+0)ngắn hơn 2 byte strpos($i=$argv[1],".")và có thể phục vụ cùng một mục đích nếu bạn trao đổi 1.418
user59178

@ user59178 Tôi có thể sử dụng is_numerictrên một chuỗi nhưng khôngis_int
Jörg Hülsermann

đó là lý do tại sao có +0, để chuyển đổi nó thành một loại số.
dùng59178

1
Nó hoạt động chính xác với tôi (đã thử cả php 5.5 và 7.0 trên windows). Lưu ý rằng nó có các điều kiện đúng / sai đối với strpos($i=$argv[1],".")phiên bản, bạn có nhớ trao đổi kết quả đầu ra của chim nhạn không?
dùng59178

1
Trên thực tế, khi đọc gần hơn, cần phải <?=max(is_int(0+$i=$argv[1])?18:1.4,$i);thay vì <?=max(is_int($i=$argv[1]+0)?18:1.4,$i);tránh xuất 2 khi đưa ra 2.0.
dùng59178

6

EXCEL: 26 31 29 byte

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

Công thức có thể đi bất cứ nơi nào ngoại trừ A1, ô nhập.

Đã sửa lỗi và thay thế bằng đề xuất của Emigna.

Cảm ơn Alexandru đã tiết kiệm cho tôi một số byte bằng cách sử dụng sự thật


1
Ngoài ra, không phải là tốt hơn để xác định tên ncho ô nhập liệu sao? Nó có thể ở bất cứ đâu trong tài liệu và nó cũng ngắn hơn 2 byte.
Emigna

@Emigna Tôi có thể , nhưng tại thời điểm đó, tôi cảm thấy có một chút gian lận. 1 byte cho mỗi tên là không có gì để tranh giành, và nếu tôi giữ định dạng này, mọi người có thể sao chép và dán dễ dàng.

Tôi không thấy nó khác biệt như thế nào so với việc sử dụng biến đầu vào 1 ký tự trong lambda trong python chẳng hạn. Nhưng đó là cuộc gọi của bạn :)
Emigna

Chào! Làm thế nào để bạn tính toán các byte? Lưu tập tin với công thức với tên mặc định hoặc bằng cách nào khác?
Vityata

1
Bạn có thể xóa '= 0' và chuyển kết quả: 1,4 trước, 18 giây Ngoài ra, khi bạn hôn mê dưới dạng dấu tách thập phân, điều này có thể không hoạt động đối với hầu hết mọi người.
Alexandru Pupsa


5

Perl, 29 27 byte

Bao gồm +2 cho -lp

Cung cấp đầu vào trên STDIN

adult.pl <<< 1.24

adult.pl:

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

Nếu bạn không phiền một dòng mới nếu bạn thực sự là một người trưởng thành đầy đủ thì việc bỏ đi ltùy chọn cho 26 byte cũng hoạt động


5

GNU sed, 40 + 1 = 41 byte

(điểm +1 khi sử dụng -rcờ cho thông dịch viên)

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

Chú thích:

#!/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/

Chúng tôi tận dụng các ràng buộc về đầu vào, vì vậy không phải kiểm tra bắt đầu chuỗi khi chúng tôi thấy '1.' - chúng tôi biết chỉ có một chữ số trước dấu thập phân.

Kết quả kiểm tra:

$ ./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 byte

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

Ví dụ sử dụng: f "1.0"-> "1.6".

Loại nghiêm ngặt của Haskell yêu cầu sử dụng chuỗi làm đầu vào và đầu ra. Howevers, read, maxshowlà đa hình và xử lý tất cả các loại số.


Tôi nghĩ rằng tôi sẽ thông minh và làm điều đó mà không có lính gác, nhưng điều đó đã khiến nó hơi dài hơn thay vào đó :( Phiên bản của tôi:(#)x=map(show.max x.fst).reads;f s=head$18#s++1.4#s
Khối

@Cubic: Sử dụng tốt reads. Với một sửa đổi nhỏ, nó ngắn hơn một byte so với của tôi. Xin vui lòng gửi nó như là một câu trả lời riêng biệt. x#y=show.max x.fst<$>reads y;f s=head$18#s++1.4#s.
nimi

Ý tưởng thực sự tuyệt vời tiết kiệm parens với infmap fmap!
Khối

5

Java, 79 70 byte

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

Xác định hai phương thức với quá tải, sử dụng toán tử có điều kiện.

Gọi nó như thế f(5)hay f(1.4f).


1
Chào. x<18?18:xx<1.4f?1.4f:xngắn hơn Math.max. Tôi nghĩ rằng bạn có thể tìm thấy các mẹo chơi golf trong Java thú vị để đọc qua. :)
Kevin Cruijssen

Vâng, tất nhiên họ là. Làm sao tôi có thể quên chúng ...
corvus_192

Tôi thích điều này! Tại sao phải tự viết mã logic khi bạn có thể giảm tải cho trình biên dịch!
corsiKa


4

C #, 69 byte

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

Hãy thử trực tuyến!

Chương trình đầy đủ với các trường hợp thử nghiệm:

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
        }
    }
}

Một giải pháp khá đơn giản. Lưu ý rằng trên một số hệ thống float.Pude () có thể trả về kết quả không chính xác. Vượt qua CultureInfo.InvariantCARM làm đối số thứ hai theo câu trả lời này .


Đưa ra những hạn chế tôi nghĩ bạn có thể thoát khỏi việc thay thế s.Contains(".")bằngs[1]=='.'
JustinM - Tái lập lại

Hmm nvm, quên trường hợp kiểm tra 0. cũng rất gần :(
JustinM - Tái lập Monica

1
@Phaeze: Có, nó sẽ thất bại với bất kỳ đầu vào 1 chữ số nào với IndexOutOfRangeException. Mặt khác, bạn có thể tắt một byte bằng s[1]==46('.' Có mã ASCII là 46) hoặc một cách tiếp cận thậm chí tích cực hơn (giả sử bạn chỉ có các chữ số và ký tự '.' Tại chỉ mục 1) : s[1]<47.
adrianmp

1
Oo tôi thích điều đó, sẽ cố gắng để nhớ. Cảm ơn vì đã biến sự ngốc nghếch của tôi thành một cơ hội học tập :)
JustinM - Tái lập Monica

4

Ngôn ngữ công thức ghi chú của IBM / Lotus, 58 49 byte

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

Công thức trường được tính toán trong đó a là trường số có thể chỉnh sửa.

BIÊN TẬP

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

Lấy cảm hứng từ @Mego


4

Thạch , 16 15 13 byte

ŒṘċ”.ị1.4,18»

TryItOnline
Hoặc xem tất cả các trường hợp thử nghiệm, cũng tại TryItOnline

Làm sao?

ŒṘċ”.ị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
Này trả 18cho 2.0, thật đáng buồn :(
Lynn

Ah, sự phức tạp của Jelly là vượt trội.
Erik the Outgolfer

@Lynn cảm ơn, cố định với chi phí lớn; có lẽ có một cách ngắn hơn này.
Jonathan Allan

4

C ++, 68 byte

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

Câu trả lời này thực sự là 2 hàm có cùng tên và trình biên dịch sẽ gọi cho tôi để gọi, vì vậy nó hoạt động như một hàm mà không cần tôi phải nhập một đầu vào và quyết định đó là đầu vào nào. Vì đầu vào trên dấu phẩy động được đảm bảo có cùng độ chính xác như đầu ra, tôi có thể trả lại nó một cách an toàn mà không phải cắt bớt nó.

Ungolfed + xét nghiệm

#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";
}

Người dùng Szali Szali đề nghị lưu hai byte bằng cách biến floats thành autos. Tôi đã từ chối chỉnh sửa theo chính sách nhưng cứ tự nhiên chỉnh sửa nếu bạn xác nhận rằng nó hoạt động.
Martin Ender

Tất cả các văn bản trùng lặp! Bạn có thể lưu một vài ký tự bằng cách tạo hai định nghĩa thông qua macro.

Cảm ơn @MartinEnder. Bản chỉnh sửa của họ không biên dịch trong tất cả các trình biên dịch C ++ và giới thiệu tất cả các loại trường hợp kỳ lạ với các loại khác đột nhiên có thể được chuyển vào, vì vậy tôi sẽ chấp nhận 2 byte của mình để giữ cho câu trả lời của tôi dễ mang theo hơn một chút.
Cody

@Cody Đó là cuộc gọi của bạn, nhưng đối với PPCG, các ngôn ngữ liên quan được xác định bởi việc triển khai của họ, vì vậy câu trả lời không cần phải mang theo hoặc đặc biệt an toàn. Miễn là có một trình biên dịch nơi chương trình hoạt động (và các đầu vào cần thiết hoạt động, bất kể các phần tử không hợp lệ có hoạt động tốt không), điều đó hoàn toàn tốt.
Martin Ender

4

C #, 58 byte

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

Không cần phân tích chuỗi điên cho C #. Đầu vào dự kiến ​​là một inthoặc float(không may là C # không thể doublechuyển sang floatnếu doubletrong một object). Đầu ra sẽ là một inthoặc stringtrong một object.

(gần như bỏ lỡ ít nhất 1 yêu cầu thập phân, thêm vào đó ngay bây giờ)

Ung dung:

/*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
;

Thực hiện thay thế cũng là 58 byte.

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

4

Trên thực tế, 16 byte

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

Hãy thử trực tuyến!

Giải trình:

;:.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 

Tôi chưa bao giờ được lập trình trong thực tế trước đó, nhưng tại sao sử dụng thay vì chỉ 18? Tôi biết đó là cùng một số đếm byte nên nó không thực sự quan trọng, nhưng 18dường như dễ đọc hơn. Hoặc có một lý do nào đó nó sẽ không hoạt động trong ngôn ngữ lập trình / triển khai hiện tại?
Kevin Cruijssen

3
@KevinCruijssen 18đẩy a 1và an 8. Để đẩy một nghĩa đen 18, bạn sẽ sử dụng :18, nó dài hơn .
Mego

Tất nhiên, ngôn ngữ dựa trên ngăn xếp. Cảm ơn đã giải thích! +1
Kevin Cruijssen

4

Emacs Lisp, 37 byte

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

Đoán từ "kiểu dữ liệu" cho dù nên sử dụng phiên bản số nguyên hay số float. ( floatptrả về tcho 1.0, nhưng không phải cho 1.) Tham số là một số dưới dạng số nguyên hoặc float, tức là nó sẽ đáp ứng numberp.


4

Haskell, 49 byte

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

Về cơ bản, điều này đầu tiên cố gắng đọc đầu vào dưới dạng một số nguyên và sau đó là gấp đôi nếu thất bại. Sau đó tiến hành so sánh nó với đường cơ sở so sánh tương ứng.


3

Dyalog APL , 14 byte Kết xuất không hợp lệ bởi các thông số kỹ thuật khác

⎕IO←0được mặc định trên nhiều hệ thống. Lấy chuỗi làm đối số.

⍎⌈18 1.4⊃⍨'.'∘∊

⍎⌈ tối đa của đối số được đánh giá và

18 1.4⊃⍨ {18,1.4} được chọn bởi

'.'∘∊ đối số có chứa dấu chấm không


3

C #, 95 byte

Chơi gôn

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

Ung dung:

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;
    }
  }

Các trường hợp thử nghiệm:

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"));

Đầu ra:

18
18
18
18
18
43
122

1.4
1.4
1.4
1.4
1.4
1.74
2.0
2.72

1
Xin chào, chào mừng đến với PPCG! Cách tiếp cận hiện tại của bạn có thể được rút ngắn một chút như thế này: string y(string p){int a;return int.TryParse(p,out a)?a<1?"18":p:double.Parse(p)<1.4?"1.4":p;}(loại bỏ ngoặc; >=1.4đến <1.4bằng cách trao đổi các "1.4"p; thay đổi decimalđể doublenên Mlà biến mất Ngoài ra, người khác vừa mới đăng. Một cách tiếp cận khác nhau trong C # đó là hơi ngắn hơn Bạn có thể tìm thấy. Lời khuyên cho việc chơi golf trong C # thú vị để đọc qua. Một lần nữa, xin chào mừng! :)
Kevin Cruijssen

Xin chào, cảm ơn vì những bình luận hữu ích! Tôi hoàn toàn quên mất những dấu ngoặc bổ sung mà tôi đã có để ngăn mình mất dấu vết từ toán tử Ternary-Ternary! Bây giờ tôi đã lưu 5 byte.
Pete Arden

Bạn có thể lưu một byte bằng cách sử dụng float.Parsethay vì double.Parse. Và ngoài ra, nếu bạn di chuyển khai báo a vào các đối số phương thức với giá trị mặc định, bạn có thể loại bỏ câu lệnh trả về của mình bằng cách sử dụng thành viên thân biểu thức. ví dụ: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 - Tái lập Monica

3

AWK - 29 byte

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

Sử dụng:

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

Thử nghiệm đã được thực hiện với gawktrên RHEL 6. Tôi đã thử với tất cả các trường hợp thử nghiệm, tiếc là tôi không có AWKtrên máy có truy cập internet, vì vậy không thể sao chép-dán.

Có một cách nhỏ gọn hơn để làm điều này trong AWK?


3

C, 50 byte:

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

Số byte bao gồm dòng mới ở cuối định nghĩa macro.

Kiểm tra :

#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");}

Đã thử nghiệm với

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");
}

Đầu ra

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

Điều này không hợp lệ ... Đầu vào của 12 sẽ xuất ra 18
Phân rã Beta

@BetaDecay bạn đúng. Tôi cần thêm một nhân vật & nhân vật. Cảm ơn đã chỉ ra rằng.
cleblanc

2

Mẻ, 102 byte

@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%

Đầu tiên xác định xem đầu vào có phải là số nguyên hay không bằng cách kiểm tra xem việc xóa tất cả .s có ảnh hưởng gì đến chuỗi không. Nếu đó là giá trị thì dễ dàng so sánh với 18, nếu không, các ký tự thứ nhất và thứ ba được kết hợp thành một số được so sánh với 14.


2

PHP: 40 byte

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

psuedocode, (quay vòng lồng nhau):

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
Chào mừng đến với PPCG! Xin lưu ý rằng đầu vào (theo mặc định) phải thông qua STDIN, đối số chức năng hoặc đối số chương trình đầy đủ.
vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.