Java est à JavaScript comme voiture est à tapis


36

Titre volé inspiré par la réponse de Greg Hewgill à Quelle est la différence entre JavaScript et Java?

introduction

Java et JavaScript sont des langages couramment utilisés par les programmeurs et sont actuellement les balises les plus populaires sur Stack Overflow. Cependant, comme nous le savons tous, mis à part des noms similaires, les deux n’ont presque rien en commun.

En l'honneur de l'un des débats les plus célèbres de la programmation et inspiré par mes récentes frustrations en matière de recherche de balises , je propose ce qui suit:

Défi

Ecrivez un programme qui prend une chaîne en entrée. Retourne carsi la chaîne commence par "Java" et n'inclut pas "JavaScript". Sinon, revenez carpet.

Exemple d'entrée et de sortie

voiture:

java
javafx
javabeans
java-stream
java-script
java-8
java.util.scanner
java-avascript
JAVA-SCRIPTING
javacarpet

tapis:

javascript
javascript-events
facebook-javascript-sdk
javajavascript
jquery
python
rx-java
java-api-for-javascript
not-java
JAVASCRIPTING

Remarques

  • La correspondance des entrées doit être sensible à la casse
  • Seules les possibilités de sortie doivent être caroucarpet
  • Points bonus imaginaires si votre réponse utilise Java, JavaScript ou Regex
  • Titre alternatif: Java est à JavaScript comme jambon est à hamster

2
La nouvelle balise de correspondance de modèle nécessite un wiki. S'il vous plaît, contribuez si vous le pouvez
Christopher

2
En fonction de l'ordre dans javacarpetlequel les tâches sont effectuées, des bogues pourraient être détectés, contrairement aux cas de test existants.
Ray

17
Si vous obtenez imaginary bonus points if your answer uses Java, Javascript, or Regex, est-ce que cela rend complexe le décompte de telles solutions? ;)
Steadybox

Alternate Title: Java is to JavaScript as ham is to hamsterEn fait, le "jambon" dans "hamster" est apparenté à la nourriture "jambon". L'aliment "jambon" est de la viande de porc et le terme "hamster" est dérivé de l'animal apparenté, le cochon d'Inde, dont la viande a remplacé la viande de porc lors de longs voyages en mer, les animaux étant plus faciles à élever sur un navire.
dotancohen

Réponses:


100

Polyglotte Java / JavaScript, 108 107 106 octets

//\u000As->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

Exécuter en Java

//\u000As->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

Essayez-le en ligne!

Remarque: ne faites pas confiance à la surbrillance car elle est incorrecte. Le vrai Java, correctement interprété, ressemble à ce qui suit, car il \u000Aest interprété dès la première étape de la compilation comme se \nterminant de facto par le commentaire qui a commencé par la ligne comment ( //).

//
s->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

Exécuter en JavaScript

//\u000As->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

Crédits à @CowsQuak pour la version JS.

let f=

//\u000As->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

var a=["java","javafx","javabeans","java-stream","java-script","java-8","java.util.scanner","javascript","java-avascript","javascript-events","facebook-javascript-sdk","javajavascript","jquery","python","rx-java","java-api-for-javascript","not-java"];

for(var s of a) console.log(s.padStart(a.reduce((x,y)=>x.length>y.length?x:y).length) + "=>" + f(s));

Combien de points bonus imaginaires pour cette réponse?

-1 octet grâce à @ Nevay dans la réponse Java.


1
Ce n'est pas compétitif en JavaScript ou en Java. Je ne suis même pas convaincu que c'est un concurrent sérieux, ce qui est une exigence pour toutes les soumissions.
Dennis

10
@ Dennis Merci pour votre information. Cependant, je considère cela comme une entrée polyglotte. Existe-t-il une règle contre les entrées polyglottes lorsqu'elles ne sont pas explicitement demandées? J'ai essayé de jouer au golf autant que possible. Par exemple, j'ai essayé de mettre les deux regex ensemble, mais je ne pouvais pas obtenir plus court que cela (à cause des deux regex différentes, bien que similaires, et de leur délimiteur). Il est également impossible d'avoir la même définition de variable car JavaScript n'autorise pas une nouvelle ligne entre aet =>. J'ai essayé de rester dans l'esprit du golf. Si je fais quelque chose de mal, s'il vous plaît dites-moi?
Olivier Grégoire

24
@Dennis IMHO "Java / JavaScript polyglot" compte comme son propre langage, auquel cas cela est très compétitif.
ETHproductions

1
@ OlivierGrégoire Je ne dis pas que ce n'est pas une soumission polyglotte bien jouée, mais il est discutable de savoir s'il devrait y avoir des soumissions polyglottes à des défis non polyglottes. Ils sont apparus dans le cadre du concours Les compétiteurs sérieux peuvent-ils faire plus que le défi demandé? discussion, mais je ne pense pas qu'il y ait un consensus clair sur ce sujet particulier. Personnellement, je ne suis pas en faveur.
Dennis

3
@ Dennis Merci pour vos idées, je comprends maintenant ce que vous vouliez dire. Cette réponse devrait-elle être qualifiée de "non compétitive", selon vous? D'autre part, bien que je ne parle pas pour toutes les réponses polyglottes (il s'agit de ma première), celle-ci a la signification particulière que le défi parle à la fois de Java et de JavaScript et que les "points bonus imaginaires" ont été explicitement attribués. pour Java, JavaScript et regex avant d’écrire cette réponse. Java et regex peuvent être combinés, JavaScript et regex peuvent être combinés, pourquoi pas tous ensemble? En tout cas, ça ne me dérange pas de marquer cela comme non compétitif.
Olivier Grégoire

