Java untuk JavaScript seperti halnya Car untuk Carpet


36

Judul dicuri terinspirasi oleh jawaban Greg Hewgill untuk Apa perbedaan antara JavaScript dan Java?

pengantar

Java dan JavaScript adalah bahasa yang umum digunakan di kalangan programmer, dan saat ini merupakan tag paling populer di Stack Overflow. Namun seperti yang kita semua tahu, selain dari nama yang mirip, keduanya hampir tidak memiliki kesamaan.

Untuk menghormati salah satu perdebatan pemrograman yang paling terkenal, dan terinspirasi oleh frustrasi saya baru-baru ini dalam pencarian tag , saya mengusulkan yang berikut:

Tantangan

Tulis program yang menggunakan string sebagai input. Kembali carjika string dimulai dengan "Java" dan tidak termasuk "JavaScript". Kalau tidak, kembalilah carpet.

Contoh Input dan Output

mobil:

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

karpet:

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

Catatan

  • Pencocokan input harus peka huruf besar kecil
  • Hanya kemungkinan untuk output yang seharusnya carataucarpet
  • Poin bonus imajiner jika jawaban Anda menggunakan Java, JavaScript, atau Regex
  • Judul Alternatif: Java adalah JavaScript, ham juga untuk hamster

2
Tag pencocokan pola yang baru membutuhkan wiki. Silakan berkontribusi jika Anda bisa
Christopher

2
Bergantung pada urutan penyelesaiannya, javacarpetmungkin akan menemukan bug yang tidak dimiliki oleh test case yang ada.
Ray

17
Jika Anda mendapatkan imaginary bonus points if your answer uses Java, Javascript, or Regex, apakah itu membuat bytecount solusi seperti itu kompleks? ;)
Steadybox

Alternate Title: Java is to JavaScript as ham is to hamsterSebenarnya, "ham" di "hamster" adalah serumpun untuk makanan "ham". Makanan "ham" adalah daging babi, dan istilah "hamster" berasal dari hewan yang terkait, babi guinea, yang dagingnya menggantikan daging babi pada perjalanan laut yang panjang karena hewan lebih mudah dipelihara di atas kapal.
dotancohen

Jawaban:


100

Java / JavaScript Polyglot, 108 107 106 byte

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

Jalankan sebagai Java

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

Cobalah online!

Catatan: jangan percayai highlight karena itu salah. Java asli, yang ditafsirkan dengan benar seperti di bawah ini karena \u000Aditafsirkan dalam langkah pertama kompilasi sebagai \n, secara de facto mengakhiri komentar yang dimulai dengan komentar baris ( //).

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

Jalankan sebagai JavaScript

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

Kredit ke @CowsQuak untuk versi 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));

Berapa banyak bonus poin imajiner untuk jawaban ini?

-1 byte terima kasih kepada @Nevay dalam jawaban Java.


1
Ini tidak kompetitif di JavaScript atau Java. Saya bahkan tidak yakin itu adalah pesaing serius, yang merupakan persyaratan untuk semua pengiriman.
Dennis

10
@ Dennis Terima kasih atas informasi Anda. Namun saya menganggap ini sebagai entri polyglot. Apakah ada aturan terhadap entri polyglot ketika mereka tidak secara eksplisit diminta? Saya mencoba bermain golf ini sebanyak mungkin. Misalnya, saya mencoba menyatukan kedua regex, tetapi saya tidak bisa mendapatkan yang lebih pendek dari ini (karena dua regex yang berbeda walaupun sama, dan pembatasnya). Juga tidak mungkin memiliki definisi variabel yang sama karena JavaScript tidak mengizinkan baris baru antara adan =>. Saya berusaha tetap semangat bermain golf. Jika saya melakukan sesuatu yang salah, tolong beri tahu saya?
Olivier Grégoire

24
@Dennis IMHO "Java / JavaScript polyglot" dianggap sebagai bahasanya sendiri, dalam hal ini sangat kompetitif.
ETHproductions

1
@ OlivierGrégoire Saya tidak mengatakan ini bukan pengiriman polyglot yang golf, tapi masih bisa diperdebatkan jika harus ada pengiriman polyglot ke tantangan non-polyglot di tempat pertama. Mereka muncul sebagai bagian dari Dapatkah pesaing yang serius melakukan lebih dari yang diminta tantangan? diskusi, tapi saya tidak berpikir ada konsensus yang jelas tentang topik khusus ini. Secara pribadi, saya tidak mendukung.
Dennis

