Java é para JavaScript como Car é para Carpet


36

Título roubado inspirado na resposta de Greg Hewgill para Qual é a diferença entre JavaScript e Java?

Introdução

Java e JavaScript são linguagens comumente usadas entre programadores e atualmente são as tags mais populares no Stack Overflow. No entanto, como todos sabemos, além de nomes semelhantes, os dois não têm quase nada em comum.

Em homenagem a um dos debates mais infames da programação, e inspirado pelas minhas recentes frustrações na busca de tags , proponho o seguinte:

Desafio

Escreva um programa que aceite uma string como entrada. Retorne carse a sequência começar com "Java" e não incluir "JavaScript". Caso contrário, retorne carpet.

Exemplo de entrada e saída

carro:

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

tapete:

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

Notas

  • A correspondência de entrada não diferencia maiúsculas de minúsculas
  • Somente as possibilidades de saída devem ser caroucarpet
  • Pontos de bônus imaginários se sua resposta usar Java, JavaScript ou Regex
  • Título alternativo: Java é para JavaScript como ham é para hamster

2
A nova tag de correspondência de padrões precisa de um wiki. Por favor, colabore, se puder
Christopher

2
Dependendo da ordem em que as coisas são feitas, javacarpetpode haver erros que os casos de teste existentes não conseguem.
Raio

17
Se você conseguir imaginary bonus points if your answer uses Java, Javascript, or Regex, isso torna complexo o bytecount dessa solução? ;)
Steadybox

Alternate Title: Java is to JavaScript as ham is to hamsterNa verdade, o "presunto" no "hamster" é conhecido pelo alimento "presunto". O alimento "presunto" é carne de porco, e o termo "hamster" é derivado do animal relacionado, o porquinho-da-índia, cuja carne substituiu a carne de porco em longas viagens marítimas, pois era mais fácil criar animais em um navio.
dotancohen

Respostas:


100

Poliglota Java / JavaScript, 108 107 106 bytes

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

Executar como Java

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

Experimente online!

Nota: não confie no destaque, pois está incorreto. O Java real, corretamente interpretado, se parece com o abaixo, porque \u000Aé interpretado na primeira etapa da compilação como \n, de fato, encerrando o comentário iniciado com a linha comment ( //).

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

Executar como JavaScript

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

Créditos para @CowsQuak para a versão 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));

Quantos pontos de bônus imaginários para esta resposta?

-1 byte graças a @Nevay na resposta Java.


11
Isso não é competitivo em JavaScript ou Java. Nem estou convencido de que seja um candidato sério, que é um requisito para todos os envios.
Dennis

10
@ Dennis Obrigado por suas informações. No entanto, considero isso uma entrada poliglota. Existe alguma regra contra entradas poliglotas quando elas não são solicitadas explicitamente? Tentei jogar golfe o máximo possível. Por exemplo, tentei juntar as duas expressões regulares, mas não consegui nada mais curto que isso (por causa das duas expressões diferentes, embora semelhantes, e do delimitador). Também é impossível ter a mesma definição de variável porque o JavaScript não permite uma nova linha entre ae =>. Eu tentei ficar no espírito do golfe. Se eu fiz algo errado, por favor me diga?
Olivier Grégoire

24
@Dennis IMHO "Poliglota Java / JavaScript" conta como sua própria linguagem; nesse caso, isso é muito competitivo.
ETHproductions

11
@ OlivierGrégoire Eu não estou dizendo que isso não é uma submissão poliglota muito bem-sucedida, mas é discutível se deve haver submissões poliglotas para desafios que não sejam poliglotas em primeiro lugar. Eles surgiram como parte dos desafios sérios para os competidores, mais do que o desafio exige? discussão, mas acho que não há um consenso claro sobre esse tópico em particular. Pessoalmente, não sou a favor.
Dennis

