Ja, natürlich bin ich erwachsen!


44

Ich denke, wir haben das alle als Kind gemacht: Einige Websites erfordern ein Mindestalter von 18 Jahren, also ziehen wir nur ein paar Jahre vom Geburtsjahr ab und voilà, wir sind 18+.
Darüber hinaus beträgt die Mindesteinstiegshöhe für die meisten Fahrten in Vergnügungsparks 1,40 m (hier in den Niederlanden mindestens 1,40 m). Natürlich kann dies weniger leicht betrogen werden als das Alter, aber Sie könnten Schuhe mit dicken Absätzen tragen, Ihre Haare hochlegen, einen Hut tragen, auf Ihren Zehen stehen usw.

Eingang:

Ihr Programm / Ihre Funktion akzeptiert eine positive Ganzzahl oder eine Dezimalzahl.

Ausgabe:

  • Ist die Eingabe eine Ganzzahl >= 18? Einfach die Eingabe ausdrucken.
  • Ist die Eingabe eine Ganzzahl 0-17? Drucken 18.
  • Ist die Eingabe eine Dezimalzahl >= 1.4? Einfach die Eingabe ausdrucken.
  • Ist die Eingabe eine Dezimalzahl 0.0-1.4? Drucken 1.4.

Herausforderungsregeln:

  • Angenommen, die Eingabe liegt immer im Bereich von 0-122(älteste Frau war 122 Jahre alt) oder 0.0-2.72(größter Mann war 2,72 Jahre alt).
  • Sie können die Eingabe als Zeichenfolge, Objekt oder eine andere von Ihnen bevorzugte Methode verwenden.
  • Die Dezimaleingaben haben niemals mehr als drei Dezimalstellen nach dem Komma.
  • 2oder 2.beide sind keine gültigen Ausgaben für 2.0. Sie sind frei , die Ausgabe 2.00oder 2.000statt 2.0jedoch.
    Genau wie die Eingabe wird die Ausgabe niemals mehr als drei Dezimalstellen nach dem Punkt haben.

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Fügen Sie ggf. auch eine Erklärung hinzu.

Testfälle:

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

Können wir annehmen, dass die Eingabe frei von führenden Nullen ist?
Toby Speight

@TobySpeight Ja, keine führenden Nullen.
Kevin Cruijssen

2
0.0-2.72 (tallest man ever was 2.72).- Sie sind nicht, 0.0wenn Sie geboren sind ...
Johan Karlsson

1
@JohanKarlsson Ich weiß, ich habe darüber nachgedacht, ein Minimum hinzuzufügen, aber ich habe beschlossen, es einfach bei 0und beginnen zu lassen 0.0. :) Die hinzugefügten tallest man ever was 2.72und oldest woman ever was 122wurde nur als informative Fakten für Interessenten hinzugefügt.
Kevin Cruijssen

9
"[...] also fügen wir nur ein paar Jahre zum Geburtsjahr hinzu [...]" Sollten Sie nicht ein paar Jahre vom Geburtsjahr abziehen ?
Wythagoras

Antworten:



45

Python 2.7, 34 Bytes

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

Was bringt das für 2.0?
Adám

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

3
Nein, tut es nicht. Warum versuchst du es nicht selbst? :)
Lynn

5
@Adam Ich benutze repl.it oder ideone.com für Python. Zeigen Sie eine Python-Antwort an, die ich jemals gepostet habe, und es gibt wahrscheinlich einen Link zu einer dieser beiden Antworten.
mbomb007

1
Verstand, verstanden. Im Grunde genommen ordnet true oder false dem Index 0 oder 1 in diesem Array zu und wendet dann max auf die beiden Zahlen an.
Alexandru Pupsa

15

JavaScript (ES6), 27 31

Eingabe als Zeichenfolge Um zu überprüfen, ob der Eingabewert Dezimalstellen enthält, wird er an sich selbst angehängt: Wenn kein Dezimalpunkt vorhanden ist, ist das Ergebnis immer noch eine gültige Zahl, ansonsten nicht. Um eine gültige Zahl (einschließlich 0) zu erkennen, verwende ich Division, da Javascript 1/nnumerisch ist und nicht 0 für eine Zahl ( n schließlich ist der Wert Infinityfür n==0), sonst ist esNaN

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

