Java to JavaScript, podobnie jak Car to Carpet

36

Tytuł skradzione zainspirowany odpowiedź Greg Hewgill jest na czym polega różnica między JavaScript i Java?

Wprowadzenie

Java i JavaScript są powszechnie używanymi językami wśród programistów i są obecnie najpopularniejszymi tagami w przepełnieniu stosu. Jednak, jak wszyscy wiemy, oprócz podobnych nazw, te dwa nie mają ze sobą prawie nic wspólnego.

Na cześć jednej z najbardziej niesławnych debat programistycznych i zainspirowanych moimi ostatnimi frustracjami związanymi z wyszukiwaniem tagów , proponuję:

Wyzwanie

Napisz program, który pobiera ciąg znaków jako dane wejściowe. Zwraca, carjeśli ciąg zaczyna się od „Java” i nie zawiera „JavaScript”. W przeciwnym razie wróć carpet.

Przykład wejścia i wyjścia

samochód:

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

wykładzina podłogowa:

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

Notatki

  • Dopasowanie danych wejściowych powinno nie uwzględniać wielkości liter
  • Jedynymi możliwościami wyjścia powinny być carlubcarpet
  • Wyimaginowane punkty bonusowe, jeśli Twoja odpowiedź używa Java, JavaScript lub Regex
  • Alternatywny tytuł: Java to JavaScript, podobnie jak szynka to chomik
Stevoisiak
źródło
2
Nowy tag pasujący do wzorca potrzebuje wiki. Proszę wnieść wkład, jeśli możesz
Christopher
2
W zależności od kolejności, w jakiej są wykonywane, javacarpetmogą wykrywać błędy, których nie mają istniejące przypadki testowe.
Ray
17
Jeśli tak imaginary bonus points if your answer uses Java, Javascript, or Regex, czy to sprawia, że ​​takie rozwiązanie jest skomplikowane? ;)
Steadybox
Alternate Title: Java is to JavaScript as ham is to hamsterW rzeczywistości „szynka” w „chomiku” odnosi się do „szynki” spożywczej. „Szynka” spożywcza to mięso wieprzowe, a termin „chomik” pochodzi od spokrewnionego zwierzęcia, świnki morskiej, której mięso zastąpiło mięso wieprzowe podczas dalekich podróży morskich, ponieważ zwierzęta łatwiej było hodować na statku.
dotancohen

Odpowiedzi:

100

Java / JavaScript Polyglot, 108 107 106 bajtów

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

Uruchom jako Java

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

Wypróbuj online!

Uwaga: nie ufaj wyróżnieniu, ponieważ jest nieprawidłowe. Prawdziwa Java, poprawnie zinterpretowana, wygląda jak poniżej, ponieważ \u000Ajest interpretowana na pierwszym etapie kompilacji jako \nde facto kończąca komentarz, który zaczął się od komentarza wierszowego ( //).

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

Uruchom jako JavaScript

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

Kredyty dla @CowsQuak dla wersji 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));

Ile wyimaginowanych punktów bonusowych za tę odpowiedź?

-1 bajt dzięki @Nevay w odpowiedzi Java.

Olivier Grégoire
źródło
1
To nie jest konkurencyjne w JavaScript ani Java. Nie jestem nawet przekonany, że jest to poważny pretendent, co jest warunkiem wszystkich zgłoszeń.
Dennis
10
@Dennis Dziękujemy za informacje. Uważam to jednak za poliglota. Czy istnieje jakaś reguła przeciwko wpisom poliglotycznym, gdy nie są one wyraźnie wymagane? Starałem się grać w golfa tak bardzo, jak to możliwe. Na przykład próbowałem połączyć oba wyrażenia regularne razem, ale nie mogłem uzyskać niczego krótszego niż to (z powodu dwóch różnych, choć podobnych wyrażeń regularnych i ich ogranicznika). Niemożliwe jest również posiadanie tej samej definicji zmiennej, ponieważ JavaScript nie pozwala na nową linię między ai =>. Starałem się pozostać w duchu golfa. Jeśli zrobiłem coś złego, proszę powiedz mi?
Olivier Grégoire,
24
@Dennis IMHO „Java / JavaScript polyglot” liczy się jako własny język, w którym to przypadku jest bardzo konkurencyjny.
ETHprodukcje
1
@ OlivierGrégoire Nie twierdzę, że nie jest to dobrze zagrane zgłoszenie do gry w poliglota, ale jest dyskusyjne, czy w pierwszym rzędzie powinno być zgłoszenie udziału w poliglocie do wyzwań innych niż poliglota. Pojawili się w ramach Can poważnych konkurentów zrobić więcej, niż wymaga tego wyzwanie? dyskusja, ale nie sądzę, że istnieje wyraźny konsensus w tym konkretnym temacie. Osobiście nie jestem za.
Dennis
3
@Dennis Dziękuję za wgląd, teraz rozumiem, co miałeś na myśli. Czy według ciebie ta odpowiedź powinna być oznaczona jako „niekonkurencyjna”? Z drugiej strony, chociaż nie mówię za wszystkimi odpowiedziami na poligloty (to moja pierwsza w historii), ta ma szczególne znaczenie, że wyzwanie mówi zarówno o Javie, jak i JavaScript, i że „wymyślone punkty bonusowe” zostały wyraźnie przyznane dla odpowiedzi Java, JavaScript i regex, zanim napisałem tę odpowiedź. Java i regex można łączyć, JavaScript i regex można łączyć, dlaczego nie wszystkie razem? W każdym razie nie mam nic przeciwko oznaczeniu tego jako niekonkurencyjnego.
Olivier Grégoire,
17

