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

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.


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


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


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ę



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




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

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.

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!


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

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

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

1

Excel, 84 bajty

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

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

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!


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'

0

Mathematica, 82 bajty

regex

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

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 .



0

Perl, 36 bytes

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

Run it as such:

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

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.



0

Perl, 98 84 62 Bytes

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

Try it online!

Thanks to bytepusher


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.


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.