3
@ Dennis Obrigado por suas idéias, agora entendo o que você quis dizer. Esta resposta deve ser marcada como "não competitiva", de acordo com você? Por outro lado, enquanto não estou falando de todas as respostas poliglotas (esta é a minha primeira vez), esta tem o significado especial de que o desafio fala sobre Java e JavaScript e que os "pontos de bônus imaginários" foram concedidos explicitamente para respostas Java, JavaScript e regex antes de escrever essa resposta. Java e regex podem ser combinados, JavaScript e regex podem ser combinados, por que não todos juntos? De qualquer forma, não me importo de marcar isso como não competitivo.
Olivier Grégoire

17

JavaScript, 50 49 bytes

Economize 1 byte graças a @ValueInk reorganizando a regex

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

Snippet de teste

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


Eu estava indo para roubar sua regex, mas que teria feito a minha resposta mais longa: o resposta agradável embora
HyperNeutrino

Agora só precisamos de uma resposta java.
DJMcMayhem

Temos uma resposta Java, mas ... Eu vim para os cerca mesma regex ...
Olivier Grégoire

alternativamente:/^java(?!script)/i
Andrea

11
@ OlivierGrégoire ah, droga, isso parece injusto #
Andrea


11

C (apenas chamadas a serem colocadas), 131 bytes

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

Ele tem seus problemas, mas passa em todos os casos de teste fornecidos :)

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

Pontos de bônus imaginários se sua resposta usar Java, Javascript ou Regex

bem ... não, obrigado



8

Python 2 , 68 bytes

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

Experimente online!

-11 bytes graças a notjagan
-2 bytes graças a Dennis




@ Justin Isso também. Agradável.
HyperNeutrino

Se você mudar para Python 2, poderá salvar 2 bytes com um programa completo.
Dennis

11
@LukeSawczak Ah, eu nem percebi isso: o PI estava usando Java antes disso e em Java ;é necessário, então, como eu tenho que usá-lo de qualquer maneira, a nova linha é desnecessária: P É por isso que o usei.
HyperNeutrino

4

C #, 80 78 bytes

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

11
Eu acho que a língua mais legível aqui é C #
sepehr

2
@sepehr Você quer dizer que vê nitidamente com C #. (Faço para obter um bônus para comentários idiotas)
Ray

4

EXCEL Planilhas Google, 89 86 bytes

Economizou 3 bytes graças a Taylor Scott

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

Recebe uma entrada em A1

Explicação

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

Eu acredito que você pode substituir as Searches com Finds para -2 bytes e que isso poderia ser ainda traduzida para uma fórmula planilha do Google para -3 bytes por não fechar os últimos três parens
Taylor Scott

11
A localização diferencia maiúsculas de minúsculas, a pesquisa não diferencia maiúsculas de minúsculas. Mas esses últimos 3 bytes são uma boa ideia!
Mark

Por que a troca do Excel para o Planilhas Google?
Stevoisiak

2
A remoção dos últimos 3 parênteses salva 3 bytes. O Excel lançaria apenas um erro e os colocaria para você de qualquer maneira.
Mark

3

vim, 58 bytes

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

Experimente online!


Eu acho que usar o gcomando pode ser um pouco mais curto, algo assim :g/\cjavascript/d :g!/^\cjava/d icarpet␛:s/pet..*.
21417 Neil




3

Lisp comum, 131 125 bytes

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

Experimente online!

Tamanho reduzido graças ao # n = "truque" do Common Lisp.

Explicação

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

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

Experimente online!

Desenrolado:

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 bytes

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

1

Excel VBA, 76 bytes

A função de janela imediata anônima do VBE que leva a entrada do intervalo [A1]e das saídas é car/ carpetstatus para a janela imediata do VBE

Não usa RegExp

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

11
Bom uso de vba! Eu pensei que uma macro teria sido mais curta. Agora eu tenho provas.
Mark

1

Python 3 , 95 bytes

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