JavaScript, 50 49 bajtów

Zaoszczędzono 1 bajt dzięki @ValueInk, zmieniając regex

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

Testowy fragment kodu

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
źródło
Zamierzałem ukraść twoje wyrażenie regularne, ale dzięki temu moja odpowiedź byłaby dłuższa: o miła odpowiedź
HyperNeutrino,
Teraz potrzebujemy tylko odpowiedzi Java.
DJMcMayhem
Mamy odpowiedź w języku Java, ale ... Przyszedłem do mniej więcej tego samego wyrażenia regularnego ...
Olivier Grégoire,
alternatywnie:/^java(?!script)/i
Andrea
1
@ OlivierGrégoire ah, cholera, ten wydaje się niesprawiedliwy
Andrea
15

Java (OpenJDK 8) , 92 82 72 58 57 bajtów

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

Wypróbuj online!

1 bajt zapisany dzięki @Nevay !

Olivier Grégoire
źródło
1
Możesz pominąć daszek, ponieważ ciąg # pasuje do prób dopasowania całego łańcucha.
Nevay
11

C (tylko wywołanie put), 131 bajtów

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

Ma swoje problemy, ale przechodzi wszystkie dostarczone przypadki testowe :)

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

Wyimaginowane punkty bonusowe, jeśli Twoja odpowiedź korzysta z Java, JavaScript lub Regex

cóż ... nie, dziękuję

michi7x7
źródło
8

