Java ist zu JavaScript wie Auto zu Teppich

36

Titel gestohlen, inspiriert von Greg Hewgills Antwort auf Was ist der Unterschied zwischen JavaScript und Java?

Einführung

Java und JavaScript sind unter Programmierern häufig verwendete Sprachen und derzeit die beliebtesten Tags bei Stack Overflow. Doch wie wir alle wissen, haben die beiden, abgesehen von ähnlichen Namen, fast nichts gemeinsam.

Zu Ehren einer der berüchtigtsten Debatten der Programmierung und inspiriert von meinen jüngsten Frustrationen bei der Tag-Suche , schlage ich Folgendes vor:

Herausforderung

Schreiben Sie ein Programm, das einen String als Eingabe aufnimmt. Rückgabe, carwenn der String mit "Java" beginnt und kein "JavaScript" enthält. Andernfalls kehren Sie zurück carpet.

Beispiel für Ein- und Ausgabe

Wagen:

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

Teppich:

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

Anmerkungen

  • Bei der Eingabe muss die Groß- und Kleinschreibung nicht beachtet werden
  • Nur Möglichkeiten zur Ausgabe sollten caroder seincarpet
  • Imaginäre Bonuspunkte, wenn Ihre Antwort Java, JavaScript oder Regex verwendet
  • Alternativer Titel: Java ist für JavaScript wie Schinken für Hamster
Stevoisiak
quelle
2
Das neue Pattern-Matching- Tag benötigt ein Wiki. Bitte tragen Sie bei, wenn Sie können
Christopher
2
Abhängig von der Reihenfolge, in der die Dinge erledigt werden, javacarpetkönnen Fehler auftreten, die in den vorhandenen Testfällen nicht auftreten.
Ray
17
Wenn Sie bekommen imaginary bonus points if your answer uses Java, Javascript, or Regex, macht das solche Lösung bytecount komplex? ;)
Steadybox
Alternate Title: Java is to JavaScript as ham is to hamsterEigentlich ist der „Schinken“ in „Hamster“ ist verwandt mit dem Essen „ham“. Das Lebensmittel "Schinken" ist Schweinefleisch, und der Begriff "Hamster" leitet sich von dem verwandten Tier, dem Meerschweinchen, ab, dessen Fleisch Schweinefleisch auf langen Seereisen ersetzte, da die Tiere auf einem Schiff leichter aufzuziehen waren.
Dotancohen

Antworten:

100

Java / JavaScript Polyglot, 108 107 106 Bytes

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

Als Java ausführen

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

Probieren Sie es online!