17

JavaScript, 50 49 octets

Enregistré 1 octet grâce à @ValueInk en réorganisant les expressions rationnelles

a=>/javascript|^(?!java)/i.test(a)?"car":"carpet"

Extrait de test

let f=

a=>/javascript|^(?!java)/i.test(a)?"carpet":"car"

var a=["java","javafx","javabeans","java-stream","java-script","java-8","java.util.scanner","java-avascript","javascript","javascript-events","facebook-javascript-sdk","javajavascript","jquery","python","rx-java","java-api-for-javascript","not-java"];

for(var s of a) console.log(s.padStart(a.reduce((x,y)=>x.length>y.length?x:y).length) + "=>" + f(s));


J'allais voler votre regex mais cela aurait
rallongé

Maintenant, nous avons juste besoin d'une réponse java.
DJMcMayhem

Nous avons une réponse en Java, mais ... je suis arrivé à peu près au même regex ...
Olivier Grégoire

Alternativement:/^java(?!script)/i
Andrea

1
@ OlivierGrégoire ah, zut, celui-là semble injuste
Andrea


11

C (seulement appelant put), 131 octets

f(int*s){char r[]="carpet";~*s&'AVAJ'||(r[3]=0);for(;*s&255;*(int*)&s+=1)~*s&'AVAJ'||~s[1]&'IRCS'||~s[2]&'TP'||(r[3]='p');puts(r);}

Il a ses problèmes, mais il passe tous les tests fournis :)

g(int* s)
{
  char r[] = "carpet";
  ~*s&'AVAJ' || (r[3]=0);
  for(;*s & 255; *(int*)&s +=1)
    ~*s&'AVAJ' || ~s[1]&'IRCS' || ~s[2]&'TP' || (r[3]='p');
  puts(r);
}

Points bonus imaginaires si votre réponse utilise Java, Javascript ou Regex

bien ... non merci



8

Python 2 , 68 octets

k=input().lower();print'car'+'pet'*(k[:4]!='java'or'javascript'in k)

Essayez-le en ligne!

-11 octets grâce à notjagan
-2 octets grâce à Dennis




@ Justin Cela aussi. Agréable.
HyperNeutrino

Si vous passez à Python 2, vous pouvez enregistrer 2 octets avec un programme complet.
Dennis

1
@LukeSawczak Oh, je n'avais même pas réalisé que: PI utilisait Java juste avant cela et que Java ;était requis, donc comme je dois l'utiliser de toute façon, la nouvelle ligne n'est pas nécessaire: P C'est pourquoi je l'ai utilisée.
HyperNeutrino

4

C #, 80 78 octets

s=>(s=s.ToLower()).StartsWith("java")&!s.Contains("javascript")?"car":"carpet"

1
Je pense que le langage le plus lisible est C #
sepehr

2
@sepehr Vous voulez dire que vous voyez bien avec C #. (Est-ce que je reçois un bonus pour les commentaires stupides)
Ray

4

Excel Google Feuilles, 89 86 octets

3 octets sauvés grâce à Taylor Scott

