Ya, tentu saja saya sudah dewasa!

44

Saya pikir kita semua telah melakukan ini sebagai anak-anak: beberapa situs web memerlukan usia minimum 18 tahun, jadi kita kurangi beberapa tahun dari tahun kelahiran dan voa, kita 18+.
Selain itu, untuk sebagian besar wahana di taman hiburan, ketinggian minimum untuk masuk adalah 1,40 meter (setidaknya di sini di Belanda). Tentu saja ini tidak mudah ditipu daripada usia, tetapi Anda bisa mengenakan sepatu dengan sepatu tebal, menjepit rambut, mengenakan topi, berdiri di atas jari kaki, dll.

Memasukkan:

Program / fungsi Anda menerima bilangan bulat positif atau desimal.

Keluaran:

  • Apakah input bilangan bulat >= 18? Cukup cetak inputnya.
  • Apakah input bilangan bulat 0-17? Cetak 18.
  • Apakah inputnya desimal >= 1.4? Cukup cetak inputnya.
  • Apakah inputnya desimal 0.0-1.4? Cetak 1.4.

Aturan tantangan:

  • Asumsikan input akan selalu berada dalam kisaran 0-122(wanita tertua 122) atau 0.0-2.72(pria tertinggi 2,72).
  • Anda diizinkan mengambil input sebagai String, objek, atau apa pun yang Anda inginkan.
  • Input desimal tidak akan pernah memiliki lebih dari tiga tempat desimal setelah titik desimal.
  • 2atau 2.keduanya bukan output yang valid untuk 2.0. Anda bebas untuk menghasilkan 2.00atau 2.000sebaliknya 2.0.
    Sama seperti input, output tidak akan pernah memiliki lebih dari tiga tempat desimal setelah titik.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

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
Kevin Cruijssen
sumber
Bisakah kita berasumsi bahwa input bebas dari nol di depan?
Toby Speight
@TobySpeight Ya, tidak ada nol di depan.
Kevin Cruijssen
2
0.0-2.72 (tallest man ever was 2.72).- Anda tidak 0.0ketika Anda dilahirkan ...
Johan Karlsson
1
@JohanKarlsson Saya tahu, berpikir tentang menambahkan minimum, tapi saya memutuskan untuk membiarkannya dimulai pada 0dan 0.0. :) Yang ditambahkan tallest man ever was 2.72dan oldest woman ever was 122baru saja ditambahkan sebagai fakta informasi untuk mereka yang tertarik.
Kevin Cruijssen
9
"[...] jadi kami hanya menambahkan beberapa tahun ke tahun kelahiran [...]" Bukankah kamu harus mengurangi beberapa tahun dari tahun kelahiran?
wythagoras

Jawaban:

45

Python 2.7, 34 byte

lambda x:max(x,[18,1.4]['.'in`x`])
Lynn
sumber
Apa pengembalian ini untuk 2.0?
Adám
2
@ Adámmax(2.0,[18,1.4][True]) == max(2.0,1.4) == 2.0
Lynn
3
Tidak, tidak. Mengapa Anda tidak mencobanya sendiri? :)
Lynn
5
@ Adam Aku digunakan repl.it atau ideone.com untuk Python. Lihat jawaban Python yang pernah saya posting, dan mungkin memiliki tautan ke salah satu dari keduanya.
mbomb007
1
tidak apa-apa, mengerti. jadi pada dasarnya benar atau salah memetakan ke 0 atau 1 indeks dalam array itu dan kemudian menerapkan max pada dua angka.
Alexandru Pupsa
15

JavaScript (ES6), 27 31

Input diambil sebagai string. Untuk memeriksa apakah nilai input memiliki desimal, ditambahkan ke dirinya sendiri: jika tidak ada titik desimal, hasilnya masih berupa angka yang valid, kalau tidak, tidak. Untuk mengenali angka yang valid (termasuk 0), saya menggunakan pembagian seperti dalam javascript 1/nadalah angka dan bukan 0 untuk angka apa pun n (akhirnya nilainya adalah Infinityuntuk n==0), selain itu nilainyaNaN

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

Uji

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

Solusi prev (salah) saya:

