Java là JavaScript như Xe hơi là Thảm


36

Tiêu đề đánh cắp lấy cảm hứng từ câu trả lời Greg Hewgill của để sự khác biệt giữa JavaScript và Java là gì?

Giới thiệu

Java và JavaScript là các ngôn ngữ được sử dụng phổ biến trong số các lập trình viên và hiện là các thẻ phổ biến nhất trên Stack Overflow. Tuy nhiên, như chúng ta đều biết, ngoài những cái tên tương tự, cả hai gần như không có gì chung.

Để tôn vinh một trong những cuộc tranh luận khét tiếng nhất của lập trình và được truyền cảm hứng từ những thất vọng gần đây của tôi trong việc tìm kiếm thẻ , tôi đề xuất như sau:

Thử thách

Viết chương trình lấy một chuỗi làm đầu vào. Trả về carnếu chuỗi bắt đầu bằng "Java" và không bao gồm "JavaScript". Nếu không, trở lại carpet.

Ví dụ đầu vào và đầu ra

xe hơi:

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

thảm:

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

Ghi chú

  • Khớp đầu vào phải không phân biệt chữ hoa chữ thường
  • Chỉ các khả năng cho đầu ra nên carhoặccarpet
  • Điểm thưởng tưởng tượng nếu câu trả lời của bạn sử dụng Java, JavaScript hoặc Regex
  • Tiêu đề thay thế: Java là JavaScript vì ham là hamster

2
Thẻ phù hợp với mẫu mới cần wiki. Hãy đóng góp nếu bạn có thể
Christopher

2
Tùy thuộc vào thứ tự mọi thứ được thực hiện, javacarpetcó thể bắt lỗi mà các trường hợp thử nghiệm hiện tại không có.
Ray

17
Nếu bạn nhận được imaginary bonus points if your answer uses Java, Javascript, or Regex, điều đó có làm cho giải pháp phức tạp như vậy không? ;)
Steadybox

Alternate Title: Java is to JavaScript as ham is to hamsterThật ra, "ham" trong "hamster" nhận thức của thức ăn "ham". Thức ăn "ham" là thịt lợn, và thuật ngữ "hamster" có nguồn gốc từ động vật có liên quan, chuột lang, có thịt thay thế thịt lợn trong các chuyến đi biển dài vì động vật dễ nuôi hơn trên tàu.
dotancohen

Câu trả lời:


100

Đa giác Java / JavaScript, 108 107 106 byte

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

Chạy như Java

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

Hãy thử trực tuyến!

Lưu ý: không tin tưởng vào phần nổi bật vì nó không chính xác. Java thực, được giải thích chính xác trông giống như bên dưới bởi vì \u000Ađược diễn giải ở bước đầu tiên của quá trình biên dịch là \n, trên thực tế kết thúc nhận xét bắt đầu bằng nhận xét dòng ( //).

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

Chạy dưới dạng JavaScript

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

Tín dụng cho @CowsQuak cho phiên bản 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));

Có bao nhiêu điểm thưởng tưởng tượng cho câu trả lời này?

-1 byte nhờ @Nevay trong câu trả lời Java.


1
Điều này không cạnh tranh trong JavaScript hoặc Java. Tôi thậm chí không tin đó là một ứng cử viên nghiêm túc, đó là một yêu cầu cho tất cả các bài nộp.
Dennis

10
@Dennis Cảm ơn bạn đã thông tin của bạn. Tuy nhiên tôi coi đây là một mục polyglot. Có quy tắc nào chống lại các mục polyglot khi chúng không được yêu cầu rõ ràng không? Tôi đã cố gắng để chơi golf này càng nhiều càng tốt. Ví dụ, tôi đã cố gắng đặt cả hai biểu thức chính quy với nhau, nhưng tôi không thể nhận được bất cứ điều gì ngắn hơn thế này (vì hai biểu thức chính tương tự khác nhau và dấu phân cách của chúng). Cũng không thể có định nghĩa biến tương tự vì JavaScript không cho phép một dòng mới giữa a=>. Tôi đã cố gắng ở lại trong tinh thần chơi golf. Nếu tôi làm điều gì sai, xin vui lòng cho tôi biết?
Olivier Grégoire

24
@Dennis IMHO "Java / JavaScript polyglot" được tính là ngôn ngữ riêng của nó, trong trường hợp này rất cạnh tranh.
Sản phẩm ETH

1
@ OlivierGrégoire Tôi không nói rằng đây không phải là một bài nộp polyglot được đánh golf tốt, nhưng sẽ gây tranh cãi nếu có những bài nộp polyglot cho những thách thức không phải là polyglot ngay từ đầu. Họ đã đưa ra như một phần của các ứng cử viên nghiêm túc có thể làm nhiều hơn những thách thức yêu cầu? thảo luận, nhưng tôi không nghĩ có sự đồng thuận rõ ràng về chủ đề cụ thể này. Cá nhân, tôi không ủng hộ.
Dennis

