Ява для JavaScript, как автомобиль для ковра


36

Название похищенного вдохновленный ответ Грег Hewgill в к чем разница между 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 Polyglot, 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
@ Денис Спасибо за вашу информацию. Однако я считаю это записью полиглота. Есть ли какое-либо правило против записей полиглота, когда они явно не запрашиваются? Я старался играть в гольф как можно больше. Например, я попытался соединить оба регулярных выражения, но не смог получить ничего более короткого, чем это (из-за двух разных, хотя и похожих, регулярных выражений и их разделителя). Также невозможно иметь одно и то же определение переменной, потому что JavaScript не позволяет новую строку между aи =>. Я старался оставаться в духе игры в гольф. Если я сделал что-то не так, пожалуйста, скажите мне?
Оливье Грегуар

24
@Dennis ИМХО «Полиглот Java / JavaScript» считается его собственным языком, и в этом случае он очень конкурентоспособен.
ETHproductions

1
@ OlivierGrégoire Я не говорю , что это не хорошо golfed представление полиглот, но это спорно , если должно быть полиглотом представления на не-полиглотов проблем , в первую очередь. Они придумали как часть « Могут ли серьезные соперники сделать больше, чем требует вызов? обсуждение, но я не думаю, что есть четкое согласие по этой конкретной теме. Лично я не за.
Деннис

3
@Dennis Спасибо за ваши идеи, теперь я понимаю, что вы имели в виду. Должен ли этот ответ быть помечен как «неконкурентный», по вашему мнению? С другой стороны, хотя я и не говорю о всех ответах полиглота (это мой первый опыт), этот вопрос имеет особое значение, так как в задании говорится как о Java, так и о JavaScript, и что «мнимые бонусные баллы» были явно присуждены для Java, JavaScript и регулярных выражений, прежде чем я написал этот ответ. Java и регулярные выражения могут быть объединены, JavaScript и регулярные выражения могут быть объединены, почему бы не все вместе? В любом случае, я не против пометить это как неконкурентное.
Оливье Грегуар

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


Я собирался украсть ваше регулярное выражение, но это сделало бы мой ответ длиннее: о хороший ответ, хотя
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 байт благодаря notjagan
-2 байт благодаря Деннису




@ Джастин Это тоже. Ницца.
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 #. (
Рэй

4

EXCEL Google Sheets, 89 86 байт

Сохранено 3 байта благодаря Тейлор Скотт

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

Принимает вход на А1

объяснение

=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 Sheets?
Стевойсяк

2
Удаление последних 3 паренов экономит 3 байта. В любом случае Excel просто выдаст ошибку и вставит ее для вас.
Марк

3

vim, 58 байт

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

Попробуйте онлайн!


Я думаю, что использование gкоманды может быть немного короче, что-то вроде :g/\cjavascript/d :g!/^\cjava/d icarpet␛:s/pet..*.
Нил




3

Common Lisp, 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/ carpetstatus в непосредственное окно 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 имеет неправильный вывод (сам пробовал - он возвращает машину для 'javajavascript'). Это должно работать:

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

0

Mathematica, 82 байта

регулярное выражение

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

0

JAISBaL , 36 байт

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

Многословный / объяснение:

# \# 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 была моей первой попыткой создать язык игры в гольф, так что это довольно странно ... здесь нет совпадений или содержаний, регулярных выражений или чего-то еще, поэтому вместо этого нам нужно разделить и проверить полученную длину массива ... потому что JAISBaL имеет разделение на -regex ... но никакой другой поддержки regex .... по причинам.

Украденное Regex позаимствовано из ответа @Cows Quack .



0

Perl , 36 байт

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

Запустите его так:

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

0

Пакетная, 91 байт

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

Принимает участие в STDIN. Пакет не имеет оператора сравнения без учета регистра, но он имеет замену строки без учета регистра, поэтому я могу назначить временное значение первым четырем символам, а затем заменить регистр без учета регистра, что должно привести к пустой строке. Между тем я без учета регистра заменяю javascript в исходной строке, что должно оставить его без изменений.



0

Perl, 98 84 62 байта

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

Попробуйте онлайн!

Благодаря bytepusher


Добро пожаловать на сайт! Я не знаю никакого perl, но похоже, что есть много пробелов, которые вы можете удалить. Кроме того , если вы ищете больше способов сократить его, есть куча советов здесь .
DJMcMayhem

@DJMcMayhem Спасибо, я думаю, что вся логика может быть изменена, чтобы сделать ее еще короче, но я не понял это
Бурган

1
Несколько советов (не слишком меняя свое решение): Вы можете заменить return $b;просто $b;. Perl всегда возвращает последний оцененный оператор. Поскольку нас не волнуют предупреждения, вы можете даже опустить ';' к $b}. Вам не нужны скобки вокруг if. Если вы используете ||вместо or, вы можете сохранить пробел после регулярного выражения.
bytepusher

1
Вы также можете удалить () вокруг первого lc, но после него нужно ввести пробел. Если вы используете !~вместо ! =~второго условия могут быть lc$_[0]!~. `-> sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}. Использование троичного оператора опускает еще одинsub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}
bytepusher

1
Не забывайте - нет необходимости в lc, когда у вас есть переключатель игнорирования регулярных выражений, вниз еще 2 :) $_[0] =~//i||$_[0]!~//i. И, наконец, почему переменная? sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}должно быть хорошо :). А теперь: perl будет хорош и позволит вам использовать $ _ [0] без указания его (хотя и не с !~): sub a{"car".(/javascript/i||!/^java/i?'pet':'')}-> 48 :)
bytepusher

0

Дарт В.М., 104 байта 102 байта

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

Пояснение :

Degolfed:

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

У нас есть наша обычная основная функция

Мы заменим pна p[0].toLowerCase();так, что нам не нужно объявлять новую переменную ( varплюс пробел будет 4 дополнительных байта)

Затем мы приступаем к фактической печати

Мы печатаем carбезоговорочно и используем встроенные операторы для проверки, печатать ли petпосле него или нет. Если у него есть строка 'java' с индексом 0 и в нем нет 'javascript', мы ничего не делаем (мы фактически добавляем пустую строку, но это не имеет никакого эффекта), и в противном случае мы добавляем pet.


0

Ржавчина, 97 байт

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

Я уверен, что есть более короткое решение, но это моя первая попытка :)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.