Mengambil input sebagai angka, Anda dapat menggunakan operator sisa %untuk memeriksa apakah nomornya bilangan bulat.

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

atau

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

Tetapi ini tidak berfungsi sebagai permintaan tantangan untuk membedakan antara, katakanlah, 2dan 2.0dan itu adalah angka yang sama. Jadi tidak mungkin untuk mendapatkan input sebagai angka

edc65
sumber
2
Hasil untuk 2.0seharusnya 2.0, bukan 18.
Neil
memang. 2.0%1dan 1.0%1akan menghasilkan 0
aross
4
'javascript (es6) is verbose', Anda hanya melihat bahwa di codegolf
dwana
@Neil pada pemikiran kedua Anda mungkin benar
edc65
3
1/(x+x)- sekarang itu imajinatif!
Neil
13

05AB1E , 13 11 byte

Menggunakan pengodean CP-1252 .

ÐîQ18*14T/M

Penjelasan

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

Cobalah online

Emigna
sumber
2
Kamu agak lambat. Anda masih membutuhkan waktu 1,5 menit. ; P (baca: Sial, itu cepat.) Cukup mudah tentu saja.
Kevin Cruijssen
2
@KevinCruijssen: Ya, implementasinya cukup cepat karena tidak memerlukan banyak penekanan tombol: P
Emigna
@EriktheGolfer: Lebih baik? Jika tidak merasa bebas untuk mengeditnya. Saya telah bereksperimen dengan beberapa cara format yang berbeda dan belum memutuskan yang terbaik. Saran diterima.
Emigna
@ Emigna Saya baru saja menambahkan dua ruang penting yang hilang.
Erik the Outgolfer
2
@ FrancescoCasula: Saya menemukan solusi lebih pendek yang bekerja pada 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 yang dikembalikan, Objectbukan String; dan beberapa byte tambahan mengkonversi Java 7 sampai 8.
-4 byte mengambil input sebagai Objectbukan Stringjuga.

Penjelasan:

Coba di sini.

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
Kevin Cruijssen
sumber
Apakah perlu menempatkan tanda kurung di sekitar operator if / else?
Roman Gräf
1
@ RomanGräf Ya; ternary memiliki prioritas lebih rendah daripada +, yang berarti bahwa jika Anda menghapus tanda kurung, itu akan berubah menjadi(""+i.contains(...)) ?
Nic Hartley
7

Pyth, 14 byte

