Java - це JavaScript, як автомобіль - килим


36

Заголовок викрадений натхненним відповіддю Грега Х'югілла на те, у чому різниця між JavaScript та Java?

Вступ

Java та JavaScript є найпоширенішими мовами серед програмістів, і в даний час є найпопулярнішими тегами в Stack Overflow. Однак, як всі ми знаємо, окрім подібних імен, вони не мають майже нічого спільного.

На честь однієї з найвідоміших дискусій з програмування, натхненної моїми останніми розчаруваннями в пошуку тегів , я пропоную наступне:

Виклик

Напишіть програму, яка приймає рядок як вхідний. Повертається, carякщо рядок починається з "Java" і не включає "JavaScript". В іншому випадку поверніться carpet.

Приклад введення та виведення

автомобіль:

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

килим:

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

Примітки

  • Збіг введення повинен бути нечутливим до регістру
  • Тільки можливості для виведення повинні бути carабоcarpet
  • Уявні бонусні бали, якщо у вашій відповіді використовуються Java, JavaScript або Regex
  • Альтернативна назва: Java - це JavaScript, як шинка - хом'як

2
Новий тег відповідності шаблону потребує вікі. Будь ласка, додавайте, якщо зможете
Крістофер

2
Залежно від того, в якому порядку зроблено, javacarpetможуть виявляти помилки, яких немає в існуючих тестових випадках.
Рей

17
Якщо ви отримаєте imaginary bonus points if your answer uses Java, Javascript, or Regex, чи це складний рахунок обліку такого рішення? ;)
Steadybox

Alternate Title: Java is to JavaScript as ham is to hamsterВласне, «шинка» у «хом'яка» є однорідною до харчової «шинки». Харчова «шинка» - свиняче м'ясо, а термін «хом'як» походить від спорідненої тварини морської свинки, м'ясо якої замінило м'ясо свиней у довгих морських плаваннях, оскільки тварин було легше вирощувати на кораблі.
dotancohen

Відповіді:


100

Поліглот Java / JavaScript, 108 107 106 байт

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

Запустити як Java

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

Спробуйте в Інтернеті!

Примітка: не довіряйте підсвічування, оскільки вона неправильна. Справжня Java, правильно інтерпретована, виглядає нижче, тому що \u000Aвона інтерпретується на першому кроці компіляції, оскільки \nфактично закінчується коментарем, який розпочався з рядка comment ( //).

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

Запустити як JavaScript

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

Подяки @CowsQuak за версію 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));

Скільки уявних бонусних балів за цю відповідь?

-1 байт завдяки @Nevay у відповіді на Java.


1
Це не є конкурентоспроможним у JavaScript чи Java. Я навіть не впевнений, що це серйозний претендент, що є вимогою для всіх заяв.
Денніс

10
@Dennis Дякую за інформацію. Однак я розглядаю це як поліглот. Чи є якесь правило проти поліглот-записів, коли вони не мають явного запиту? Я намагався якомога більше пограти в гольф. Наприклад, я спробував скласти обидва регулярні вирази, але я не міг отримати щось коротше, ніж це (через два різних, хоча і схожих, і їх роздільник). Також неможливо мати однакове визначення змінної, оскільки JavaScript не дозволяє новий рядок між aі =>. Я намагався залишатися в дусі гольфу. Якщо я зробив щось не так, скажіть будь-ласка?
Олів'є Грегоар

24
@Dennis IMHO "Поліглот Java / JavaScript" вважається власною мовою, і в цьому випадку це дуже конкурентоспроможно.
ETHproductions

1
@ OlivierGrégoire Я не кажу, що це не добре підданий поліглот подачі, але це дискусійно, якщо в першу чергу повинні бути подання поліглоту на проблеми, які не є поліглотами. Вони придумали частину Can-серйозних претендентів зробити більше, ніж вимагає завдання? обговорення, але я не думаю, що існує чіткий консенсус щодо цієї конкретної теми. Особисто я не на користь.
Денніс

