ใช่แน่นอนฉันเป็นผู้ใหญ่!


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 ใช่ไม่มีศูนย์นำหน้า
Kevin Cruijssen

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.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
@ Adam ฉันใช้repl.itหรือideone.comสำหรับ Python ดูคำตอบของ Python ที่ฉันโพสต์ไว้และอาจมีลิงก์ไปยังหนึ่งในสองรายการนี้
mbomb007

1
ไม่เป็นไรเข้าใจเลย โดยพื้นฐานแล้วจะเป็นจริงหรือเท็จแมปกับดัชนี 0 หรือ 1 ในอาร์เรย์นั้นจากนั้นจึงใช้ค่าสูงสุดกับตัวเลขทั้งสอง
Alexandru Pupsa

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

โซลูชัน prev (ผิด) ของฉัน:

การป้อนข้อมูลเป็นตัวเลขคุณสามารถใช้ตัวดำเนินการส่วนที่เหลือ%เพื่อตรวจสอบว่าตัวเลขเป็นจำนวนเต็มหรือไม่

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
Neil

จริง 2.0%1และ1.0%1จะส่งผลให้ 0
aross

4
'javascript (es6) เป็น verbose' คุณจะเห็นว่าที่ codegolf
dwana

@Neil ในวันที่สองคิดว่าคุณอาจขวา
edc65

3
1/(x+x)- ตอนนี้มันช่างจินตนาการ!
Neil

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 (อ่าน: ประณามอย่างรวดเร็ว) มันค่อนข้างตรงไปตรงมาแน่นอน
Kevin Cruijssen

2
@KevinCruijssen: ใช่การใช้งานค่อนข้างเร็วในภาษาที่ไม่ต้องการการกดปุ่มหลายครั้ง: P
Emigna

@EriktheGolfer: ดีกว่าเหรอ? หากไม่อยากแก้ไข ฉันกำลังทดลองรูปแบบการจัดรูปแบบที่แตกต่างกันสองสามวิธีและยังไม่ได้ตัดสินใจในวิธีที่ดีที่สุดอย่างเคร่งครัด ยินดีต้อนรับข้อเสนอแนะ
Emigna

@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
Roman Gräf

1
@ RomanGräfใช่; ternary มีความสำคัญต่ำกว่า+ซึ่งหมายความว่าหากคุณลบวงเล็บก็จะกลายเป็น(""+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
JörgHülsermann

นั่นคือสาเหตุที่มีการ+0แปลงเป็นประเภทตัวเลข
user59178

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 เซลล์ป้อนเข้า

แก้ไขข้อผิดพลาดและแทนที่ด้วยคำแนะนำของ Emigna

ขอบคุณ Alexandru ที่ช่วยฉันกู้ไบท์ด้วยความจริง


1
นอกจากนี้การกำหนดชื่อnสำหรับเซลล์อินพุตให้ดีขึ้นหรือไม่ สามารถอยู่ที่ใดก็ได้ในเอกสารและสั้นกว่า 2 ไบต์
Emigna

@ Emigna ฉันทำได้แต่ ณ จุดนั้นมันโกงนิดหน่อย - ฉันรู้สึก 1 ไบต์ต่อชื่อไม่มีอะไรที่น่าสงสัยและถ้าฉันเก็บรูปแบบนี้ผู้ใช้สามารถคัดลอกและวางได้อย่างง่ายดาย

ฉันไม่เห็นความแตกต่างของการใช้ตัวแปรอินพุต 1 ตัวอักษรในแลมบ์ดาในไพ ธ อน แต่มันก็เป็นการโทรของคุณ :)
Emigna

Hi! คุณคำนวณจำนวนไบต์ได้อย่างไร บันทึกไฟล์ด้วยสูตรด้วยชื่อเริ่มต้นหรืออย่างอื่น?
Vityata

1
คุณสามารถลบ '= 0' และสลับผลลัพธ์: 1.4 ก่อน 18 วินาทีนอกจากนี้เนื่องจากคุณมีอาการโคม่าเป็นตัวแยกทศนิยมซึ่งอาจไม่เหมาะสำหรับคนส่วนใหญ่
Alexandru Pupsa


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 bytes