3
@Dennis Cảm ơn bạn đã hiểu biết của bạn, bây giờ tôi hiểu ý của bạn. Theo bạn, câu trả lời này có nên được gắn thẻ là "không cạnh tranh" không? Mặt khác, trong khi tôi không nói cho tất cả các câu trả lời polyglot (đây là lần đầu tiên của tôi), thì câu hỏi này có ý nghĩa đặc biệt là thử thách nói về cả Java và JavaScript và "điểm thưởng tưởng tượng" đã được trao một cách rõ ràng cho các câu trả lời Java, JavaScript và regex trước khi tôi viết câu trả lời này. Java và regex có thể được kết hợp, JavaScript và regex có thể được kết hợp, tại sao không kết hợp tất cả lại với nhau? Dù sao, tôi không ngại đánh dấu điều này là không cạnh tranh.
Olivier Grégoire

17

JavaScript, 50 49 byte

Đã lưu 1 byte nhờ @ValueInk bằng cách sắp xếp lại regex

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

Kiểm tra đoạn

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


Tôi sẽ đánh cắp regex của bạn nhưng điều đó sẽ khiến câu trả lời của tôi dài hơn: mặc dù câu trả lời hay
HyperNeutrino

Bây giờ chúng ta chỉ cần một câu trả lời java.
DJMcMayhem

Chúng tôi có một câu trả lời Java, nhưng ... tôi đã đến với regex gần như tương tự ...
Olivier Grégoire

cách khác:/^java(?!script)/i
Andrea

1
@ OlivierGrégoire ah, chết tiệt, cái đó có vẻ không công bằng
Andrea


11

C (chỉ gọi đặt), 131 byte

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

Nó có vấn đề của nó, nhưng nó vượt qua tất cả các testcase được cung cấp :)

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

Điểm thưởng tưởng tượng nếu câu trả lời của bạn sử dụng Java, Javascript hoặc Regex

tốt ... không, cảm ơn



8

Python 2 , 68 byte

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

Hãy thử trực tuyến!

-11 byte nhờ notjagan
-2 byte nhờ Dennis




@Justin Điều đó cũng vậy. Tốt đẹp.
HyperNeutrino

Nếu bạn chuyển sang Python 2, bạn có thể lưu 2 byte với một chương trình đầy đủ.
Dennis

1
@LukeSawczak Ồ tôi thậm chí không nhận ra rằng: PI đã sử dụng Java ngay trước đó và trong Java ;là bắt buộc nên tôi phải sử dụng dù sao dòng mới là không cần thiết: P Đó là lý do tại sao tôi sử dụng nó.
HyperNeutrino

4

C #, 80 78 byte

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

1
Tôi nghĩ ngôn ngữ dễ đọc nhất ở đây là C #
sepehr

2
@sepehr Ý bạn là bạn thấy sắc nét với C #. (Tôi có nhận được tiền thưởng cho những bình luận ngu ngốc không)
Ray

4

EXCEL Google Sheets, 89 86 byte

Đã lưu 3 byte nhờ Taylor Scott

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

Đưa đầu vào vào A1

Giải trình

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

Tôi tin rằng bạn có thể thay thế Searches bằng Finds cho -2 byte và điều đó có thể được dịch sang công thức google sheet cho -3 byte bằng cách không đóng ba parens cuối cùng
Taylor Scott

1
Tìm là trường hợp nhạy cảm, tìm kiếm là trường hợp không nhạy cảm. Nhưng 3 byte cuối cùng là một ý tưởng tốt!
Đánh dấu

Tại sao việc hoán đổi từ Excel sang Google Sheets?
Stevoisiak

2
Loại bỏ 3 parens cuối cùng tiết kiệm 3 byte. Excel sẽ chỉ đưa ra một lỗi và đưa chúng vào cho bạn dù sao đi nữa.
Đánh dấu

3

vim, 58 byte

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

Hãy thử trực tuyến!


Tôi nghĩ rằng việc sử dụng glệnh có thể ngắn hơn một chút, đại loại như thế :g/\cjavascript/d :g!/^\cjava/d icarpet␛:s/pet..*.
Neil




3

Lisp thông thường, 131 125 byte

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

Hãy thử trực tuyến!

Kích thước giảm nhờ # n = Thủ thuật lừa đảo của Lisp thông thường.

Giải trình

