Java对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

笔记

  • 输入匹配不区分大小写
  • 输出的唯一可能性应该是carcarpet
  • 如果您的答案使用Java,JavaScript或Regex,则可获得虚构的奖励积分
  • 备用标题:Java是JavaScript,就像火腿是仓鼠

2
新的模式匹配标记需要一个Wiki。如果可以的话,请贡献
Christopher

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

Answers:


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,它实际上被解释为,以行注释(//)开头的注释结束。

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

感谢JS版本的@CowsQuak。

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字节感谢Java回答中的@Nevay


1
这在JavaScript或Java中没有竞争力。我什至不认为这是一个认真的竞争者,这是所有提交的要求。
丹尼斯

10
@Dennis谢谢您的信息。但是,我认为这是一个多语言条目。没有明确要求多语言条目时,是否有任何规则?我试图尽可能多地打高尔夫球。例如,我试图将两个正则表达式放在一起,但是我无法获得比这更短的东西(因为两个不同的正则表达式及其分隔符)。也不可能具有相同的变量定义,因为JavaScript不允许在a和之间加换行=>。我试图保持打高尔夫球的精神。如果我做错了什么,请告诉我?
奥利维尔·格雷戈尔

24
@Dennis恕我直言,“ Java / JavaScript多语言”被视为其自己的语言,在这种情况下,这是非常有竞争力的。
ETHproductions

1
@OlivierGrégoire我并不是说这不是一个完善的多语言提交,但是如果首先应该有针对非多语言挑战的多语言提交,则是有争议的。他们是“挑战者”的一部分吗?讨论,但我认为在这个特定主题上没有明确的共识。就个人而言,我不赞成。
丹尼斯,

3
@Dennis谢谢您的见解,我现在明白您的意思了。根据您的说法,该答案是否应标记为“非竞争性”?另一方面,虽然我并不是说所有的通俗易懂的答案(这是我有史以来第一次),但它的特殊含义是挑战同时涉及Java和JavaScript,并且明确授予了“虚构的奖励积分”在编写此答案之前,请先获取Java,JavaScript和正则表达式的答案。Java和regex可以合并,JavaScript和regex可以合并,为什么不全部合并在一起?无论如何,我不介意将其标记为非竞争性。
奥利维尔·格雷戈尔

17

JavaScript,50 49字节

@ValueInk通过重新排列正则表达式节省了1个字节

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


我本打算窃取您的正则表达式,但是那样会使我的回答更长一些:虽然
如此,

现在我们只需要一个Java答案。
DJMcMayhem

我们有一个Java答案,但是...我来到了大致相同的正则表达式...
OlivierGrégoire17年

或者:/^java(?!script)/i
Andrea

1
@OlivierGrégoire啊,该死的,这似乎不公平
Andrea


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字节归功于Dennis




@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#感到敏锐。(我会因愚蠢的评论而获得奖励)

4

EXCEL Google表格,89 86字节

泰勒·斯科特(Taylor Scott)节省了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 替换Find为-2个字节,并且可以通过不关闭最后三个括号将其进一步转换为-3个字节的google工作表公式
Taylor Scott

1
查找区分大小写,搜索不区分大小写。但是最后3个字节是个好主意!
标记

为什么从Excel换成Google表格?
Stevoisiak

2
删除最后3个parens将节省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#))))

在线尝试!

由于Common Lisp的#n = “技巧”,尺寸减小了。

说明

(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/ carpetBE状态到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())

在线尝试!

是的,它可能更短,但我想尝试使用嵌套的lambda!


总是好的尝试:)注意,你可以节省字节的运营商喜欢andorifelse
卢克Sawczak

1

Perl42个字节

我相信stevieb的答案有一个错误的输出(尝试一个我自己-它返回'javajavascript'的car)。这应该工作:

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 ...但没有其他正则表达式支持...。

正则表达式从@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上输入。Batch没有区分大小写的比较运算符,但确实具有不区分大小写的字符串替换,因此我可以为前四个字符分配一个临时字符,然后不区分大小写地替换java,这将导致空字符串。同时,我不区分大小写地替换了原始字符串中的javascript,这应该使其保持不变。



0

Perl,98 84 62字节

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

在线尝试!

多亏了bytepusher


欢迎光临本站!我不知道任何perl,但是看来您可以删除很多空白。另外,如果你正在寻找更多的方式来缩短,有一堆提示这里
DJMcMayhem

@DJMcMayhem谢谢,我认为可以更改整个逻辑以使其更短,但我还没有弄清楚
Burgan

1
只是一些提示(无需过多更改解决方案):您可以return $b;用just 代替$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}
精度

1
别忘了-当您有正则表达式忽略大小写开关时,不需要lc,再降低2 :) $_[0] =~//i||$_[0]!~//i。最后,为什么是变量?sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}应该做得很好:)。现在:perl会很不错,让您使用$ _ [0] w / o指定(尽管不使用!~):sub a{"car".(/javascript/i||!/^java/i?'pet':'')}-> 48 :)
bytepusher

0

Dart VM,104字节 102字节

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

说明

已脱胶:

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

我们有通常的主要功能

我们替换为pp[0].toLowerCase();这样就不必声明新变量了(var加上空格将额外增加4个字节)

然后,我们继续进行实际的打印

我们car无条件打印,并使用内联语句检查是否在pet其后打印。如果它在索引0处具有字符串'java'并且其中没有'javascript',则我们什么也不做(我们实际上附加了一个空字符串,但没有任何作用),否则我们附加pet


0

Rust,97个字节

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

我很确定有一个较短的解决方案,但这是我的第一次尝试:)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.