Evet, elbette bir yetişkinim!


44

Sanırım hepimiz bunu bir çocuk olarak yaptık: bazı web siteleri en az 18 yaşını gerektirir, bu nedenle doğumdan ve birkaç yıldan birkaç yıl sonra çıkardık, biz 18 yaşından büyükiz.
Ek olarak, eğlence parklarındaki çoğu yolculuk için girmesi gereken minimum yükseklik 1,40 metredir (burada en azından Hollanda'da). Tabii ki bu yaştan daha az kolay aldatılabilir, ancak kalın topuklu ayakkabılar giyebilir, saçlarınızı yukarı kaldırabilir, bir şapka giyebilir, ayak parmaklarınız üzerinde durabilirsiniz, vb.

Giriş:

Programınız / işleviniz pozitif bir tamsayı veya ondalık sayı kabul eder.

Çıktı:

  • Giriş bir tamsayı >= 18mı? Sadece girişi yazdırın.
  • Giriş bir tamsayı 0-17mı? Baskı 18.
  • Giriş ondalık >= 1.4mı? Sadece girişi yazdırın.
  • Giriş ondalık 0.0-1.4mı? Baskı 1.4.

Meydan okuma kuralları:

  • Girdilerin her zaman 0-122(en yaşlı kadın 122 idi) veya 0.0-2.72(en uzun erkek 2,72) aralığında olacağını varsayalım .
  • Girdiyi bir String, nesne ya da tercih ettiğiniz herhangi bir şey olarak kabul etmenize izin verilir.
  • Ondalık girişler hiçbir zaman ondalık noktadan sonra üçten fazla ondalık basamağa sahip olmaz.
  • 2ya da 2.her ikisi için geçerli çıktılar değil 2.0. Sen çıkış serbesttir 2.00ya 2.000yerine 2.0ancak.
    Giriş gibi, çıkış hiçbir zaman noktadan sonra üçten fazla ondalık basamağa sahip olmaz.

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem ile uygun parametreler, tam programlar kullanabilirsiniz. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen gerekirse bir açıklama ekleyin.

Test durumları:

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

Girdilerin başlarda sıfır olmadığını kabul edebilir miyiz?
Toby Speight

@TobySpeight Evet, baştaki sıfır yok.
Kevin Cruijssen

2
0.0-2.72 (tallest man ever was 2.72).- 0.0Doğduğun zaman değilsin ...
Johan Karlsson

1
Biliyorum @JohanKarlsson, minimum ekleme hakkında düşündüm, ama ben sadece başlayalım karar 0ve 0.0. :) Eklendi tallest man ever was 2.72ve oldest woman ever was 122ilgilenenler için bilgilendirme gerçekleri olarak eklendi.
Kevin Cruijssen

9
"Biz sadece doğum yıla birkaç yıl eklemek böylece [...] [...]" Eğer gerekmiyor çıkarma doğum yıla birkaç yıl?
wythagoras

Yanıtlar:



45

Python 2.7, 34 bayt

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

Bu 2.0 için ne dönüyor?
Adám

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

3
Hayır, değil. Neden kendin denemiyorsun? :)
Lynn

5
@ Adám Python için repl.it veya ideone.com kullanıyorum . Şimdiye kadar gönderdiğim tüm Python yanıtlarını görüntüleyin ve muhtemelen bu ikisinden biriyle bağlantısı vardır.
mbomb007 29:16

1
neyse, anladım. yani temelde doğru veya yanlış o dizideki 0 veya 1 indeksle eşleşir ve sonra iki sayıya maks uygular.
Alexandru Pupsa,

15

JavaScript (ES6), 27 31

Bir dize olarak alınan giriş. Girilen değerin ondalık olup olmadığını kontrol etmek için, kendisine eklenir: ondalık nokta yoksa sonuç hala geçerli bir sayıdır, aksi halde değildir. JavaScript gibi (0 dahil) geçerli bir sayı tanımak için, ben bölünme kullanan 1/nherhangi sayısal için 0 sayısal olup n (ki sonunda değerdir Infinityiçin n==0) başka bu,NaN

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