Hinweis: Vertrauen Sie dem Highlight nicht, da es falsch ist. Richtig interpretiertes Java sieht wie \u000Afolgt aus, da es im ersten Schritt der Kompilierung \nde facto als Ende des Kommentars interpretiert wird , der mit dem Zeilenkommentar ( //) begann.

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

Als JavaScript ausführen

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

Dank an @CowsQuak für die JS-Version.

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

Wie viele imaginäre Bonuspunkte für diese Antwort?

-1 Byte dank @Nevay in der Java-Antwort.

Olivier Grégoire
quelle
1
Dies ist in JavaScript oder Java nicht konkurrenzfähig. Ich bin nicht einmal davon überzeugt, dass es sich um einen ernsthaften Konkurrenten handelt, der für alle Einsendungen Voraussetzung ist.
Dennis
10
@ Tennis Vielen Dank für Ihre Information. Ich betrachte dies jedoch als einen vielsprachigen Eintrag. Gibt es eine Regel gegen mehrsprachige Einträge, wenn diese nicht ausdrücklich angefordert werden? Ich habe versucht, so viel wie möglich Golf zu spielen. Ich habe zum Beispiel versucht, beide regulären Ausdrücke zusammenzufügen, aber ich konnte nichts kürzeres als dies (wegen der zwei unterschiedlichen, wenn auch ähnlichen regulären Ausdrücke und ihres Begrenzers) bekommen. Es ist auch unmöglich, dieselbe Variablendefinition zu verwenden, da JavaScript keine neuen Zeilen zwischen aund zulässt =>. Ich habe versucht, im Geiste des Golfspiels zu bleiben. Wenn ich etwas falsch gemacht habe, sag es mir bitte.
Olivier Grégoire
24
@Dennis IMHO "Java / JavaScript polyglot" gilt als eigene Sprache. In diesem Fall ist dies sehr wettbewerbsfähig.
ETHproductions
1
@ OlivierGrégoire Ich sage nicht, dass dies keine gute Polyglot-Einsendung ist, aber es ist fraglich, ob es überhaupt Polyglot-Einsendungen für nicht-polyglote Herausforderungen geben sollte. Sie kamen als Teil der Können ernsthafte Konkurrenten mehr tun, als die Herausforderung verlangt? Diskussion, aber ich glaube nicht, dass es einen klaren Konsens zu diesem bestimmten Thema gibt. Persönlich bin ich nicht dafür.
Dennis
3
@Dennis Danke für deine Einsichten, ich verstehe jetzt was du meintest. Sollte diese Antwort Ihrer Meinung nach als "nicht wettbewerbsfähig" gekennzeichnet werden? Auf der anderen Seite spreche ich nicht für alle polyglotten Antworten (dies ist meine allererste), aber diese hat die besondere Bedeutung, dass die Herausforderung sowohl Java als auch JavaScript betrifft und dass die "imaginären Bonuspunkte" ausdrücklich vergeben wurden für Java, JavaScript und Regex Antworten, bevor ich diese Antwort schrieb. Java und Regex können kombiniert werden, JavaScript und Regex können kombiniert werden, warum nicht alle zusammen? Wie auch immer, es macht mir nichts aus, dies als nicht wettbewerbsfähig zu markieren.
Olivier Grégoire
17

JavaScript, 50 49 Bytes

1 Byte dank @ValueInk durch Neuordnung des regulären Ausdrucks eingespart

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

Testschnipsel

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

Kritixi Lithos
quelle
Ich wollte deine Regex stehlen, aber das hätte meine Antwort länger gemacht: o nette Antwort
HyperNeutrino
Jetzt brauchen wir nur noch eine Java-Antwort.
DJMcMayhem
Wir haben eine Java-Antwort, aber ... ich bin zum ungefähr gleichen Regex gekommen ...
Olivier Grégoire
alternativ:/^java(?!script)/i
Andrea
1
@ OlivierGrégoire ah, verdammt, das scheint unfair
Andrea
15

Java (OpenJDK 8) , 92 82 72 58 57 Bytes

s->s.matches("(?i)(?!.*javascript)java.*")?"car":"carpet"

Probieren Sie es online!

Dank @Nevay 1 Byte gespart !

Olivier Grégoire
quelle
1
Sie können das Caret weglassen, da String # den Versuchen entspricht, mit dem gesamten String übereinzustimmen.
Nevay
11

C (nur aufrufende Puts), 131 Bytes

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

Es hat zwar seine Probleme, besteht aber alle bereitgestellten Testfälle :)

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

Imaginäre Bonuspunkte, wenn Ihre Antwort Java, Javascript oder Regex verwendet

na ja ... nein danke

michi7x7
quelle
8

05AB1E , 21 Bytes

lD'¦‚å≠sη'îáå*„¾„ƒ´#è

Probieren Sie es online!