3
@ Dennis Terima kasih atas wawasan Anda, saya sekarang mengerti apa yang Anda maksud. Haruskah jawaban ini ditandai sebagai "tidak kompetitif", menurut Anda? Di sisi lain, walaupun saya tidak berbicara untuk semua jawaban polyglot (ini adalah yang pertama bagi saya), pertanyaan ini memiliki arti khusus bahwa tantangan berbicara tentang Java dan JavaScript, dan bahwa "poin bonus imajiner" secara eksplisit diberikan untuk Java, JavaScript dan regex jawaban sebelum saya menulis jawaban ini. Java dan regex dapat digabungkan, JavaScript dan regex dapat digabungkan, mengapa tidak semuanya? Bagaimanapun, saya tidak keberatan menandainya sebagai tidak kompetitif.
Olivier Grégoire

17

JavaScript, 50 49 byte

Disimpan 1 byte berkat @ValueInk dengan mengatur ulang regex

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

Cuplikan tes

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


Saya akan mencuri regex Anda tapi itu akan membuat jawaban saya lebih lama: o jawaban yang bagus
HyperNeutrino

Sekarang kita hanya perlu jawaban java.
DJMcMayhem

Kami punya jawaban Java, tapi ... Saya datang ke regex yang kira-kira sama ...
Olivier Grégoire

sebagai alternatif:/^java(?!script)/i
Andrea

1
@ OlivierGrégoire ah, sial, yang itu sepertinya tidak adil
Andrea


11

C (hanya panggilan menempatkan), 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);}

Itu memang memiliki masalah, tetapi melewati semua testcases yang disediakan :)

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

Poin bonus imajiner jika jawaban Anda menggunakan Java, Javascript, atau Regex

baik ... tidak, terima kasih



8

Python 2 , 68 byte

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

Cobalah online!

-11 byte terima kasih kepada notjagan
-2 byte terima kasih untuk Dennis




@Justin Itu juga. Bagus.
HyperNeutrino

Jika Anda beralih ke Python 2, Anda dapat menyimpan 2 byte dengan program lengkap.
Dennis

1
@LukeSawczak Oh saya bahkan tidak menyadari bahwa: PI menggunakan Java sebelum itu dan di Jawa ;diperlukan jadi saya karena saya harus menggunakannya toh baris baru tidak perlu: P Itu sebabnya saya menggunakannya.
HyperNeutrino

4

C #, 80 78 byte

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

1
Saya pikir bahasa yang paling mudah dibaca di sini adalah C #
sepehr

2
@sepehr Maksud Anda, Anda melihat tajam dengan C #. (Apakah saya mendapat bonus untuk komentar bodoh)
Ray

4

UNGGUL Google Sheets, 89 86 Bytes

Disimpan 3 byte berkat Taylor Scott

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

Mengambil input pada A1

Penjelasan

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

Saya percaya bahwa Anda dapat mengganti Searches dengan Finds untuk -2 byte dan yang dapat diterjemahkan lebih lanjut ke rumus lembar google untuk -3 byte dengan tidak menutup tiga parens terakhir
Taylor Scott

1
Temukan sensitif huruf besar, cari tidak sensitif huruf besar kecil. Tapi 3 byte terakhir itu ide yang bagus!
Markus

Mengapa swap dari Excel ke Google Sheets?
Stevoisiak

2
Menghapus 3 parens terakhir menghemat 3 byte. Excel hanya akan melempar kesalahan dan memasukkannya untuk Anda.
Markus

3

vim, 58 byte

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

Cobalah online!


Saya pikir menggunakan gperintah mungkin sedikit lebih pendek, kira-kira seperti :g/\cjavascript/d :g!/^\cjava/d icarpet␛:s/pet..*.
Neil




3

Common Lisp, 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#))))

Cobalah online!

Ukuran berkurang berkat # n = "trik" Common Lisp.

Penjelasan

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

Cobalah online!

Belum dibuka:

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

Excel VBA, 76 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari jangkauan [A1]dan keluaran adalah car/carpet status ke jendela langsung VBE

Tidak menggunakan RegExp

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

1
Penggunaan vba yang bagus! Saya pikir makro akan lebih pendek. Sekarang saya punya bukti.
Markus

1

Python 3 , 95 byte

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

Cobalah online!

Ya, itu bisa lebih pendek tapi saya ingin mencoba menggunakan lambda bersarang!


Selalu baik untuk bereksperimen :) Catatan bahwa Anda dapat menyimpan byte sekitar operator seperti and, or, if,else
Lukas Sawczak