Ölçek

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 (yanlış) çözümüm:

Girdiyi sayı olarak alarak %, sayının tamsayı olup olmadığını kontrol etmek için kalan operatörü kullanabilirsiniz .

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

veya

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

Ancak bu, örneğin, 2ve 2.0bu aynı sayı arasında ayrımcılık yapmak için bir meydan okuma talebi olarak çalışmaz . Yani girişi sayı olarak almak mümkün değil


2
İçin sonuç 2.0olmalı 2.0, değil 18.
Neil

aslında. 2.0%1ve 1.0%10 ile sonuçlanacaktır
aross

4
'javascript (es6) ayrıntılı', yalnızca codegolf
dwana'da

@Neil, ikinci kez muhtemelen haklısınız sanıyordum
edc65

3
1/(x+x)- şimdi bu yaratıcı!
Neil

13

05AB1E , 13 11 bayt

CP-1252 kodlamasını kullanır .

ÐîQ18*14T/M

açıklama

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

Çevrimiçi deneyin


2
Biraz yavaşsın. Hala 1,5 dakika sürdü. P (oku: Kahretsin, bu hızlıydı.) Elbette oldukça basittir.
Kevin Cruijssen 29:16

2
@KevinCruijssen: Evet, uygulama çok fazla tuşa basılmasını gerektirmeyen bir kenarlıkta oldukça hızlı: P
Emigna

@EriktheGolfer: Daha iyi? Düzenlemek için çekinmeyin. Birkaç farklı biçimlendirme yöntemi deniyordum ve kesinlikle en iyisine karar vermedim. Önerilerinizi bekliyoruz.
Emigna

@Emigna Sadece iki tane önemli kritik boşluk ekledim.
Outgolfer Erik

2
@FrancescoCasula: TIO üzerinde çalışan daha kısa bir çözüm buldum :)
Emigna

8

Java 8, 90 61 57 bayt

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

-4 dönen bayt Objectyerine String; ve Java 7'yi 8'e dönüştüren bazı ek baytlar
da girdi Objectyerine girdi alarak -4 bayt String.

Açıklama:

Burada dene.

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

İf / else operatörünün etrafına parantez koymak gerekli midir?
Roman Gräf

1
@ RomanGräf Evet; üçlünün önceliği daha düşüktür +; bu, parantezleri kaldırırsanız, dönüşeceği anlamına gelir(""+i.contains(...)) ?
Nic Hartley


7

PHP, 40 Bayt

@ user59178 tarafından değiştirildi

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

PHP, 42 Bayt ilk Sürüm

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

is_int($i=$argv[1]+0)2 daha kısadır bayt olduğunu strpos($i=$argv[1],".")ve takas eğer aynı amaca hizmet edebilir 1.4ve18
user59178

@ user59178 is_numericBir dizgide kullanabilirim ama is_int
kullanmıyorum

Bu yüzden +0sayısal bir türe dönüştürmek için var.
user59178

1
Benim için doğru çalışıyor (Windows'ta php 5.5 ve 7.0'ı denedi) strpos($i=$argv[1],".")Versiyonun doğru / yanlış koşullarının olduğunu unutmayın, üçlünün çıktılarını değiştirmeyi hatırladınız mı?
user59178

1
Aslında, daha yakından okuduğunuzda, 2.0 verildiğinde 2 çıktısını önlemek <?=max(is_int(0+$i=$argv[1])?18:1.4,$i);yerine olmak <?=max(is_int($i=$argv[1]+0)?18:1.4,$i);zorundadır.
user59178 11

6

EXCEL: 26 31 29 Bayt

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

Formül, A1, giriş hücresi dışında herhangi bir yere gidebilir.

Sabit hatalar ve Emigna'nın önerisiyle değiştirildi.

Gerçekleri kullanarak bana bazı baytları kurtardığın için Alexandru'ya teşekkürler