eS,@,18h.4}\.`

Cobalah online.

PurkkaKoodari
sumber
7

PHP, 40 Bytes

dimodifikasi oleh @ user59178 Terima Kasih

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

PHP, 42 Bytes Versi pertama

<?=max(strpos($i=$argv[1],".")?1.4:18,$i);
Jörg Hülsermann
sumber
is_int($i=$argv[1]+0)2 byte lebih pendek daripada strpos($i=$argv[1],".")dan dapat melayani tujuan yang sama jika Anda menukar 1.4dan18
user59178
@ user59178 Saya bisa menggunakan is_numericstring tetapi tidakis_int
Jörg Hülsermann
itu sebabnya ada +0, untuk mengubahnya menjadi tipe numerik.
user59178
1
Ini berfungsi dengan baik untuk saya (mencoba php 5.5 dan 7.0 di windows). Perhatikan bahwa ia memiliki kondisi true / false berlawanan dengan strpos($i=$argv[1],".")versi, apakah Anda ingat untuk menukar output dari ternary?
user59178
1
Sebenarnya, pada bacaan yang lebih dekat, itu perlu <?=max(is_int(0+$i=$argv[1])?18:1.4,$i);daripada <?=max(is_int($i=$argv[1]+0)?18:1.4,$i);menghindari keluaran 2 ketika diberikan 2.0.
user59178
6

EXCEL: 26 31 29 Bytes

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

Formula dapat pergi ke mana pun kecuali A1, sel input.

Memperbaiki kesalahan, dan diganti dengan saran Emigna.

Terima kasih kepada Alexandru karena telah menyelamatkan saya beberapa byte menggunakan kebenaran


sumber
1
Juga, bukankah lebih baik untuk mendefinisikan nama nuntuk sel input? Itu bisa di mana saja dalam dokumen itu dan juga 2 byte lebih pendek.
Emigna
@ Emigna saya bisa , tetapi pada saat itu mendapat sedikit cheat-y saya merasa. 1 byte per nama tidak ada artinya, dan Jika saya menyimpan format ini, orang dapat menyalin dan menempel dengan mudah.
Saya tidak melihat bagaimana itu berbeda dari menggunakan variabel input 1-huruf dalam lambda di python misalnya. Tapi ini panggilan Anda :)
Emigna
Hai! Bagaimana Anda menghitung byte? Simpan file dengan rumus dengan nama default atau entah bagaimana caranya?
Vityata
1
Anda dapat menghapus '= 0' dan mengalihkan hasilnya: 1,4 pertama, 18 detik Juga, karena Anda memiliki koma sebagai pemisah desimal, ini mungkin tidak berfungsi untuk kebanyakan orang.
Alexandru Pupsa
5

Brachylog , 14 byte

#$:18ot|:1.4ot

Cobalah online!

Penjelasan

    #$             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
Fatalisasi
sumber
5

Perl, 29 27 byte

Termasuk +2 untuk -lp

Berikan masukan pada STDIN

adult.pl <<< 1.24

adult.pl:

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

Jika Anda tidak keberatan dengan baris baru tambahan jika Anda benar-benar sudah dewasa, maka meninggalkan lopsi untuk 26 byte juga berfungsi

Ton Hospel
sumber
5

GNU sed, 40 + 1 = 41 byte

(skor +1 untuk penggunaan -rflag to interpreter)

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

Beranotasi:

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

Kami memanfaatkan kendala pada input, jadi tidak perlu menguji awal string ketika kita melihat '1.' - kita tahu hanya ada satu digit sebelum titik desimal.

Hasil tes:

$ ./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
Toby Speight
sumber
5

Haskell, 50 byte

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

Contoh penggunaan: f "1.0"-> "1.6".

Jenis Haskell yang ketat membutuhkan penggunaan string sebagai input dan output. Howevers, read, maxdan showadalah polimorfik dan menangani semua jenis numerik.

nimi
sumber
Saya pikir saya akan menjadi pintar dan melakukannya tanpa penjaga, tapi itu akhirnya membuatnya sedikit lebih lama :( Versi saya:(#)x=map(show.max x.fst).reads;f s=head$18#s++1.4#s
Cubic
@Cubic: Penggunaan yang bagus reads. Dengan sedikit modifikasi, itu satu byte lebih pendek dari saya. Silakan posting sebagai jawaban terpisah. x#y=show.max x.fst<$>reads y;f s=head$18#s++1.4#s.
nimi
Ide yang sangat keren menyelamatkan parens dengan infix fmap!
Cubic
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;}

Menentukan dua metode dengan kelebihan beban, yang menggunakan operator kondisional.

Sebut seperti f(5)atau f(1.4f).

corvus_192
sumber
1
Hai. x<18?18:xdan x<1.4f?1.4f:xlebih pendek dari Math.max. Saya pikir Anda mungkin menemukan tips untuk bermain golf di Jawa yang menarik untuk dibaca. :)
Kevin Cruijssen
Ya tentu saja. Bagaimana saya bisa melupakan mereka ...
corvus_192
Aku suka ini! Buat apa kode sendiri logika saat Anda bisa menurunkannya ke kompiler!
corsiKa
4

CJam, 18 14 byte

Disimpan 4 byte berkat Martin Ender.

q~_`'.&1.4I?e>

Penerjemah online

Neorej
sumber
4

C #, 69 byte

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

Cobalah online!

Program lengkap dengan kasus uji:

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

Solusi yang sangat mudah. Perhatikan bahwa pada beberapa sistem float.Parse () mungkin mengembalikan hasil yang salah. Lewati CultureInfo.InvariantCulture sebagai argumen kedua sesuai dengan jawaban ini .