1

Perl , 42 byte

Saya percaya jawaban oleh stevieb memiliki output yang salah (mencoba sendiri - ia mengembalikan mobil untuk 'javajavascript'). Ini seharusnya bekerja:

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

0

Mathematica, 82 byte

regex

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

0

JAISBaL , 36 byte

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

Verbose / penjelasan:

# \# 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 adalah upaya pertama saya dalam mendesain bahasa golf, jadi ini agak aneh ... tidak ada yang cocok atau mengandung, regex atau sebaliknya, jadi alih-alih kita harus membelah dan memeriksa panjang array yang dihasilkan ... karena JAISBaL memiliki split-by -regex ... tetapi tidak ada dukungan regex lainnya .... karena alasan.

Regex dicuri dipinjam dari jawaban @Cows Quack .


0

Python 2 , 69 byte

f=input().lower().find
print'car'+'pet'*(f('java')!=~f('javascript'))

Saat ini 1 byte lebih lama dari solusi Python 2 terpendek.

Cobalah online!


0

Perl , 36 byte

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

Jalankan seperti itu:

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

0

Batch, 91 byte

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

Mengambil input pada STDIN. Batch tidak memiliki operator perbandingan yang tidak peka huruf besar kecil tetapi ia memiliki penggantian string yang tidak peka huruf besar kecil sehingga saya dapat menetapkan sementara untuk empat karakter pertama dan kemudian huruf besar-kecil mengganti java, yang kemudian akan menghasilkan string kosong. Sementara itu saya huruf javascript menggantikan tidak sensitif dalam string asli, yang seharusnya tidak berubah.



0

Perl, 98 84 62 Bytes

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

Cobalah online!

Terima kasih kepada bytepusher


Selamat datang di situs ini! Saya tidak tahu perl, tapi sepertinya ada banyak ruang kosong yang bisa Anda hapus. Juga, jika Anda mencari lebih banyak cara untuk mempersingkat, ada banyak tips di sini .
DJMcMayhem

@DJMcMayhem Terima kasih, saya pikir seluruh logikanya dapat diubah untuk membuatnya lebih pendek, tapi saya belum menemukan
jawabannya

1
Hanya beberapa petunjuk (tanpa mengubah solusi Anda terlalu banyak): Anda dapat menggantinya return $b;dengan adil $b;. Perl selalu mengembalikan pernyataan yang terakhir dievaluasi. Karena kami tidak peduli dengan peringatan, Anda bahkan dapat menghapus ';' untuk $b}. Anda tidak perlu tanda kurung di sekitar if. Jika Anda menggunakan ||alih-alih or, Anda bisa menyimpan spasi putih setelah regex.
bytepusher

1
Anda juga dapat menghapus () di sekitar lc pertama, tetapi membutuhkan spasi setelah jika kemudian. Jika Anda menggunakan !~bukannya ! =~kondisi kedua bisa lc$_[0]!~. `-> sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}. Menggunakan ops ternary membawanya turun satu lagisub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}
bytepusher

1
Tidak lupa - tidak perlu untuk lc ketika Anda memiliki regex abaikan case switch, turun 2 :) $_[0] =~//i||$_[0]!~//i. Dan akhirnya, mengapa variabel? sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}harus baik-baik saja :). Dan sekarang: perl akan menyenangkan dan membiarkan Anda menggunakan $ _ [0] tanpa menentukannya (meskipun tidak dengan !~): sub a{"car".(/javascript/i||!/^java/i?'pet':'')}-> 48 :)
bytepusher

0

Dart VM, 104 byte, 102 byte

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

Penjelasan :

Diturunkan:

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

Kami memiliki fungsi utama kami yang biasa

Kami ganti pdengan p[0].toLowerCase();sehingga kami tidak perlu mendeklarasikan variabel baru (var ditambah spasi akan menjadi 4 byte tambahan)

Kami kemudian melanjutkan untuk melakukan pencetakan yang sebenarnya

Kami mencetak cartanpa syarat dan kami menggunakan inline statement untuk memeriksa apakah akan mencetak petsetelahnya atau tidak. Jika memiliki string 'java' pada indeks 0 dan tidak memiliki 'javascript' di dalamnya, kami tidak melakukan apa-apa (kami sebenarnya menambahkan string kosong tetapi tidak memiliki efek apa pun) dan jika tidak kami tambahkan pet.


0

Karat, 97 byte

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

Saya cukup yakin bahwa ada solusi yang lebih pendek tetapi ini adalah percobaan pertama saya :)


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.