Prüfung

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

Meine vorige (falsche) Lösung:

Wenn Sie die Eingabe als Zahl verwenden, können Sie den Restoperator verwenden %, um zu überprüfen, ob die Zahl eine Ganzzahl ist.

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

oder

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

Dies funktioniert jedoch nicht als Aufforderung, zwischen beispielsweise 2und zu unterscheiden, 2.0und das ist die gleiche Zahl. Es ist also nicht möglich, die Eingabe als Zahl zu erhalten


2
Ergebnis für 2.0sollte 2.0nicht sein 18.
Neil

tatsächlich. 2.0%1und 1.0%1ergibt 0
ungefähr 29.09.16

4
'javascript (es6) is verbose', das siehst du nur bei codegolf
dwana

@Neil auf den zweiten Gedanken, Sie haben wahrscheinlich Recht
edc65

3
1/(x+x)- jetzt ist das einfallsreich!
Neil

13

05AB1E , 13 11 Bytes

Verwendet die CP-1252- Codierung.

ÐîQ18*14T/M

Erläuterung

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

Probieren Sie es online aus


2
Du bist ein bisschen langsam. Hat dich trotzdem 1,5 Minuten gekostet. ; P (lese: Verdammt, das war schnell.) Es ist natürlich ziemlich einfach.
Kevin Cruijssen

2
@ KevinCruijssen: Ja, die Implementierung ist ziemlich schnell in einer Sprache, die nicht viele Tastendrücke erfordert: P
Emigna

@EriktheGolfer: Besser? Wenn nicht, können Sie es gerne bearbeiten. Ich habe mit einigen verschiedenen Formatierungsmethoden experimentiert und mich nicht für eine absolut beste entschieden. Vorschläge sind willkommen.
Emigna

@Emigna Ich habe gerade zwei fehlende wichtige Leerzeichen hinzugefügt.
Erik der Outgolfer

2
@FrancescoCasula: Ich habe eine kürzere Lösung gefunden, die auf TIO funktioniert :)
Emigna

8

Java 8, 90 61 57 Bytes

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

-4 Bytes werden zurückgegeben Objectanstatt String; und einige zusätzliche Bytes Umwandeln Java 7 bis 8.
-4 - Byte unter den Eingang als Objectanstelle von Stringals auch.

Erläuterung:

Probieren Sie es hier aus.

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

Müssen Klammern um den Operator if / else gesetzt werden?
Roman Gräf

1
@ RomanGräf Ja; Der Ternär hat eine niedrigere Priorität als +, was bedeutet, dass wenn Sie die Klammern entfernen, er sich um (""+i.contains(...)) ?
Nic Hartley


7

PHP, 40 Bytes

Geändert von @ user59178 Vielen Dank

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

PHP, 42 Bytes erste Version

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

is_int($i=$argv[1]+0)ist 2 Bytes kürzer als strpos($i=$argv[1],".")und kann den gleichen Zweck erfüllen, wenn Sie den 1.4und den18
user59178

@ user59178 Ich könnte is_numericauf einer Zeichenfolge verwenden, aber nichtis_int
Jörg Hülsermann

deshalb gibt es das +0, um es in einen numerischen Typ umzuwandeln.
user59178

1
Es funktioniert korrekt für mich (versuchte sowohl PHP 5.5 und 7.0 unter Windows). Beachten Sie, dass es entgegengesetzte Wahr / Falsch-Bedingungen wie in der strpos($i=$argv[1],".")Version gibt. Haben Sie daran gedacht, die Ausgänge des Ternärs auszutauschen?
user59178

1
Bei näherer Betrachtung muss es eigentlich <?=max(is_int(0+$i=$argv[1])?18:1.4,$i);eher sein, als <?=max(is_int($i=$argv[1]+0)?18:1.4,$i);die Ausgabe von 2 zu vermeiden, wenn 2.0 angegeben wird.
user59178

6

EXCEL: 26 31 29 Bytes

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

Die Formel kann an eine beliebige Stelle außer A1, der Eingabezelle, verschoben werden.

Fehler behoben und durch den Vorschlag von Emigna ersetzt.

Vielen Dank an Alexandru, der mir ein paar Bytes mit Wahrheiten erspart hat