adrianmp
sumber
Mengingat kendala saya pikir Anda bisa lolos dengan mengganti s.Contains(".")dengans[1]=='.'
JustinM - Reinstate Monica
Hmm nvm, lupakan 0 test case. begitu dekat juga :(
JustinM - Reinstate Monica
1
@Phaeze: Ya, itu akan gagal pada input 1 digit dengan IndexOutOfRangeException. Jika tidak, Anda bisa mencukur byte off dengan s[1]==46, atau pendekatan yang lebih agresif (menganggap Anda hanya memiliki angka dan karakter pada indeks 1 '') (memiliki kode ASCII dari 46 ''): s[1]<47.
adrianmp
1
Oo saya suka itu, akan berusaha mengingat. Terima kasih telah mengubah kebodohan saya menjadi peluang belajar :)
JustinM - Reinstate Monica
4

Bahasa Formula IBM / Lotus Notes, 58 49 byte

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

Rumus bidang terkomputasi di mana a adalah bidang numerik yang dapat diedit.

SUNTING

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

Alternatif terinspirasi oleh @Mego

ElPedro
sumber
4

Jelly , 16 15 13 byte

ŒṘċ”.ị1.4,18»

TryItOnline
Atau lihat semua test case, juga di TryItOnline

Bagaimana?

ŒṘċ”.ị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)
Jonathan Allan
sumber
2
Ini kembali 18untuk 2.0, sayangnya :(
Lynn
Ah, kompleksitas Jelly lebih unggul.
Erik the Outgolfer
@ Lynn terima kasih, tetap dengan biaya kekalahan; mungkin ada cara yang lebih pendek dari ini.
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;}

Jawaban ini sebenarnya 2 fungsi dengan nama yang sama, dan kompiler berfungsi untuk saya yang harus dihubungi, sehingga berfungsi sebagai satu fungsi tanpa saya harus mengambil satu input dan memutuskan yang mana. Karena input pada floating point dijamin memiliki presisi yang sama dengan output, saya dapat mengembalikannya dengan aman tanpa harus memotongnya juga.

Tes + tidak digabungkan

#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
sumber
Pengguna Szali Szali menyarankan untuk menyimpan dua byte dengan mengubah floats menjadi autos. Saya telah menolak hasil edit sesuai kebijakan tetapi merasa bebas untuk mengeditnya sendiri jika Anda mengonfirmasi bahwa itu berhasil.
Martin Ender
Semua duplikasi teks itu! Anda dapat menyimpan beberapa karakter dengan membuat dua definisi melalui makro.
Terima kasih @MartinEnder. Suntingan mereka tidak dikompilasi di semua kompiler C ++, dan memperkenalkan semua jenis kasus aneh dengan tipe lain yang tiba-tiba dapat dilewati, jadi saya akan menerima 2 byte saya untuk menjaga jawaban saya sedikit lebih portabel.
Cody
@Cody Ini panggilan Anda, tetapi sejauh menyangkut PPCG bahasa ditentukan oleh implementasinya, jadi jawaban tidak perlu portabel atau sangat aman. Selama ada kompiler di mana program bekerja (dan input yang diperlukan bekerja, terlepas dari apakah yang tidak valid akan bekerja juga), itu sepenuhnya baik-baik saja.
Martin Ender
4

C #, 58 byte

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

Tidak perlu penguraian string gila untuk C #. Input diharapkan menjadi intatau float(sayangnya C # tidak bisa melemparkan doubleke floatjika doubleberada dalam object). Output akan berupa intatau stringdalam object.

(hampir melewatkan setidaknya 1 persyaratan desimal, menambahkan itu sekarang)

Tidak Disatukan:

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

Implementasi alternatif yang juga 58 byte.

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

Sebenarnya, 16 byte

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

Cobalah online!

Penjelasan:

;:.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 
Mego
sumber
Saya belum pernah memprogram Sebenarnya , tapi mengapa menggunakan bukan hanya 18? Saya tahu ini adalah byte-count yang sama sehingga tidak terlalu penting, tetapi 18tampaknya lebih mudah dibaca. Atau adakah alasan mengapa itu tidak akan berfungsi dalam bahasa implementasi / pemrograman saat ini?
Kevin Cruijssen
3
@KevinCruijssen 18mendorong 1dan 8. Untuk mendorong literal 18, Anda akan menggunakan :18, yang lebih panjang dari .
Mego
Ah tentu saja, bahasa berbasis stack. Terima kasih untuk penjelasannya! +1
Kevin Cruijssen
4