3
@Dennis Дякую за розуміння, тепер я розумію, що ти мав на увазі. Чи слід, на вашу думку, цю відповідь позначати як "неконкурентну"? З іншого боку, хоча я не виступаю за всі відповіді на поліглот (це мій перший в історії), цей особливий сенс полягає в тому, що виклик говорить як про Java, так і JavaScript, і що "уявні бонусні бали" були явно присуджені для відповідей Java, JavaScript та регулярного вираження, перш ніж я писав цю відповідь. Java та regex можна комбінувати, JavaScript та regex можна комбінувати, чому б не все разом? У всякому разі, я не проти відзначати це як неконкурентне.
Олів'є Грегоар

17

JavaScript, 50 49 байт

Збережено 1 байт завдяки @ValueInk, переставивши регулярний вираз

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

Фрагмент тесту

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


Я збирався вкрасти ваш регулярний вираз, але це би зробило мою відповідь довше: o приємна відповідь, хоча
HyperNeutrino

Тепер нам просто потрібна відповідь на Java.
DJMcMayhem

У нас є відповідь на Java, але ... Я прийшов до приблизно такого ж регексу ...
Олів'є Грегоар

альтернативно:/^java(?!script)/i
Андреа

1
@ OlivierGrégoire ах, чорт, це здається несправедливим
Андреа


11

C (лише виклики), 131 байт

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

У нього є свої проблеми, але він здає всі надані тести :)

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

Уявні бонусні бали, якщо у вашій відповіді використовуються Java, Javascript або Regex

ну ... ні дякую



8

Python 2 , 68 байт

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

Спробуйте в Інтернеті!

-11 байт завдяки ножагану
-2 байти завдяки Деннісу




@Justin Це теж. Приємно.
HyperNeutrino

Якщо перейти на Python 2, ви можете зберегти 2 байти за допомогою повної програми.
Денніс

1
@LukeSawczak О, я навіть не усвідомлював, що: PI використовував Java безпосередньо до цього, а в Java ;потрібна, тому я, оскільки мені доведеться використовувати її все одно, новий рядок не потрібен: P Ось чому я його використовував.
HyperNeutrino

4

C #, 80 78 байт

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

1
Я думаю, що найбільш читаною мовою тут є C #
sepehr

2
@sepehr Ви маєте на увазі, що ви бачите різкий з C #. (Чи отримую я бонус за тупі коментарі)
Ray

4

EXCEL Google Таблиці, 89 86 байт

Збережено 3 байти завдяки Тейлору Скотту

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

Бере вхід на A1

Пояснення

=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.

Я вважаю, що ви можете замінити Searches на Finds на -2 байти і що це може бути далі переведено на формулу аркушів google для -3 байт, не закриваючи останні три парони
Тейлор Скотт

1
Значення має великі регістри, пошук не враховує регістр. Але останні 3 байти - гарна ідея!
Марк

Чому заміна з Excel на Google Таблиці?
Stevoisiak

2
Видалення останніх 3 парен економить 3 байти. Excel просто видасть помилку і додасть їх вам все одно.
Марк





3

Лист звичайний, 131 125 байт

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

Спробуйте в Інтернеті!

Розмір зменшено завдяки # n = "трюку" Common Lisp.

Пояснення

(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 байт

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

Спробуйте в Інтернеті!

Розгорнуто:

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 байти

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

1

Excel VBA, 76 байт

Анонімна функція негайного вікна VBE, яка приймає вхід з діапазону [A1]та виводить, car/ carpetстатус у безпосереднє вікно VBE

Не використовує RegExp

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

1
Гарне використання vba! Я думав, макрос був би коротшим. Тепер у мене є докази.
Марк

1

Python 3 , 95 байт

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

Спробуйте в Інтернеті!

Так, це може бути коротше, але я хотів спробувати використовувати вкладені лямбда!


Завжди добре експериментувати :) Зверніть увагу , що ви можете зберегти байти навколо операторів подобаються and, or, if,else
Люк Sawczak

1

Perl , 42 байти

Я вважаю, що відповідь stevieb має неправильний вихід (я спробував це сам - він повертає машину для 'javaja JavaScript'). Це має працювати:

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

0

Mathematica, 82 bytes

regex

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

0

JAISBaL, 36 bytes

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

Verbose/explanation:

# \# 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 was my first attempt at designing a golfing language, so it's rather quirky... there's no matches or contains, regex or otherwise, so instead we have to split and check the resulting array length... because JAISBaL has a split-by-regex... but no other regex support.... because reasons.

Regex stolen borrowed from @Cows Quack's answer.



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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.