Java ใช้จาวาสคริปต์เหมือนกับรถยนต์


36

ชื่อที่ถูกขโมยซึ่งได้แรงบันดาลใจจากคำตอบของ Greg 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
แท็กการจับคู่รูปแบบใหม่ต้องการวิกิ โปรดสนับสนุนหากคุณสามารถ
Christopher

2
ทั้งนี้ขึ้นอยู่กับการสั่งซื้อที่ทำเสร็จแล้วjavacarpetอาจจับข้อบกพร่องที่กรณีทดสอบที่มีอยู่ไม่ได้
Ray

17
ถ้าคุณได้รับimaginary bonus points if your answer uses Java, Javascript, or Regexนั่นจะทำให้ระบบ bytecount ซับซ้อนหรือไม่ ;)
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จริงสิ้นสุดความคิดเห็นที่เริ่มต้นด้วยความคิดเห็นบรรทัด ( //)

//
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 ฉันไม่มั่นใจด้วยซ้ำว่าเป็นคู่แข่งที่ร้ายแรงซึ่งเป็นข้อกำหนดสำหรับการส่งทั้งหมด
Dennis

10
@Dennis ขอขอบคุณสำหรับข้อมูลของคุณ อย่างไรก็ตามฉันคิดว่านี่เป็นรายการที่พูดได้หลายภาษา มีกฎใด ๆ ที่เกี่ยวข้องกับรายการหลายภาษาเมื่อไม่มีการร้องขออย่างชัดเจนหรือไม่? ฉันพยายามเล่นกอล์ฟให้มากที่สุด ตัวอย่างเช่นฉันพยายามรวม regexes ทั้งสองไว้ด้วยกัน แต่ฉันไม่สามารถทำให้อะไรสั้นลงไปกว่านี้ได้ (เพราะทั้งสอง regexes ที่แตกต่างกันทั้งที่คล้ายกันและตัวคั่นของพวกเขา) นอกจากนี้ยังเป็นไปไม่ได้ที่จะมีการนิยามตัวแปรเดียวเพราะ JavaScript ไม่อนุญาตให้มีการขึ้นบรรทัดใหม่ระหว่างและa =>ฉันพยายามอยู่ในจิตวิญญาณของการเล่นกอล์ฟ ถ้าฉันทำอะไรผิดกรุณาบอกฉันที
Olivier Grégoire

24
@Dennis IMHO "Java / JavaScript polyglot" นับเป็นภาษาของตนเองซึ่งในกรณีนี้การแข่งขันสูงมาก
ETHproductions

1
@ OlivierGrégoireฉันไม่ได้บอกว่านี่ไม่ใช่การโพลีกลอตที่มีชื่อเสียง แต่มันก็เป็นที่ถกเถียงกันอยู่ว่าควรจะมีการส่งโพลีกลอตในความท้าทายที่ไม่ใช่โพลิกล็อตตั้งแต่แรก พวกเขามาเป็นส่วนหนึ่งของการแข่งขันที่จริงจังสามารถทำได้มากกว่าความท้าทายที่ขอ? การอภิปราย แต่ฉันไม่คิดว่าจะมีฉันทามติที่ชัดเจนในหัวข้อนี้โดยเฉพาะ โดยส่วนตัวฉันไม่ชอบ
Dennis

3
@Dennis ขอขอบคุณสำหรับความเข้าใจที่ลึกซึ้งตอนนี้ฉันเข้าใจแล้วว่าคุณหมายถึงอะไร คำตอบนี้ควรติดแท็กเป็น "ไม่แข่งขัน" ตามที่คุณ? ในขณะที่ฉันไม่ได้พูดคำตอบที่พูดได้หลายภาษาทั้งหมด (นี่เป็นครั้งแรกของฉัน) สิ่งนี้มีความหมายพิเศษที่ความท้าทายพูดเกี่ยวกับทั้ง Java และ JavaScript และ "คะแนนโบนัสจินตนาการ" ได้รับรางวัลอย่างชัดเจน สำหรับ Java, JavaScript และคำตอบ regex ก่อนที่ฉันจะเขียนคำตอบนี้ Java และ regex สามารถรวมกันได้ JavaScript และ regex สามารถรวมกันได้ทำไมไม่รวมกัน? อย่างไรก็ตามฉันไม่รังเกียจที่จะทำเครื่องหมายว่าไม่สามารถแข่งขันได้
Olivier Grégoire

17

JavaScript, 50 49 ไบต์

บันทึก 1 ไบต์ขอบคุณ @ValueInk โดยจัดเรียง regex ใหม่

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


ฉันกำลังจะไปขโมย regex ของคุณ แต่ที่จะได้ทำคำตอบของฉันอีกต่อไป: o คำตอบที่ดีแม้ว่า
HyperNeutrino

ตอนนี้เราต้องการคำตอบจาวา
DJMcMayhem

เรามีคำตอบ Java แต่ ... ฉันมาถึง regex เดียวกันประมาณ ...
โอลิเวียGrégoire

อีกทางเลือกหนึ่ง:/^java(?!script)/i
Andrea

1
@ OlivierGrégoireอ่าห่านั่นดูเหมือนว่าไม่ยุติธรรม
Andrea

15

Java (OpenJDK 8) , 92 82 72 58 57 ไบต์

s->s.matches("(?i)(?!.*javascript)java.*")?"car":"carpet"

ลองออนไลน์!

บันทึก 1 ไบต์ขอบคุณ@Nevay !


1
คุณสามารถละเว้นเครื่องหมายรูปหมวกขณะที่ String # จับคู่พยายามที่จะจับคู่สายอักขระทั้งหมด
Nevay

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


11 ไบต์สั้น
notjagan


@ จัสตินนั่นก็เช่นกัน ดี
HyperNeutrino

หากคุณเปลี่ยนไปใช้ Python 2 คุณสามารถบันทึก 2 ไบต์ด้วยโปรแกรมเต็มรูปแบบ
Dennis

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 ไบต์ขอบคุณ Taylor Scott

=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 ไบต์โดยไม่ปิด parens สามครั้งล่าสุด
Taylor Scott

1
การค้นหาจะพิจารณาตัวพิมพ์เล็กและใหญ่ แต่ 3 ไบต์สุดท้ายนั้นเป็นความคิดที่ดี!
Mark

ทำไมการแลกเปลี่ยนจาก Excel เป็น Google ชีต
Stevoisiak

2
การลบ 3 parens ล่าสุดจะบันทึก 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 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 มีเอาต์พุตที่ไม่ถูกต้อง (ลองด้วยตัวเอง - ส่งคืนรถยนต์สำหรับ 'javajavascript') สิ่งนี้น่าจะใช้ได้:

say/^java/i&&!/javascript/i?'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 เป็นความพยายามครั้งแรกของฉันในการออกแบบภาษากอล์ฟดังนั้นจึงค่อนข้างแปลก ... ไม่มีการแข่งขันหรือมี regex หรืออย่างอื่นดังนั้นเราจึงต้องแยกและตรวจสอบความยาวอาร์เรย์ที่เกิดขึ้น ... เพราะ JAISBaL มีการแบ่งโดย -regex ... แต่ไม่มี regex อื่นรองรับ .... เพราะเหตุผล

regex ถูกขโมยที่ยืมมาจากคำตอบ @Cows กำมะลอของ




0

แบตช์ 91 ไบต์

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

ใช้อินพุตบน STDIN แบทช์ไม่มีตัวดำเนินการเปรียบเทียบแบบไม่คำนึงถึงขนาดตัวพิมพ์ แต่มีการแทนที่สตริงแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ดังนั้นฉันจึงสามารถกำหนดชั่วคราวให้กับอักขระสี่ตัวแรกจากนั้นตัวพิมพ์เล็กและใหญ่จะแทนจาวา ในขณะที่ฉันกรณีแทนจาวาสคริปต์ในสตริงเดิมซึ่งควรปล่อยไว้ไม่เปลี่ยนแปลง



0

Perl, 98 84 62 ไบต์

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

ลองออนไลน์!

ขอบคุณ bytepusher


ยินดีต้อนรับสู่เว็บไซต์! ฉันไม่ทราบ Perl แต่ดูเหมือนว่ามีช่องว่างมากมายที่คุณสามารถลบออกได้ นอกจากนี้หากคุณกำลังมองหาวิธีที่จะย่อให้สั้นลงมีเคล็ดลับมากมายที่นี่
DJMcMayhem

@DJMcMayhem ขอขอบคุณฉันคิดว่าตรรกะทั้งหมดสามารถเปลี่ยนแปลงได้เพื่อให้สั้นลง แต่ฉันไม่ได้หาคำตอบ
Burgan

1
เพียงแค่คำแนะนำบางอย่าง (โดยไม่ต้องเปลี่ยนวิธีการแก้ปัญหาของคุณมากเกินไป): คุณสามารถแทนที่มีเพียงreturn $b; $b;Perl จะส่งคืนคำสั่งที่ประเมินล่าสุดเสมอ เนื่องจากเราไม่สนใจคำเตือนคุณสามารถวางเครื่องหมาย ';' $b}ไปยัง คุณไม่จำเป็นต้องใช้วงเล็บถ้า หากคุณใช้||แทนคุณorสามารถบันทึกช่องว่างหลังจาก regex
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}
openary

1
ไม่ลืม - ไม่จำเป็นต้องสำหรับ LC ไม่มีเมื่อคุณมี regex ไม่สนใจสวิทช์กรณีลดลงอีก 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

Dart VM, 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หลังจากนั้นหรือไม่ หากมีสตริงจาวา 'ที่ดัชนี 0 และไม่ได้มี 'JavaScript' ในนั้นเราไม่ทำอะไรเลย (เราจริงผนวกสตริงที่ว่างเปล่า แต่มันไม่ได้มีผลกระทบใด ๆ ) petและมิฉะนั้นเราผนวก


0

สนิม 97 ไบต์

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

ฉันค่อนข้างแน่ใจว่ามีวิธีแก้ปัญหาที่สั้นกว่า แต่นี่เป็นครั้งแรกที่ฉันลอง :)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.