Emacs Lisp, 37 byte

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

Menebak dari "datatype" apakah versi integer atau float harus digunakan. ( floatpKembali tuntuk 1.0, tetapi tidak untuk 1.) parameter adalah nomor sebagai integer atau float, yaitu harus memenuhi numberp.

Tuan Yuuma
sumber
4

Haskell, 49 byte

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

Pada dasarnya, ini pertama kali mencoba untuk membaca input sebagai integer dan kemudian sebagai double jika gagal. Kemudian hasil untuk membandingkannya dengan baseline perbandingan masing-masing.

Kubik
sumber
3

Dyalog APL , 14 byte Diberikan tidak valid dengan spesifikasi lebih lanjut

⎕IO←0yang merupakan standar pada banyak sistem. Mengambil string sebagai argumen.

⍎⌈18 1.4⊃⍨'.'∘∊

⍎⌈ maks dari argumen yang dievaluasi dan

18 1.4⊃⍨ {18,1.4} dipilih oleh

'.'∘∊ apakah argumen berisi suatu periode

Adm
sumber
3

C #, 95 Bytes

Golf:

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

Tidak Disatukan:

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

Kasus uji:

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

Keluaran:

18
18
18
18
18
43
122

1.4
1.4
1.4
1.4
1.4
1.74
2.0
2.72
Pete Arden
sumber
1
Hai, selamat datang di PPCG! Pendekatan Anda saat ini dapat dipersingkat sedikit seperti ini: string y(string p){int a;return int.TryParse(p,out a)?a<1?"18":p:double.Parse(p)<1.4?"1.4":p;}(menghapus tanda kurung; >=1.4dengan <1.4dengan menukar "1.4"dan p; berubah decimalmenjadi doublebegitu Mhilang. Juga, orang lain hanya memposting pendekatan yang berbeda dalam C # yang sedikit lebih pendek. Anda mungkin menemukan Tips untuk bermain golf dalam bahasa C # menarik untuk dibaca. Sekali lagi, selamat datang! :)
Kevin Cruijssen
Hai, terima kasih atas komentarnya yang bermanfaat! Saya benar-benar lupa dengan tanda kurung tambahan yang saya miliki untuk menghentikan diri saya kehilangan jejak dari operator Ternary-Ternary! Saya telah menyimpan 5 byte sekarang secara keseluruhan.
Pete Arden
Anda dapat menyimpan satu byte dengan menggunakan float.Parsealih-alih double.Parse. Dan juga jika Anda memindahkan deklarasi a ke dalam argumen metode dengan nilai default, Anda dapat menjatuhkan pernyataan pengembalian dengan menggunakan anggota bertubuh ekspresi. misalnya: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 byte

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

Pemakaian:

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

Pengujian dilakukan dengan gawkpada RHEL 6. Saya mencoba dengan semua kasus uji, sayangnya saya tidak memiliki AWKpada mesin yang memiliki akses internet, jadi salin-tempel tidak mungkin.

Apakah ada cara yang lebih ringkas untuk melakukan ini AWK?

Robert Benson
sumber
3

C, 50 byte:

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

Hitungan byte menyertakan baris baru di akhir definisi makro.

Tes :

#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
sumber
3

C #, 71 byte

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

coba di sini

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

Diuji dengan

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

Keluaran

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
sumber
Ini tidak valid ... Input dari 12 seharusnya menampilkan 18
Beta Decay
@BetaDecay Anda benar. Saya perlu menambahkan karakter & tambahan. Terima kasih telah menunjukkannya.
cleblanc
2

Batch, 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%

Pertama menentukan apakah input bilangan bulat dengan memeriksa apakah menghapus semua .s memiliki efek pada string. Jika ya maka nilainya dengan mudah dibandingkan dengan 18, jika tidak, karakter pertama dan ketiga digabungkan menjadi angka yang dibandingkan dengan 14.

Neil
sumber
2

PHP: 40 byte

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

psuedocode, (turnary bersarang):

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
sumber
1
Selamat datang di PPCG! Harap dicatat bahwa input (secara default) harus melalui STDIN, argumen fungsi, atau argumen program lengkap.
aross