Erik der Outgolfer
quelle
2
lD“¦‚“åi“¾„“ë“îá“åi…carë 3 Bytes mehr und 1 Stunde zu spät :(. Gute Arbeit.
Magic Octopus Urn
8

Python 2 , 68 Bytes

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

Probieren Sie es online!

-11 bytes dank notjagan
-2 bytes dank Dennis

HyperNeutrino
quelle
11 Bytes kürzer .
Notjagan
@ Justin Das auch. Nett.
HyperNeutrino
Wenn Sie zu Python 2 wechseln, können Sie mit einem vollständigen Programm 2 Bytes sparen.
Dennis
1
@LukeSawczak Oh, das habe ich gar nicht gemerkt: PI verwendete Java direkt davor und in Java ;ist es erforderlich, daher muss ich es sowieso verwenden. Die neue Zeile ist unnötig: P Deshalb habe ich es verwendet.
HyperNeutrino
4

C #, 80 78 Bytes

s=>(s=s.ToLower()).StartsWith("java")&!s.Contains("javascript")?"car":"carpet"
TheLethalCoder
quelle
1
Ich denke, die am besten lesbare Sprache hier ist C #
Sepehr
2
@sepehr Du meinst du siehst scharf mit C #. (Bekomme ich einen Bonus für dumme Kommentare)
Ray
4

EXCEL Google Sheets, 89 86 Bytes

3 Bytes gespart dank Taylor Scott

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

Übernimmt eine Eingabe an A1

Erläuterung

=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.
Kennzeichen
quelle
Ich glaube, dass Sie die Searches durch Finds für -2 Bytes ersetzen können und dass das weiter in eine Google Sheets-Formel für -3 Bytes übersetzt werden könnte, indem Sie die letzten drei Parens nicht schließen
Taylor Scott
1
Bei der Suche wird die Groß- und Kleinschreibung beachtet, bei der Suche wird die Groß- und Kleinschreibung nicht berücksichtigt. Aber diese letzten 3 Bytes sind eine gute Idee!
Mark
Warum von Excel zu Google Sheets wechseln?
Stevoisiak
2
Durch das Entfernen der letzten 3 Parens werden 3 Bytes gespart. Excel würde einfach einen Fehler auslösen und sie trotzdem für Sie eingeben.
Mark
3

vim, 58 bytes

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

Probieren Sie es online!

Strahl
quelle
Ich denke, die Verwendung des gBefehls könnte etwas kürzer sein, so etwas wie :g/\cjavascript/d :g!/^\cjava/d icarpet␛:s/pet..*.
Neil
3

Retina ,  44  37 Bytes

Ai`^(?!.*javascript)java
.+
pet
^
car

Vielen Dank an @MartinEnder für das Golfen mit 7 Bytes!

Probieren Sie es online!

Dennis
quelle
3

Common Lisp, 131 125 Bytes

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

Probieren Sie es online!

Dank des # n = "Tricks" von Common Lisp wurde die Größe reduziert .

Erläuterung

(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
Renzo
quelle
2

C (tcc) 144 136 Bytes

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

Probieren Sie es online!

Abgerollt:

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

Excel, 84 Bytes

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

Excel VBA, 76 Bytes

Anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich [A1]und den Ausgaben als car/ carpetstatus für das VBE-Direktfenster verwendet

RegExp wird nicht verwendet

?"car"IIf(InStr(1,[A1],"Java",1)*(InStr(1,[A1],"JavaScript",1)=0),"","pet")
Taylor Scott
quelle
1
Gute Verwendung von VBA! Ich dachte, ein Makro wäre kürzer gewesen. Jetzt habe ich Beweise.
Mark
1

Python 3 , 95 Bytes

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

Probieren Sie es online!

Ja, es könnte kürzer sein, aber ich wollte versuchen, ein verschachteltes Lambda zu verwenden!

Kavi
quelle
Immer gut zu experimentieren :) Beachten Sie, dass Sie Bytes speichern können um Operatoren wie and, or, if,else
Luke Sawczak
1

Perl , 42 Bytes

Ich glaube die Antwort von stevieb hat eine falsche Ausgabe (habe das selbst ausprobiert - es gibt Auto für 'javajavascript' zurück). Das sollte funktionieren:

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

Mathematica, 82 Bytes

Regex

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

JAISBaL , 36 Bytes

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

Ausführlich / Erklärung:

# \# 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 war mein erster Versuch, eine Golfsprache zu entwerfen. Es ist also ziemlich eigenartig. Es gibt keine Übereinstimmungen oder Inhalte, Regex oder Ähnliches. Stattdessen müssen wir die resultierende Array-Länge aufteilen und überprüfen -regex ... aber keine andere regex unterstützung .... aus gründen.

Regex gestohlen von @Cows Quacks Antwort entlehnt .

Sokratischer Phönix
quelle
0

Python 2 , 69 Bytes

f=input().lower().find
print'car'+'pet'*(f('java')!=~f('javascript'))

Derzeit 1 Byte länger als die kürzeste Python 2-Lösung.

Probieren Sie es online!

Dennis
quelle
0

Perl , 36 Bytes

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

Führen Sie es so aus:

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

Batch, 91 Bytes

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

Übernimmt die Eingabe für STDIN. Batch verfügt nicht über einen Vergleichsoperator, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, aber es wird die Groß- und Kleinschreibung nicht berücksichtigt, sodass ich den ersten vier Zeichen ein temporäres Zeichen zuweisen und dann Java durch die Groß- und Kleinschreibung ersetzen kann, was dann zu einer leeren Zeichenfolge führen sollte. In der Zwischenzeit ersetze ich unempfindlich Javascript in der ursprünglichen Zeichenfolge, die es unverändert lassen sollte.

Neil
quelle
0

Lua, 96 Bytes

function(x)return x:lower():match"^java"and not x:lower():match"javascript"and"car"or"carpet"end
IllidanS4 will Monica zurück
quelle
0

Perl, 98 84 62 Bytes

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

Probieren Sie es online!

Danke an bytepusher

Burgan
quelle
Willkommen auf der Seite! Ich kenne kein Perl, aber es sieht so aus, als ob Sie viele Leerzeichen entfernen könnten. Auch, wenn Sie nach mehr Möglichkeiten suchen , um es zu verkürzen, gibt es eine Reihe von Tipps hier .
DJMcMayhem
@DJMcMayhem Danke, ich denke, die gesamte Logik kann geändert werden, um sie noch kürzer zu machen, aber ich habe es nicht herausgefunden
Burgan
1
Nur ein paar Tipps (ohne die Lösung zu stark zu verändern): Sie können die return $b;durch just ersetzen $b;. Perl gibt immer die zuletzt ausgewertete Anweisung zurück. Da wir uns nicht um Warnungen kümmern, können Sie sogar das ';' zu $b}. Die Klammern um das if brauchen Sie nicht. Wenn Sie ||statt verwenden or, können Sie nach dem regulären Ausdruck ein Leerzeichen speichern.
Bytepusher
1
Sie können auch das () um das erste lc entfernen, benötigen dann aber ein Leerzeichen. Wenn Sie !~anstelle ! =~der zweiten Bedingung verwenden können lc$_[0]!~. `-> sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}. Wenn Sie die ternären sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}
Operationen verwenden, wird
1
Nicht zu vergessen - keine Notwendigkeit für lc, wenn Sie den Regex-Ignorier-Schalter haben, weitere 2 :) $_[0] =~//i||$_[0]!~//i. Und schließlich, warum eine Variable? sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}sollte gut gehen :). Und jetzt: Perl wird nett sein und Sie können $ _ [0] ohne Angabe verwenden (wenn auch nicht mit !~): sub a{"car".(/javascript/i||!/^java/i?'pet':'')}-> 48 :)
Bytepusher
0

Dart VM, 104 Bytes 102 Bytes

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

Erklärung :

Entgolfet:

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

Wir haben unsere übliche Hauptfunktion

Wir ersetzen pdurch, p[0].toLowerCase();damit wir keine neue Variable deklarieren müssen ( varplus ein Leerzeichen wären 4 zusätzliche Bytes)

Wir fahren dann mit dem eigentlichen Drucken fort

Wir drucken carbedingungslos und verwenden Inline-Anweisungen, um zu prüfen, ob danach gedruckt werden petsoll oder nicht. Wenn die Zeichenfolge 'java' bei Index 0 ist und kein 'Javascript' enthalten ist, tun wir nichts (wir hängen tatsächlich eine leere Zeichenfolge an, aber sie hat keine Auswirkung), und ansonsten hängen wir an pet.

Eisflocke
quelle
0

Rust, 97 Bytes

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

Ich bin mir ziemlich sicher, dass es eine kürzere Lösung gibt, aber es ist mein erster Versuch :)

f4bi4n
quelle