1
Ayrıca, ngiriş hücresi için bir ad tanımlamak daha iyi değil mi? Belgedeki herhangi bir yerde olabilir ve ayrıca 2 bayt daha kısadır.
Emigna

@Emigna Yapabilirim , ama bu noktada biraz hile alır-y hissediyorum. Her isim için 1 byte dikkat edilmeyecek bir şey değildir ve eğer bu formatı korursam insanlar kolaylıkla kopyalayıp yapıştırabilirler.

Bunun, örneğin python'da bir lambdada 1 harfli bir giriş değişkeni kullanmaktan ne kadar farklı olduğunu anlamıyorum. Ama bu senin
kararın

Selam! Baytları nasıl hesaplarsınız? Dosyayı formülle varsayılan adla veya başka bir yolla mı kaydedin?
Vityata

1
'= 0' işaretini kaldırabilir ve sonuçları değiştirebilirsiniz: 1.4 önce, 18 saniye Ayrıca, ondalık ayırıcı olarak komaya girdiğinizden, bu çoğu insan için işe yaramayabilir.
Alexandru Pupsa,

5

Brachylog , 14 bayt

#$:18ot|:1.4ot

Çevrimiçi deneyin!

açıklama

    #$             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 bayt

İçin +2 içerir -lp

STDIN'e giriş ver

adult.pl <<< 1.24

adult.pl:

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

Eğer gerçekten tam bir yetişkinseniz fazladan bir newline sakıncası yoksa, o zaman l26 baytlık bir seçeneği de bırakmak


5

GNU sed, 40 + 1 = 41 bayt

( -rbayrak çevirmene kullanımı için +1 puan )

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

Açıklamalı:

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

Girdi üzerindeki kısıtlamalardan faydalanıyoruz, bu nedenle '1'i gördüğümüzde dizenin başlangıcını test etmek zorunda değiliz - Ondalık noktadan önce sadece bir rakam olduğunu biliyoruz.

Test sonucu:

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

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

Kullanım örneği: f "1.0"-> "1.6".

Haskell'in katı tipi, dizgelerin girdi ve çıktı olarak kullanılmasını gerektirir. Howevers, read, maxve showpolimorfik ve tüm sayısal türlerini işlemeye.