05AB1E , 21 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło
2
lD“¦‚“åi“¾„“ë“îá“åi…carë 3 bajty więcej i 1 godzina spóźnienia :(. Dobra robota.
Magic Octopus Urn
8

Python 2 , 68 bajtów

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

Wypróbuj online!

-11 bajtów dzięki notjagan
-2 bajty dzięki Dennisowi

HyperNeutrino
źródło
@ Justin That też. Miły.
HyperNeutrino,
Jeśli przełączysz się na Python 2, możesz zapisać 2 bajty z pełnym programem.
Dennis
1
@LukeSawczak Och, nawet nie zdawałem sobie sprawy z tego, że: PI wcześniej używał Java i ;jest wymagany w Javie, więc ponieważ muszę go używać, nowa linia jest niepotrzebna: P Dlatego go użyłem.
HyperNeutrino
4

C #, 80 78 bajtów

s=>(s=s.ToLower()).StartsWith("java")&!s.Contains("javascript")?"car":"carpet"
TheLethalCoder
źródło
1
Myślę, że najbardziej czytelnym językiem tutaj jest C #
sepehr
2
@sepehr Masz na myśli, że widzisz ostry z C #. (Czy dostanę premię za głupie komentarze)
Ray
4

EXCEL Arkusze Google, 89 86 bajtów

Zaoszczędź 3 bajty dzięki Taylor Scott

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

Pobiera dane na A1

Wyjaśnienie

=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.
znak
źródło
Wierzę, że można zastąpić Searches Finds-2 bajtami i że można to dodatkowo przełożyć na formułę arkuszy Google dla -3 bajtów, nie zamykając ostatnich trzech parenów
Taylor Scott
1
W wyszukiwaniu rozróżniana jest wielkość liter, w wyszukiwaniu rozróżniana jest wielkość liter. Ale te ostatnie 3 bajty to dobry pomysł!
Mark
Dlaczego zamiana z Excela na Arkusze Google?
Stevoisiak
2
Usunięcie ostatnich 3 parens pozwala zaoszczędzić 3 bajty. Excel po prostu zgłasza błąd i umieszcza je dla ciebie.
Mark
3

vim, 58 bajtów

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

Wypróbuj online!

Promień
źródło
Myślę, że użycie gpolecenia może być nieco krótsze, coś w rodzaju :g/\cjavascript/d :g!/^\cjava/d icarpet␛:s/pet..*.
Neil
3

Retina ,  44  37 bajtów

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

Dzięki @MartinEnder za grę w golfa z 7 bajtów!

Wypróbuj online!

Dennis
źródło
3

Common Lisp, 131 125 bajtów

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

Wypróbuj online!

Rozmiar zmniejszony dzięki # n = „trickowi” Common Lisp.

Wyjaśnienie

(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
źródło
2

C (tcc), 144 136 bajtów

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

Wypróbuj online!

Rozwinięty:

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
źródło
1

Excel, 84 bajty

="car"&IF(AND(ISERR(SEARCH("javascript",A1)),IFERROR(SEARCH("java",A1),2)=1),,"pet")
Wernisch
źródło
1

Excel VBA, 76 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe z zakresu [A1]i danych wyjściowych to car/ carpetstatus do bezpośredniego okna VBE

Nie używa RegExp

?"car"IIf(InStr(1,[A1],"Java",1)*(InStr(1,[A1],"JavaScript",1)=0),"","pet")
Taylor Scott
źródło
1
Niezłe użycie VBA! Myślałem, że makro byłoby krótsze. Teraz mam dowód.
Mark
1

Python 3 , 95 bajtów

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

Wypróbuj online!

Tak, może być krótszy, ale chciałem spróbować użyć zagnieżdżonej lambdy!

Kavi
źródło
Zawsze dobrze jest poeksperymentować :) Należy pamiętać, że można zaoszczędzić około bajtów operatorzy podoba and, or, if,else
Łukasz Sawczak
1

Perl , 42 bajty

Wierzę, że odpowiedź stevieba ma niepoprawny wynik (sam tego spróbowałem - zwraca samochód dla „javajavascript”). To powinno działać:

say/^java/i&&!/javascript/i?'car':'carpet'
bytepusher
źródło
0

Mathematica, 82 bajty

regex

If[#~StringMatchQ~RegularExpression@"(?i)(?!.*javascript)^java.*","Car","Carpet"]&
J42161217
źródło
0

JAISBaL , 36 bajtów

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

Pełne / wyjaśnienie:

# \# 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 to moja pierwsza próba zaprojektowania języka golfowego, więc jest raczej dziwaczna ... nie ma żadnych dopasowań ani zawiera, wyrażeń regularnych lub w inny sposób, więc zamiast tego musimy podzielić i sprawdzić wynikową długość tablicy ... ponieważ JAISBaL ma podział według -regex ... ale żadne inne wsparcie wyrażeń regularnych ... z powodów.

Regex skradziony pożyczony od odpowiedzi @Cows Quack .

Socratic Phoenix
źródło
0

Python 2 , 69 bajtów

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

Obecnie 1 bajt dłuższy niż najkrótsze rozwiązanie Python 2.

Wypróbuj online!

Dennis
źródło
0

Perl, 36 bytes

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

Run it as such:

perl -nE 'say/^java(?!script)/i?"car":"carpet"' java.txt
stevieb
źródło
0

Batch, 91 bytes

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

Takes input on STDIN. Batch doesn't have a case insensitive comparison operator but it does have case insensitive string replacement so I can assign a temporary to the first four characters and then case insensitively replace java, which should then result in the empty string. Meanwhile I case insensitively replace javascript in the original string, which should leave it unchanged.

Neil
źródło
0

Lua, 96 bytes

function(x)return x:lower():match"^java"and not x:lower():match"javascript"and"car"or"carpet"end
IllidanS4 wants Monica back
źródło
0

Perl, 98 84 62 Bytes

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

Try it online!

Thanks to bytepusher

Burgan
źródło
Welcome to the site! I don't know any perl, but it looks like there is a lot of whitespace you could remove. Also, if you're looking for more ways to shorten it, there's a bunch of tips here.
DJMcMayhem
@DJMcMayhem Thank you, I think the entire logic can be changed to make it even shorter, but I haven't figured it out
Burgan
1
Just some hints (without changing your solution too much): You can replace the return $b; with just $b;. Perl always returns the last evaluated statement. Since we don't care about warnings, you can even drop the ';' to $b}. You don't need the brackets around the if. If you use || instead of or, you can save a whitespace after the regex.
bytepusher
1
You can also remove the () around the first lc, but need a space after if then. If you use !~ instead of ! =~ the second condition can be lc$_[0]!~. ` -> sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}. Using the ternary ops brings it down one more sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}
bytepusher
1
Not to forget - no need for lc when you have the regex ignore case switch, down another 2 :) $_[0] =~//i||$_[0]!~//i. And finally, why a variable? sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');} should do fine :). And now: perl will be nice and let you use $_[0] w/o specifying it (though not with !~): 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'}");}

Explanation:

Degolfed:

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

We have our usual main function

We replace p with p[0].toLowerCase(); so that we don't have to declare a new variable (var plus a space would be 4 extra bytes)

We then proceed to do the actual printing

We print car unconditionally and we use inline statements for checking whether to print pet after it or not. If it has the string 'java' at index 0 and does not have 'javascript' in it, we do nothing (we actually append an empty string but it does not have any effect) and otherwise we append pet.

Ice Flake
źródło
0

Rust, 97 bytes

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

I'm pretty sure that there is a shorter solution but it's my first try :)

f4bi4n
źródło