Experimente online!

Sim, poderia ser mais curto, mas eu queria tentar usar uma lambda aninhada!


Sempre bom experimentar :) Note que você pode salvar bytes em torno de operadores como and, or, if,else
Lucas Sawczak

1

Perl , 42 bytes

Eu acredito que a resposta por stevieb tem uma saída incorreta (tentei isso sozinho - ele retorna carro para 'javajavascript'). Isso deve funcionar:

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

0

Mathematica, 82 bytes

regex

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

0

JAISBaL , 36 bytes

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

Detalhado / explicação:

# \# 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 foi minha primeira tentativa de projetar uma linguagem de golfe, por isso é bastante peculiar ... não há correspondências ou contém, regex ou outra coisa; portanto, temos que dividir e verificar o comprimento do array resultante ... porque JAISBaL tem uma divisão por -regex ... mas nenhum outro suporte a regex .... por razões.

O Regex roubou emprestado da resposta do @Cows Quack .



0

Perl , 36 bytes

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

Execute-o da seguinte maneira:

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

0

Lote, 91 bytes

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

Recebe entrada em STDIN. O lote não possui um operador de comparação sem distinção entre maiúsculas e minúsculas, mas possui substituição de sequência sem distinção entre maiúsculas e minúsculas, para que eu possa atribuir um temporário aos quatro primeiros caracteres e depois substituir sem maiúsculas e minúsculas java, o que resultará na sequência vazia. Enquanto isso, caso insensível, substitua o javascript na string original, o que deve mantê-lo inalterado.



0

Perl, 98 84 62 bytes

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

Experimente online!

Graças a bytepusher


Bem vindo ao site! Não conheço nenhum perl, mas parece que há muito espaço em branco que você pode remover. Além disso, se você estiver procurando mais maneiras de reduzi-lo, há várias dicas aqui .
DJMcMayhem

@DJMcMayhem Obrigado, eu acho que toda a lógica pode ser alterado para torná-lo ainda mais curto, mas eu não percebi isso
Burgan

11
Apenas algumas dicas (sem alterar muito a sua solução): você pode substituir return $b;por apenas $b;. Perl sempre retorna a última instrução avaliada. Como não nos importamos com avisos, você pode até soltar o ';' para $b}. Você não precisa dos colchetes em torno do if. Se você usar em ||vez de or, poderá salvar um espaço em branco após a regex.
Bytepusher

11
Você também pode remover o () ao redor do primeiro lc, mas precisará de um espaço depois disso. Se você usar em !~vez da ! =~segunda condição pode ser lc$_[0]!~. `-> sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}. Usando os ops ternários traz-lo para baixo mais umasub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}
bytepusher

11
Para não esquecer - não há necessidade de lc quando você tiver o regex ignore case switch, desça mais 2 :) $_[0] =~//i||$_[0]!~//i. E, finalmente, por que uma variável? sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}deve fazer bem :). E agora: perl será agradável e permitem que você use $ _ [0] w / o especificá-lo (embora não com !~): sub a{"car".(/javascript/i||!/^java/i?'pet':'')}-> 48 :)
bytepusher

0

VM de dardo, 104 bytes 102 bytes

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

Explicação :

Degolfado:

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

Temos nossa função principal usual

Substituímos ppor p[0].toLowerCase();para não precisarmos declarar uma nova variável ( varmais um espaço seria de 4 bytes extras)

Em seguida, procedemos à impressão real

Imprimimos carincondicionalmente e usamos instruções em linha para verificar se é para imprimir petdepois ou não. Se tiver a string 'java' no índice 0 e não tiver 'javascript', não faremos nada (na verdade acrescentamos uma string vazia, mas não tem nenhum efeito) e, caso contrário, acrescentamos pet.


0

Ferrugem, 97 bytes

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

Tenho certeza de que existe uma solução mais curta, mas é a minha primeira tentativa :)


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.