(คะแนน +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มี polymorphic และจัดการกับชนิดของตัวเลขทั้งหมด


ฉันคิดว่าฉันจะฉลาดและทำมันได้โดยไม่ต้องยาม แต่ที่สิ้นสุดการทำมันอีกเล็กน้อยแทน :( รุ่นของฉัน:(#)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

ไอเดียเจ๋งจริง ๆ บันทึก parens ด้วย infix 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

ใช่แน่นอนพวกเขาเป็น ฉันจะลืมพวกเขาได้อย่างไร ...
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 ใกล้เกินไปด้วย :(
Phaeze

1
@Phaeze: ใช่มันจะล้มเหลวในการป้อนข้อมูล 1 หลักใด ๆ กับ IndexOutOfRangeException มิฉะนั้นคุณสามารถโกนไบต์ออกด้วยs[1]==46หรือแม้กระทั่งวิธีการเชิงรุกมากขึ้น (ทะนงคุณมีเพียงตัวเลขและตัวอักษรที่ดัชนี 1 '') (มีรหัส ASCII 46 s[1]<47''):
adrianmp

1
Oo ฉันชอบที่จะพยายามจำ ขอขอบคุณที่เปลี่ยนความโง่เขลาของฉันให้กลายเป็นโอกาสในการเรียนรู้ :)
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
ผลตอบแทนนี้18สำหรับ2.0เศร้า :(
ลินน์

ความซับซ้อนของเยลลี่นั้นเหนือกว่า
Erik the Outgolfer

@ ลินน์ขอบคุณคงที่ค่าใช้จ่ายมหันต์; อาจจะมีวิธีที่สั้นกว่านี้
Jonathan Allan

4

C ++, 68 ไบต์

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

คำตอบนี้เป็น 2 ฟังก์ชั่นที่มีชื่อเดียวกันและคอมไพเลอร์ทำงานได้ดีสำหรับฉันที่จะเรียกดังนั้นมันจึงทำหน้าที่เป็นหนึ่งฟังก์ชั่นโดยที่ฉันไม่จำเป็นต้องใส่ในอินพุตเดียวและตัดสินใจว่ามันคืออะไร เนื่องจากอินพุตบนจุดลอยตัวรับประกันว่ามีความแม่นยำเช่นเดียวกับเอาต์พุตฉันจึงสามารถส่งคืนได้อย่างปลอดภัยโดยไม่ต้องตัดทอน

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

ผู้ใช้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 # การป้อนข้อมูลคาดว่าจะเป็นintหรือfloat(น่าเสียดายที่ C # ไม่สามารถส่งdoubleไปยังfloatหากdoubleอยู่ในobject) เอาท์พุทจะเป็นอย่างใดอย่างหนึ่งintหรือในstringobject

(เกือบพลาดข้อกำหนดทศนิยมอย่างน้อย 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ดูเหมือนว่าจะอ่านได้มากกว่า หรือมีเหตุผลที่จะไม่ทำงานในภาษาการใช้งาน / การเขียนโปรแกรมในปัจจุบัน?
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⊃⍨'.'∘∊

⍎⌈ อาร์กิวเมนต์สูงสุดที่ประเมินและ

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

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 # ที่น่าสนใจในการอ่านอีกครั้งยินดีต้อนรับ! :)
Kevin Cruijssen

สวัสดีขอบคุณสำหรับความคิดเห็นที่เป็นประโยชน์! ฉันลืมเกี่ยวกับวงเล็บพิเศษเหล่านั้นทั้งหมดที่ฉันมีเพื่อหยุดการสูญเสียการติดตามจากผู้ประกอบการ Ternary-Ternary! ฉันได้บันทึกไปแล้ว 5 ไบต์โดยรวมแล้ว
Pete Arden

คุณสามารถบันทึกหนึ่งไบต์โดยใช้แทนfloat.Parse double.Parseและถ้าคุณย้ายการประกาศของ a ลงในอาร์กิวเมนต์ของเมธอดด้วยค่าเริ่มต้นคุณสามารถดร็อปคำสั่งการส่งคืนโดยใช้นิพจน์สมาชิกที่มีบอดี้ เช่น: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

ทำการทดสอบกับ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 (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 

1
ยินดีต้อนรับสู่ PPCG! โปรดทราบว่าอินพุต (โดยค่าเริ่มต้น) จะต้องผ่าน STDIN, อาร์กิวเมนต์ของฟังก์ชันหรืออาร์กิวเมนต์ของโปรแกรมแบบเต็ม
Aross
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.