(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 byte

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

Hãy thử trực tuyến!

Chưa được kiểm soát:

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 byte

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

1

VBA Excel, 76 byte

Chức năng cửa sổ tức thời VBE ẩn danh nhận đầu vào từ phạm vi [A1]và đầu ra là car/ carpettrạng thái cho cửa sổ ngay lập tức VBE

Không sử dụng RegExp

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

1
Sử dụng tốt đẹp của vba! Tôi nghĩ rằng một macro sẽ ngắn hơn. Bây giờ tôi có bằng chứng.
Đánh dấu

1

Python 3 , 95 byte

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

Hãy thử trực tuyến!

Vâng, nó có thể ngắn hơn nhưng tôi muốn thử sử dụng lambda lồng nhau!


Luôn luôn tốt để thử nghiệm :) Lưu ý rằng bạn có thể tiết kiệm byte xung quanh các nhà khai thác thích and, or, if,else
Luke Sawczak

1

Perl , 42 byte

Tôi tin rằng câu trả lời của stevieb có đầu ra không chính xác (bản thân tôi đã thử - nó trả lại xe cho 'javajavascript'). Điều này sẽ làm việc:

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

0

Toán học, 82 byte

regex

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

0

JAISBaL , 36 byte

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

Verbose / giải thích:

# \# 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 #\

J. -regex ... nhưng không hỗ trợ regex nào khác .... vì lý do.

Regex bị đánh cắp mượn từ câu trả lời của @Cows Quack .



0

Perl , 36 byte

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

Chạy nó như vậy:

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

0

Mẻ, 91 byte

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

Đưa đầu vào vào STDIN. Batch không có toán tử so sánh không phân biệt chữ hoa chữ thường nhưng nó có sự thay thế chuỗi không phân biệt chữ hoa chữ thường để tôi có thể gán tạm thời cho bốn ký tự đầu tiên và sau đó trường hợp không thay thế java, do đó sẽ dẫn đến chuỗi trống. Trong khi đó, trường hợp tôi vô cảm thay thế javascript trong chuỗi gốc, nên giữ nguyên nó.



0

Perl, 98 84 62 byte

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

Hãy thử trực tuyến!

Cảm ơn


Chào mừng đến với trang web! Tôi không biết bất kỳ perl nào, nhưng có vẻ như có rất nhiều khoảng trắng bạn có thể xóa. Ngoài ra, nếu bạn đang tìm kiếm nhiều cách để rút ngắn nó, có rất nhiều lời khuyên ở đây .
DJMcMayhem

@DJMcMayhem Cảm ơn bạn, tôi nghĩ rằng toàn bộ logic có thể được thay đổi để làm cho nó thậm chí ngắn hơn, nhưng tôi đã không tìm ra nó
Burgan

1
Chỉ cần một số gợi ý (không thay đổi giải pháp của bạn quá nhiều): Bạn có thể thay thế return $b;bằng chỉ $b;. Perl luôn trả về câu lệnh được đánh giá cuối cùng. Vì chúng tôi không quan tâm đến các cảnh báo, bạn thậm chí có thể bỏ ';' để $b}. Bạn không cần dấu ngoặc quanh if. Nếu bạn sử dụng ||thay vì or, bạn có thể lưu một khoảng trắng sau biểu thức chính quy.
bytepizer

1
Bạn cũng có thể xóa () xung quanh lc đầu tiên, nhưng cần một khoảng trắng sau nếu sau đó. Nếu bạn sử dụng !~thay vì ! =~điều kiện thứ hai có thể lc$_[0]!~. `-> sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}. Sử dụng ops ternary mang nó xuống một lần nữasub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}
bytepizer

1
Đừng quên - không cần lc khi bạn có regex bỏ qua trường hợp chuyển đổi, xuống 2 khác :) $_[0] =~//i||$_[0]!~//i. Và cuối cùng, tại sao một biến? sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}nên làm tốt :). Và bây giờ: perl sẽ tốt và cho phép bạn sử dụng $ _ [0] w / o chỉ định nó (mặc dù không phải với !~): sub a{"car".(/javascript/i||!/^java/i?'pet':'')}-> 48 :)
bytepizer

0

Phi tiêu VM, 104 byte 102 byte

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

Giải thích :

Bị thoái hóa:

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

Chúng tôi có chức năng chính thông thường của chúng tôi

Chúng tôi thay thế pbằng p[0].toLowerCase();để chúng tôi không phải khai báo một biến mới (var cộng với một khoảng trắng sẽ có thêm 4 byte)

Sau đó chúng tôi tiến hành in ấn thực tế

Chúng tôi in carvô điều kiện và chúng tôi sử dụng các câu lệnh nội tuyến để kiểm tra xem có nên in petsau nó hay không. Nếu nó có chuỗi 'java' ở chỉ số 0 và không có 'javascript', chúng tôi không làm gì cả (chúng tôi thực sự nối thêm một chuỗi trống nhưng nó không có tác dụng gì) và nếu không chúng tôi sẽ nối thêm pet.


0

Rust, 97 byte

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

Tôi khá chắc chắn rằng có một giải pháp ngắn hơn nhưng đó là lần thử đầu tiên của tôi :)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.