1
Ist es nicht besser, einen Namen nfür die Eingabezelle zu definieren ? Es kann dann irgendwo im Dokument sein und es ist auch 2 Bytes kürzer.
Emigna

@Emigna Ich könnte , aber an diesem Punkt wird es ein bisschen schummeln, ich fühle. 1 Byte pro Name ist nichts, woran man herumschnüffeln muss, und wenn ich dieses Format behalte, können die Leute mühelos kopieren und einfügen.

Ich verstehe nicht, wie sich das von der Verwendung einer 1-Buchstaben-Eingabevariable in einem Lambda in Python zum Beispiel unterscheidet. Aber es ist dein Anruf :)
Emigna

Hallo! Wie berechnen Sie die Bytes? Speichern Sie die Datei mit der Formel mit dem Standardnamen oder irgendwie anders?
Vityata

1
Sie können das '= 0' entfernen und die Ergebnisse umschalten: 1.4 first, 18 second Da Sie auch ein Komma als Dezimaltrennzeichen haben, funktioniert dies für die meisten Menschen möglicherweise nicht.
Alexandru Pupsa


5

Perl, 29 27 Bytes

Beinhaltet +2 für -lp

Geben Sie eine Eingabe für STDIN ein

adult.pl <<< 1.24

adult.pl:

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

Wenn Ihnen ein zusätzlicher Zeilenumbruch nichts ausmacht, wenn Sie wirklich volljährig sind, können Sie auch die lOption für 26 Byte weglassen


5

GNU sed, 40 + 1 = 41 Bytes

(Punktzahl +1 für die Verwendung der -rFlagge als Dolmetscher)

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

Kommentiert:

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

Wir machen uns die Eingabebeschränkungen zunutze und müssen den Anfang der Zeichenfolge nicht testen, wenn "1" angezeigt wird. - Wir wissen, dass es nur eine Ziffer vor dem Komma gibt.

Testergebnis:

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

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

Anwendungsbeispiel: f "1.0"-> "1.6".

Haskells strenger Typ erfordert die Verwendung von Strings als Eingabe und Ausgabe. Howevers, read, maxund showsind polymorph und behandeln alle numerischen Typen.