=LEFT("carpet",6-3*ISERR(SEARCH("javascript",A1))+3*ISERR(IF(SEARCH("java",A1)=1,1,1/0

Prend une entrée sur A1

Explication

=LEFT("carpet",6-3*ISERR(SEARCH("javascript",A1))+3*ISERR(IF(SEARCH("java",A1)=1,1,1/0)))

 SEARCH("javascript",A1)        #Case-Insensitive Find, returns error if not found  
 ISERR(                         #Returns string true if error, False if not
 3*ISERR(                       #Forces TRUE/False as integer, multiplies by 3
 IF(SEARCH("java",A1)=1,1,1/0)  #If java found, returns integer. if 1, java begins string
                                #so returns 1, which will be turned into 0 by iserr.
                                #Else returns 1/0, which will be turned into 1 by iserr.
 LEFT(                          #Returns digits from the left, based upon count.

Je crois que vous pouvez remplacer le Search es par Finds pour -2 octets et que cela pourrait être converti davantage en une formule de feuille Google pour -3 octets en ne fermant pas les trois derniers parent
Taylor Scott

1
Find est sensible à la casse, la recherche est sensible à la casse. Mais ces 3 derniers octets sont une bonne idée!
Mark

Pourquoi passer d'Excel à Google Sheets?
Stevoisiak

2
Supprimer les 3 derniers parens économise 3 octets. Excel créerait simplement une erreur et vous les mettrait quand même.
Marc

3

vim, 58 octets

gUU:s/.*JAVASCRIPT.*/Q/g
:s/^JAVA.*/car
:s/[A-Z].*/carpet

Essayez-le en ligne!


Je pense que l'utilisation de la gcommande pourrait être un peu plus courte, quelque chose comme :g/\cjavascript/d :g!/^\cjava/d icarpet␛:s/pet..*.
Neil




3

Common Lisp, 131 à 125 octets

(lambda(s)(format()"car~@[pet~]"(or(<(length s)4)(not(#1=string-equal"java"(subseq s 0 4)))(search"javascript"s :test'#1#))))

Essayez-le en ligne!

Taille réduite grâce au # n = «tour» de Common Lisp.

Explication

(lambda (s)                 ; anonymous function
  (format                   ; use of format string to produce the result
    ()                      ; the result is a string
    "car~@[pet~]"           ; print "car", then print "pet" when:
    (or (< (length s) 4)    ; the string is less then 4 characters or
        (not (string-equal "java" (subseq s 0 4)))     ; does not start with java or
        (search "javascript" s :test 'string-equal)))) ; contains javascript

2

C (tcc), 144 136 octets

a;f(s){char*t=s;for(;*t;a=!strncmp(s,"java",4))*t=tolower(*t++);for(t=s;*t;)s=strncmp(t++,"javascript",10)&&s;puts(a*s?"car":"carpet");}

Essayez-le en ligne!

Déroulé:

a;
f(s)
{
    char *t = s;
    for (; *t; a = !strncmp(s, "java", 4))
        *t = tolower(*t++);
    for (t=s; *t;)
        s = strncmp(t++, "javascript", 10) && s;
    puts(a*s ? "car"  :"carpet");
}

1

Excel, 84 octets

="car"&IF(AND(ISERR(SEARCH("javascript",A1)),IFERROR(SEARCH("java",A1),2)=1),,"pet")

1

Excel VBA, 76 octets

La fonction de fenêtre immédiate VBE anonyme qui prend l’entrée de la plage [A1]et des sorties est car/carpet status dans la fenêtre immédiate VBE

N'utilise pas RegExp

?"car"IIf(InStr(1,[A1],"Java",1)*(InStr(1,[A1],"JavaScript",1)=0),"","pet")

1
Belle utilisation de vba! Je pensais qu'une macro aurait été plus courte. Maintenant j'ai la preuve.
Marc

1

Python 3 , 95 octets

g=lambda s:(lambda r:'car' if r[:4]=='java' and 'javascript' not in r else 'carpet')(s.lower())

Essayez-le en ligne!

Ouais, ça pourrait être plus court mais je voulais essayer d'utiliser un lambda imbriqué!


Toujours bon d'expérimenter :) Notez que vous pouvez économiser des octets autour des opérateurs comme and, or, if,else
Luc Sawczak

1

Perl , 42 octets

Je crois que la réponse de stevieb a un résultat incorrect (essayé moi-même - il retourne car pour "javajavascript"). Cela devrait fonctionner:

say/^java/i&&!/javascript/i?'car':'carpet'

0

Mathematica, 82 octets

regex

If[#~StringMatchQ~RegularExpression@"(?i)(?!.*javascript)^java.*","Car","Carpet"]&

0

JAISBaL , 36 octets

℠℘(?!.*javascript)^java.*}͵Ucar½Upet

Verbose / explication:

# \# enable verbose parsing #\
tolower                           \# [0] convert the top value of the stack to lowercase #\
split (?!.*javascript)^java.*}    \# [1] split the top value of the stack by (?!.*javascript)^java.*} #\
arraylength                       \# [2] push the length of the array onto the stack #\
print3 car                        \# [3] print car #\
!if                               \# [4] if the top value on the stack is falsy, skip the next statement #\
print3 pet                        \# [5] print pet #\

JAISBaL était ma première tentative de conception d’une langue de golf, c’est donc assez bizarre ... il n’ya pas de correspondances ou ne contient pas, regex ou autre, nous devons donc scinder et vérifier la longueur du tableau résultant ... JAISBaL a une division par -regex ... mais pas d'autre support regex .... pour des raisons.

Regex volé emprunté à la réponse de @Cows Quack .



0

Perl , 36 octets

say/^java(?!script)/i?"car":"carpet"

Exécutez-le comme tel:

perl -nE 'say/^java(?!script)/i?"car":"carpet"' java.txt

0

Lot, 91 octets

@set/ps=
@set t=%s:~0,4%
@if "%t:java=%%s:javascript=%"=="%s%" (echo car)else echo carpet

Prend une entrée sur STDIN. Batch n'a pas d'opérateur de comparaison insensible à la casse, mais son remplacement de chaîne est insensible à la casse. Par conséquent, je peux affecter temporairement les quatre premiers caractères à un remplacement temporaire, puis remplacer java, ce qui devrait alors donner la chaîne vide. En attendant, je remplace javascript de manière insensible à la casse dans la chaîne d'origine, ce qui devrait le laisser inchangé.



0

Perl, 98 84 62 octets

sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}

Essayez-le en ligne!

Merci à bytepusher


Bienvenue sur le site! Je ne connais pas de Perl, mais il semble qu'il y ait beaucoup d'espaces que vous pouvez supprimer. De plus, si vous cherchez plus de moyens de le réduire, voici quelques conseils .
DJMcMayhem

@DJMcMayhem Merci, je pense que toute la logique peut être changée pour la rendre encore plus courte, mais je ne l'ai pas comprise
Burgan

1
Quelques astuces (sans trop changer votre solution): Vous pouvez remplacer le return $b;avec juste $b;. Perl retourne toujours la dernière instruction évaluée. Puisque nous ne nous soucions pas des avertissements, vous pouvez même laisser tomber le ';' à $b}. Vous n'avez pas besoin de crochets autour du if. Si vous utilisez ||au lieu de or, vous pouvez enregistrer un espace après la regex.
bytepusher

1
Vous pouvez également supprimer le () autour du premier lc, mais vous aurez besoin d’un espace après if. Si vous utilisez !~au lieu de ! =~la deuxième condition peut être lc$_[0]!~. `-> sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}. Utiliser les ops ternaires le réduit encoresub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}
bytepusher

1
Ne pas oublier - pas besoin de lc lorsque vous avez la regex ignore case switch, encore 2 :) $_[0] =~//i||$_[0]!~//i. Et enfin, pourquoi une variable? sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}devrait bien faire :). Et maintenant: perl sera sympa et vous permettra d'utiliser $ _ [0] sans préciser (mais pas avec !~): sub a{"car".(/javascript/i||!/^java/i?'pet':'')}-> 48 :)
bytepusher

0

Dart VM, 104 octets 102 octets

main(p){p=p[0].toLowerCase();print("car${p.indexOf('java')==0&&p.indexOf('javascript')<0?'':'pet'}");}

Explication :

Degolfed:

main(p)
{
    p = p[0].toLowerCase();
    print("car${p.indexOf('java') == 0 && p.indexOf('javascript') < 0 ? '' : 'pet'}");
}

Nous avons notre fonction principale habituelle

Nous remplaçons ppar p[0].toLowerCase();pour que nous n'ayons pas à déclarer une nouvelle variable ( varplus un espace serait 4 octets supplémentaires)

Nous procédons ensuite à l'impression réelle

Nous imprimons de manière carinconditionnelle et nous utilisons des instructions en ligne pour vérifier s'il faut imprimer petaprès. S'il contient la chaîne "java" à l'index 0 et qu'il ne contient pas "javascript", nous ne faisons rien (nous ajoutons en fait une chaîne vide mais elle n'a aucun effet), sinon nous ajoutons pet.


0

Rouille, 97 octets

let s=if Regex::new(r"^javascript|^!java$").unwrap().is_match("javascript"){"carpet"}else{"car"};

Je suis à peu près sûr qu'il existe une solution plus courte mais c'est mon premier essai :)


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.