Zeki olacağım ve gardiyanlar olmadan yapacağımı düşündüm, ama bunun yerine biraz daha uzun sürdü :( (#)x=map(show.max x.fst).reads;f s=head$18#s++1.4#s
Cubic

@ Cubic: Güzel kullanımı reads. Hafif bir değişiklikle, benimkinden bir byte daha kısa. Lütfen ayrı bir cevap olarak gönderin. x#y=show.max x.fst<$>reads y;f s=head$18#s++1.4#s.
nimi

Infix fmap ile parens kaydetme gerçekten harika bir fikir!
Kübik

5

Java, 79 70 bayt

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

Koşullu operatörü kullanan aşırı yüklemeli iki yöntemi tanımlar.

f(5)Veya gibi arayın f(1.4f).


1
Selam. x<18?18:xve x<1.4f?1.4f:xdaha kısa Math.max. Java ile golf hakkında ipuçları okumak için ilginç bulabileceğinizi düşünüyorum . :)
Kevin Cruijssen

Evet, elbette onlar. Onları nasıl unuttum ...
corvus_192

Bunu seviyorum! Bunu derleyiciye yükleyebildiğiniz zaman mantığı kendiniz kodlayın!
corsiKa


4

C #, 69 bayt

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

Çevrimiçi deneyin!

Test vakaları ile tam program:

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

Oldukça basit bir çözüm. Bazı sistemlerde float.Parse () işlevinin yanlış sonuç verebileceğini unutmayın. Geçiş CultureInfo.InvariantCulture göre ikinci argüman olarak bu cevap .


İ yerine paçayı düşünüyorum kısıtları göz önüne alındığında s.Contains(".")iles[1]=='.'
Phaeze

Hmm nvm, 0 test durumunu unuttu. çok yakın :(
Phaeze

1
@ Phaeze: Evet, bir IndexOutOfRangeException ile 1 basamaklı herhangi bir girişte başarısız olur. Aksi takdirde bir bayt tıraş edebilir s[1]==46, ya da (sadece rakam ve dizin 1'de bir karakter sahip olduğu varsayılan '') daha da agresif bir yaklaşım (46 ASCII kodu vardır ''): s[1]<47.
adrianmp

1
Oo hoşuma gitti, hatırlamaya çalışacağım.
Aptallığımı

4

IBM / Lotus Notes Formül Dili, 58 49 bayt

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

A'nın düzenlenebilir bir sayısal alan olduğu hesaplanmış alan formülü.

DÜZENLE

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

@Mego'dan ilham alan alternatif


4

Jöle , 16 15 13 bayt

ŒṘċ”.ị1.4,18»

TryItOnline
Veya TryItOnline'da da tüm test durumlarını görün.

Nasıl?

ŒṘċ”.ị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
Bu , ne yazık ki 18için döner 2.0:(
Lynn

Ah, Jelly'in karmaşıklığı üstündür.
Outgolfer Erik

@ Lynn teşekkürler, yüksek maliyetle düzeltildi; belki bundan daha kısa bir yol var.
Jonathan Allan

4

C ++, 68 bayt

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

Bu cevap aslında aynı isimde 2 işlevdir ve derleyici hangi numarayı arayacağımı benim için çözer, bu yüzden bir girdi almak ve ne olduğuna karar vermek zorunda kalmadan tek bir işlev olarak hareket eder. Kayan noktadaki girdilerin çıktıyla aynı hassasiyette olması garanti edildiğinden, onu kesmek zorunda kalmadan güvenle geri verebilirim.

Ungolfed + testleri

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

Kullanıcı Szali Szali çevirerek iki bayt tasarruf önerdi floatiçine s autos. Düzenlemeyi politikaya göre reddettim, ancak çalıştığını onayladıysanız kendinizde düzenlemekten çekinmeyin.
Martin Ender

Bütün bu metin çoğaltma! İki tanımı makro aracılığıyla oluşturarak birkaç karakter kaydedebilirsiniz.

@ Martininder teşekkürler. Düzenlemeleri tüm C ++ derleyicilerinde derlenmiyor ve aniden içeri girilebilecek diğer türleriyle birlikte her tür garip vakayı sunuyor, bu yüzden cevabımı biraz daha taşınabilir tutmak için 2 bayt'ımı kabul edeceğim.
Cody

@Cody Sizin çağrınız, ancak PPCG söz konusu olduğunda, diller kendi uygulamalarıyla tanımlanmaktadır, bu nedenle cevapların taşınabilir veya özellikle güvenli olması gerekmez. Programın çalıştığı bir derleyici olduğu sürece (ve gerekli girdiler de çalışırsa, geçersiz olanların da çalışıp çalışmadığına bakılmaksızın) bu tamamen iyi.
Martin Ender

4

C #, 58 bayt

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

C # için çılgın dize ayrıştırması gerekmez. Girdi bir olması bekleniyor intveya float(maalesef C # bir döküm olamaz doubleiçin floateğer doublebir içindedir object). Çıkış ya olacak intya da stringbir in object.

(en az 1 ondalık gereksinimi neredeyse özledim, şimdi ekledik)

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
;

Ayrıca 58 bayt olan alternatif uygulama.

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

4

Aslında, 16 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

Ben programlanmış hiç Aslında daha önce, ama neden kullanmak yerine sadece 18? Aynı bayt sayısı olduğunu biliyorum, bu yüzden gerçekten önemli değil, ama 18daha okunaklı görünüyor. Yoksa mevcut uygulama / programlama dilinde çalışmamasının bir nedeni var mı?
Kevin Cruijssen

3
@KevinCruijssen 18bir 1ve bir iter 8. Bir değişmezi itmek 18için :18, bundan daha uzun bir zaman kullanırsınız .
Mego

Ah, elbette, yığın tabanlı diller. Açıklama için teşekkürler! +1
Kevin Cruijssen

4

Emacs Lisp, 37 bayt

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

Tamsayı veya şamandıra sürümünün kullanılması gerektiğini "veri tipinden" tahmin eder. ( floatpDöner tiçin 1.0değil, için 1.) parametresi tam sayı ya da yüzen bir sayı, onu tatmin etmelidir, yani numberp.


4

Haskell, 49 bayt

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

Temel olarak, bu önce girdiyi bir tamsayı olarak okumaya ve sonra da başarısız olursa iki katına çıkarmaya çalışır. Sonra, ilgili karşılaştırma taban çizgisine göre karşılaştırmaya devam eder.


3

Dyalog APL , 14 bayt Ek özellikler tarafından geçersiz sayıldı

⎕IO←0birçok sistemde varsayılandır. Argüman olarak dize alır.

⍎⌈18 1.4⊃⍨'.'∘∊

⍎⌈ değerlendirilen argümanın en fazla

18 1.4⊃⍨ {18,1.4} tarafından seçildi

'.'∘∊ Argümanın bir periyot içerip içermediği


3

C #, 95 Bayt

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

Test durumları:

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

Çıktı:

18
18
18
18
18
43
122

1.4
1.4
1.4
1.4
1.4
1.74
2.0
2.72

1
Merhaba, PPCG'ye hoş geldiniz! : Mevcut yaklaşım böyle biraz kısaltılabilir string y(string p){int a;return int.TryParse(p,out a)?a<1?"18":p:double.Parse(p)<1.4?"1.4":p;}; (kaldırılan parantez >=1.4için <1.4değiştirerek "1.4"ve p; değişti decimaletmek doubleyüzden Mkayboldu Ayrıca, başkasının sadece yayınlanmıştır. C # farklı bir yaklaşım biraz daha kısa olan Sen bulabilirsiniz. Golf için ipuçları C # içinde okumak için ilginç. Yine, hoş geldiniz! :)
Kevin Cruijssen

Merhaba, yararlı yorumlarınız için teşekkürler! Ternary-Ternary operatöründen izlerini kaybetmemek için sahip olduğum ekstra parantezleri tamamen unuttum! Şimdi genel olarak 5 bayt kurtardım.
Pete Arden

Sen kullanarak bir bayt kaydedebilirsiniz float.Parseyerine double.Parse. Ayrıca, bir a bildirgesini varsayılan değere sahip yöntem argümanlarına taşırsanız, return ifadesini ifade gövdeli üyeyi kullanarak bırakabilirsiniz. örneğin: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 bayt

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

Kullanımı:

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

Test gawkRHEL 6'da yapıldı. Tüm test vakalarında denedim, ne yazık ki AWKinternet erişimine sahip makinem yok, bu yüzden kopyala yapıştır yapılamıyor.

Bunu yapmanın daha kompakt bir yolu var mı AWK?


3

C, 50 bayt:

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

Bayt sayısı, makro tanımının sonundaki yeni satırı içerir.

Test :

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

İle test edildi

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

Çıktı

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

Bu geçersiz ... 12 girişi 18 çıkış yapmalı
Beta Decay

@ BetaDecay haklısın. Ek ve karakter eklemem gerekiyor. Gösterdiğin için teşekkürler.
cleblanc

2

Toplu iş, 102 bayt

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

Öncelikle, girişleri silmenin .dizede herhangi bir etkisi olup olmadığını kontrol ederek girişin bir tamsayı olup olmadığını belirler . Eğer öyleyse, değer 18 ile kolayca karşılaştırılır, aksi takdirde birinci ve üçüncü karakterler 14 ile karşılaştırılan bir sayı ile birleştirilir.


2

PHP: 40 bayt

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

psuedocode, (iç içe anahtarlık):

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'ye Hoşgeldiniz! Lütfen girişin (varsayılan olarak) STDIN, fonksiyon argümanları veya tam program argümanları üzerinden yapılması gerektiğini unutmayın.
aross
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.