Ich dachte, ich wäre schlau und würde es ohne die Wachen machen, aber das führte dazu, dass es stattdessen etwas länger wurde :( Meine Version:(#)x=map(show.max x.fst).reads;f s=head$18#s++1.4#s
Cubic

@ Cubic: Gute Verwendung von reads. Mit einer kleinen Änderung ist es ein Byte kürzer als meins. Bitte posten Sie es als separate Antwort. x#y=show.max x.fst<$>reads y;f s=head$18#s++1.4#s.
nimi

Wirklich coole Idee, die Parens mit dem Infix fmap zu retten!
Cubic

5

Java, 79-70 Bytes

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

Definiert zwei Methoden mit Überladung, die den bedingten Operator verwenden.

Nennen Sie es wie f(5)oder f(1.4f).


1
Hallo. x<18?18:xund x<1.4f?1.4f:xsind kürzer als die Math.max. Ich denke, Sie könnten Tipps zum Golfen in Java interessant finden , um sie durchzulesen . :)
Kevin Cruijssen

Ja, natürlich sind sie. Wie könnte ich sie vergessen ...
corvus_192

Ich liebe es! Warum programmieren Sie die Logik selbst, wenn Sie diese in den Compiler auslagern können?
corsiKa


4

C #, 69 Bytes

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

Probieren Sie es online!

Volles Programm mit Testfällen:

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

Eine ziemlich einfache Lösung. Beachten Sie, dass float.Parse () auf einigen Systemen möglicherweise falsche Ergebnisse zurückgibt. Pass CultureInfo.InvariantCulture als zweites Argument nach dieser Antwort .


Angesichts der Einschränkungen denke ich, dass Sie s.Contains(".")durchs[1]=='.'
JustinM - Reinstate Monica

Hmm nvm, habe den 0 Testfall vergessen. so nah auch :(
JustinM

1
@Phaeze: Ja, bei jeder 1-stelligen Eingabe mit einer IndexOutOfRangeException würde dies fehlschlagen. Andernfalls können Sie ein Byte - off mit rasieren s[1]==46, oder einen noch aggressiveren Ansatz (vorausgesetzt , nur Sie haben Ziffern und Zeichen bei Index 1 ‚‘) (hat einen ASCII - Code 46 ‚‘): s[1]<47.
Adrianmp

1
Oo das gefällt mir, werde versuchen mich zu erinnern. Danke, dass du aus meiner Dummheit eine Lerngelegenheit gemacht hast :)
JustinM - Wiedereinsetzung von Monica

4

IBM / Lotus Notes Formula Language, 58 49 Byte

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

Berechnete Feldformel wobei a ein bearbeitbares numerisches Feld ist.

BEARBEITEN

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

Alternative inspiriert von @Mego


4

Jelly , 16 15 13 Bytes

ŒṘċ”.ị1.4,18»

TryItOnline
Oder sehen Sie alle Testfälle, auch bei TryItOnline

Wie?

ŒṘċ”.ị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
Diese Renditen 18für 2.0leider :(
Lynn

Ah, die Komplexität von Jelly ist überlegen.
Erik der Outgolfer

@Lynn danke, um satte Kosten behoben; Vielleicht gibt es einen kürzeren Weg.
Jonathan Allan

4

C ++, 68 Bytes

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

Diese Antwort besteht eigentlich aus 2 Funktionen mit demselben Namen, und der Compiler ermittelt, welche Funktion ich aufrufen soll, sodass er als eine Funktion fungiert, ohne dass ich eine Eingabe vornehmen und entscheiden muss, um welche es sich handelt. Da die Eingabe auf dem Gleitkomma garantiert die gleiche Genauigkeit wie die Ausgabe hat, kann ich sie sicher zurückgeben, ohne sie abschneiden zu müssen.

Ungolfed + Tests

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

Benutzer Szali Szali schlug vor, zwei Bytes zu speichern, indem das floats in autos umgewandelt wird. Ich habe die Bearbeitung gemäß den Richtlinien abgelehnt , kann sie jedoch selbst bearbeiten, wenn Sie bestätigt haben, dass sie funktioniert.
Martin Ender

All diese Textvervielfältigung! Sie können mehrere Zeichen speichern, indem Sie die beiden Definitionen über ein Makro generieren.

Danke @MartinEnder. Deren Bearbeitung wird nicht in allen C ++ - Compilern kompiliert und führt alle möglichen seltsamen Fälle ein, wobei plötzlich andere Typen übergeben werden können. Daher akzeptiere ich meine 2 Bytes, um meine Antwort etwas portabler zu halten.
Cody

@Cody Es ist Ihr Anruf, aber in Bezug auf PPCG werden Sprachen durch ihre Implementierungen definiert, sodass Antworten nicht portabel oder besonders sicher sein müssen. Solange es einen Compiler gibt, auf dem das Programm funktioniert (und die erforderlichen Eingaben funktionieren, unabhängig davon, ob auch ungültige funktionieren würden), ist das völlig in Ordnung.
Martin Ender

4

C #, 58 Bytes

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

Für C # ist kein verrücktes String-Parsen erforderlich. Es wird erwartet, dass die Eingabe ein intoder ist float(leider kann C # kein in umwandeln double, floatwenn das doublein ein ist object). Die Ausgabe wird entweder intoder stringin ein object.

(Mindestens 1 Dezimalstelle wurde fast verfehlt, jetzt hinzugefügt)

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
;

Alternative Implementierung, die ebenfalls 58 Byte umfasst.

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

4

Eigentlich 16 Bytes

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

Probieren Sie es online!

Erläuterung:

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

Ich habe eigentlich noch nie zuvor programmiert , aber warum statt nur verwenden 18? Ich weiß, dass es die gleiche Byteanzahl ist, also ist es eigentlich egal, aber es 18scheint besser lesbar zu sein. Oder gibt es einen Grund, warum es in der aktuellen Implementierungs- / Programmiersprache nicht funktioniert?
Kevin Cruijssen

3
@ KevinCruijssen 18drückt ein 1und ein 8. Um ein Literal zu pushen 18, verwenden Sie :18, was länger ist als .
Mego

Ah, natürlich stapelbasierte Sprachen. Danke für die Erklärung! +1
Kevin Cruijssen

4

Emacs Lisp, 37 Bytes

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

Vermutungen aus dem "Datentyp", ob die Integer- oder Float-Version verwendet werden soll. ( floatpgibt tfür 1.0, aber nicht für zurück 1.) Der Parameter ist eine Zahl als Ganzzahl oder Fließkomma, dh er sollte erfüllen numberp.


4

Haskell, 49 Bytes

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

Grundsätzlich wird zuerst versucht, die Eingabe als Ganzzahl und dann als Double zu lesen, wenn dies fehlschlägt. Dann wird mit dem Vergleich mit der jeweiligen Vergleichsgrundlinie fortgefahren.


3

Dyalog APL , 14 Byte Durch weitere Angaben ungültig gemacht

⎕IO←0Das ist auf vielen Systemen Standard. Nimmt string als Argument.

⍎⌈18 1.4⊃⍨'.'∘∊

⍎⌈ max des bewerteten Arguments und

18 1.4⊃⍨ {18,1.4} ausgewählt von

'.'∘∊ ob das Argument einen Punkt enthält


3

95 Bytes

Golf gespielt:

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

Testfälle:

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

Ausgabe:

18
18
18
18
18
43
122

1.4
1.4
1.4
1.4
1.4
1.74
2.0
2.72

1
Hallo, willkommen bei PPCG! Ihr aktueller Ansatz kann ein bisschen wie folgt abgekürzt werden: string y(string p){int a;return int.TryParse(p,out a)?a<1?"18":p:double.Parse(p)<1.4?"1.4":p;}(entfernte Klammer, >=1.4um <1.4durch das Austauschen "1.4"und p, geändert , decimalum doubleso die Mist weg auch, jemand anderes habe gerade gebucht. Einen anderen Ansatz in C # , die etwas kürzer ist Sie finden könnte. Tipps für den Golfsport in C # interessant zu lesen. Nochmals herzlich willkommen! :)
Kevin Cruijssen

Hallo, danke für die hilfreichen Kommentare! Ich habe völlig vergessen, welche zusätzlichen Klammern ich hatte, um nicht den Überblick über den Ternary-Ternary-Operator zu verlieren! Ich habe jetzt insgesamt 5 Bytes gespart.
Pete Arden

Sie können ein Byte speichern, indem Sie float.Parseanstelle von verwenden double.Parse. Und auch wenn Sie die Deklaration von a mit einem Standardwert in die Methodenargumente verschieben, können Sie Ihre return-Anweisung mit dem Ausdruck bodied member löschen. string f(string s,int a=0)=>int.TryParse(s,out a)?a>17?s:"18":float.Parse(s)<1.4?"1.4":s;
ZB

3

AWK - 29 Bytes

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

Verwendungszweck:

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

Das Testen wurde mit gawkRHEL 6 durchgeführt. Ich habe es mit allen Testfällen versucht, leider habe ich AWKauf dem Computer keinen Internetzugang, daher ist Kopieren und Einfügen nicht möglich.

Gibt es eine kompaktere Möglichkeit, dies zu tun AWK?


3

C, 50 Bytes:

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

Die Byteanzahl schließt die neue Zeile am Ende der Makrodefinition ein.

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 #, 71 Bytes

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

versuche es hier


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

Getestet mit

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

Ausgabe

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

Dies ist ungültig ... Eine Eingabe von 12 sollte 18
Beta Decay

@BetaDecay du hast recht. Ich muss ein zusätzliches & Zeichen hinzufügen. Vielen Dank für den Hinweis.
Cleblanc

2

Batch, 102 Bytes

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

Bestimmt zunächst, ob es sich bei der Eingabe um eine Ganzzahl handelt, indem überprüft wird, ob das Löschen aller .s Auswirkungen auf die Zeichenfolge hat. Wenn dies der Fall ist, wird der Wert leicht mit 18 verglichen, andernfalls werden das erste und dritte Zeichen zu einer Zahl kombiniert, die mit 14 verglichen wird.


2

PHP: 40 Bytes

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

psuedocode (verschachtelter 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
Willkommen bei PPCG! Bitte beachten Sie, dass die Eingabe (standardmäßig) über STDIN, Funktionsargumente oder vollständige Programmargumente erfolgen muss.
Uhr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.