Escreva um programa poliglota em três idiomas que reproduza pedra-papel-tesoura .
A entrada para qualquer versão do programa é sempre uma das cadeias rock
ou paper
ou scissors
.
No primeiro idioma, o programa deve produzir a opção pedra-papel-tesoura que supera a entrada:
Input Output
rock paper
paper scissors
scissors rock
No segundo idioma, o programa deve produzir a opção pedra-papel-tesoura que liga a entrada:
Input Output
rock rock
paper paper
scissors scissors
No terceiro idioma, o programa deve emitir a opção pedra-papel-tesoura que perde para a entrada:
Input Output
rock scissors
paper rock
scissors paper
O código mais curto em bytes vence. O desempate é a resposta mais votada.
As entradas e / ou saídas podem opcionalmente ter uma nova linha à direita, mas, caso contrário, devem ser apenas as strings / rock
/ simples . Você pode usar letras maiúsculas , , se desejado.paper
scissors
ROCK
PAPER
SCISSORS
Você não pode usar versões diferentes da mesma linguagem (por exemplo, Python 2 e 3).
Respostas:
Python, brainfuck e JavaScript,
10399 bytes Yay abaixo de 100 bytes!No Python, isso define uma função que supera a entrada; no cérebro, é apenas um programa simples para gatos; no JavaScript, ele perde. Aqui está uma versão que dá um nome às funções
f
e também solicita entrada em JavaScript e Python 3:Experimente online (versão mais antiga): Python , brainfuck , JavaScript
Explicação:
No Python,
"""..."""
é uma string de múltiplas linhas, que pode ser usada como qualquer token. Quando colocado sozinho, não faz nada. Eu uso isso para "ocultar" o código JavaScript do Python. O mesmo vale para o(0,[.5,])
bit, é apenas uma tupla contendo uma0
e uma lista de5
, e também a1//1
parte,//
em Python é a divisão inteira, mas inicia um comentário em JavaScript. Aqui está o código retirado desses tokens:A primeira linha é bastante auto-explicativa, apenas define a lista
p
para conter as diferentes opções em pedra-papel-tesoura. A segunda linha define uma função sem nome que recebe um argumentox
e devolve a escolha que é melhorx
(por exemplo, o elemento anterior emp
)Em JavaScript,
//
denota um comentário de linha única. Da mesma forma que no Python, os tokens únicos são ignorados; portanto, o código retirado desses tokens é:Isso funciona de maneira semelhante ao Python, primeiro definindo a lista
p
para conter as opções e depois definindo uma função anônima que oferece a opção perdida.-~x
é o mesmox+1
mas com maior precedência para que eu possa pular os parênteses.No brainfuck, todos os personagens exceto
+-,.[]<>
são removidos, deixando o seguinte:O comando
,
lê um byte de entrada,.
imprime e faz um[...]
loop enquanto o valor é diferente de zero. O que este programa faz então é ler a entrada e imprimi-la um caractere de cada vez até que o caractere\0
seja encontrado. Como não temos isso no código, podemos ignorar o restante do programa. Na verdade, isso apenas faz eco ao que o usuário digita, vinculando-o efetivamente.fonte
x=>p[p.indexOf(x)+1]||"rock"//"""
pode ser encurtado parax=>p[(p.indexOf(x)+1)%3]//"""
1//1,[.5,];
[]
na segunda linha para salvar mais bytes:1//1,;lambda x:p[p.index(x,0)+-1];"""
Python 2, Ruby, Retina,
9083 bytes-7 bytes graças ao Value Ink
Experimente on-line: Python , Ruby , Retina
Ganha em Ruby, perde em Python e empata em Retina. Essa solução utiliza o fato de ser verdade
0
em Ruby, mas falsa em Python. Também utiliza indexação negativa em Python e Ruby.fonte
and
tem precedência de operadoror
, entãos.index(0and STDIN.gets or input())
funciona. Além disso,gets
é um alias paraSTDIN.gets
Ruby.V, Brain-flak e Python 2,
97, 86, 81, 77, 75 bytesDois bytes salvos graças a @ nmjcman101!
Isso foi super divertido! Eu gosto muito desta resposta porque é uma visão geral legal dos idiomas que eu gosto: meu editor favorito, meu idioma não esotérico favorito e um idioma que escrevi. (Tecnicamente, o python 3 é melhor, mas o python 2 é mais golfista
¯\_(ツ)_/¯
).Experimente online! em Python (ligeiramente modificado para que você possa ver a saída), que imprime o que perde na entrada.
Experimente online! no Brain-Flak, que imprime o que está relacionado à entrada.
Experimente online! em V, que imprime o que supera a entrada.
Como V depende de caracteres ASCII não imprimíveis, eis um hexdump:
Explicação:
Pitão
Em python, isso é muito direto. Definimos uma lista dos três elementos e retornamos o elemento imediatamente antes da entrada. Como
-1
retorna o elemento back, isso funciona circularmente e é tudo muito direto e fácil. Então, tudo depois#
é um comentário.Brain-Flak
Isso também é extremamente direto no cérebro. Se tivéssemos que ganhar ou perder, provavelmente seriam várias centenas de bytes. Mas isso realmente funciona em 0 bytes. No início do programa, toda a entrada é carregada na pilha. No final do programa, toda a pilha é impressa implicitamente.
Depois que removemos todos os caracteres irrelevantes, o código que o cérebro vê é
O que simplesmente avalia
1 + -1
, mas como esse valor não é usado, é um NOOP.V
Aqui é onde fica um pouco estranho. Nomear a lista python
o
pode parecer arbitrário, mas definitivamente não é. Em V,o
abre uma nova linha e nos coloca no modo de inserção. Então,é inserido no buffer. Depois disso, o código relevante é:
Explicação:
fonte
.split()
é mais fácil se livrar dos vários parênteses e aspas que aparecem na sua solução.xx
e substituí-lo por a2
para fazer o comando,2f'
pois='
ele será excluído pelod*
posterior de qualquer maneira. EDIT: você pode ser capaz de fazê-lot.
?CJam , Retina , PHP,
928685 bytesDeve ser executado em PHP usando a
-r
flag.Experimente no CJam
Experimente na Retina
Experimente em PHP
CJam
No CJam, todas as letras maiúsculas são variáveis predefinidas. Na primeira linha, muitos desses valores são enviados para a pilha, junto com alguns literais de string e array. Alguns incrementos, decrementos e outras operações são executadas.
Depois de tudo isso, a pilha é agrupada em uma matriz (
]
) e descartada (;
), portanto, nada disso importa. O programa principal do CJam é simplesmente:Retina
Isso quase parece trapaça ...
Retina substituirá qualquer correspondência da regex
ECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];
na entrada por#];"scissors paper rock"S/rci=
. O que quer que esse regex corresponde, certamente não corresponde a nada emrock
,paper
ouscissors
, de forma nenhuma substituição é feita. A entrada não modificada é então emitida implicitamente.PHP
A segunda linha é um comentário, portanto é ignorada.
A primeira linha usa o mesmo algoritmo que a parte CJam, mas com diferentes ordens dos resultados.
fonte
C, C ++, Python;
227226216 bytesGuardou um byte graças a @Mat!
Define uma função
f
em todos os idiomas. Vitórias em C, empates em Python, perdem em C ++. Como C ++ sempre faz / sA parte entre the
/*
e the*/
é um bloco de comentários em C e C ++, enquanto é a declaração da função lambda em Python. Basicamente, compara o primeiro caractere do argumento da função e retorna a movimentação que começa com essa letra.A parte entre
"""
s é uma sequência de múltiplas linhas no Python, enquanto é a declaração da função em C e C ++.sizeof'b'-1
descobre se o idioma atual é C de C ++. Ele tem um valor verdadeiro se o tamanho for diferente de 1, caso contrário, um valor falso. No caractere C, os literais são do tipo de 4 bytes de comprimento, enquanto no C ++ eles são do tipo de byte único. Depois que o idioma é descoberto, ele apenas olha para a primeira letra da entrada e sai em conformidade.C
Experimente online!
C ++
Experimente online!
Pitão
Experimente online!
fonte
C ++, R, C;
252240226220209 bytesFaz uso da diferença entre C e C ++ que o tamanho de um caractere literal é de 4 bytes em C e 1 byte em C ++.
C ++:
Experimente online!
R:
Resultado:
C:
Experimente online!
fonte
Gawk, Retina, Perl; 68 bytes
(com uma nova linha no final)
Gawk (vencedor)
Algum lixo para o Perl, altere o conteúdo da linha (
$_
que é o mesmo que$0
porque a variável_
é indefinida), dependendo de conter umk
ou ac
, e imprima o resultado. Ignore qualquer aviso sobre seqüências de escape, eu pretendia fazer isso.Retina (laço)
O mesmo truque que o Basic Sunset e outros: substitua correspondências de alguma regexp boba na primeira linha pelo conteúdo da segunda linha, então passe a entrada.
Perl (perdedor)
Leia uma linha e converta-a para maiúscula, escolha uma palavra com base na letra que ela contém e imprima o resultado. A primeira e a última etapa são agrupadas usando
eval
para ocultá-las do awk.Gawk, Retina
perl -p
; 57 bytesEstou inserindo isso como um bônus, porque a troca da linha de comando
perl -p
deve fazer parte do programa pelas regras usuais deste site, o que tornaria não um poliglota.Novamente com uma nova linha final para Retina . Desta vez, com
perl -p
a impressão automática da saída, a sobrecarga de perl é significativamente reduzida. Posso deixar a tarefa$_
acionar uma impressão implícita no awk .fonte
perl -p
está vazia, deve haver um erro no TIO.> <>, Retina, Python 2:
144127123 bytes1 byte salvo graças a @Loovjo removendo um espaço
4 bytes salvos graças a @ mbomb007 usando em
input
vez deraw_input
Publicado na TNB como um desafio , decidi experimentar essa combinação de idiomas.
> <>
Experimente online!
O IP começa a se mover para a direita.
Os possíveis caracteres que serão inseridos na entrada são
PRS
(já que o programa usa apenas o primeiro caractere). Seus valores ASCII são80
,81
e82
.Se a entrada fosse rock, é isso que aconteceria:
Caso contrário, se a entrada fosse
SCISSORS
ouPAPER
, é isso que o IP encontraria:Se a entrada foi
PAPER
, então:Caso contrário (se a entrada foi
SCISSORS
):Retina
Experimente online!
Nesse caso, a Retina considera cada par de duas linhas como um par de partida e substituição. Por exemplo, ele tenta substituir qualquer coisa que corresponda à primeira linha pela segunda linha, mas, como a primeira linha nunca é correspondida, ela nunca a substitui por nada, preservando a entrada.
Python 2
Experimente online!
O programa Python exige que a entrada seja colocada entre
"
s.As duas primeiras linhas são comentários em Python.
fonte
print
da última linha seja necessário.input()
vez deraw_input()
.Ruby, Clojure, Lisp comum - 251 bytes
Versão mais legível com espaços em branco:
Clojure sempre vence, Ruby sempre empata, Common Lisp sempre perde.
Para Ruby, tudo dentro de
'
s é uma string. Ele se estende por duas linhas. Em seguida, ele usa o[]
operador com um argumento string que retorna a própria string, se ela estiver presente na string. O resultado é impresso, Ruby apenas espelha a entrada.A segunda linha é um comentário para Clojure e Common Lisp. Um monte de
eval
equote
deve ser usado porque o Clojure precisa garantir que todos os símbolos sejam válidos. Seria bom reutilizar mais o código, mas até anth
função tem assinaturas diferentes nesses idiomas. Basicamente, o Clojure éif()
avaliado como true e vai para o primeiro ramo quando um mapa de hash de possíveis variantes é chamado com o argumento lido de stdin. O Lisp comum vai para o segundo ramo, encontra a posição do argumento de stdin na lista e retorna o item correspondente da lista resultante.Eu acho que a parte Common Lisp pode ser mais jogada no golfe.
Veja on-line: Ruby , Common Lisp , Clojure
fonte
Scala, Javascript e Ok, 167 bytes
Experimente em Scala Experimente em Javascript Experimente a versão cerebral do Ook
Scala - vitórias
Javascript - perde
Ook! - laços
A parte Ook é o simples programa de gatos
,[.,]
fodidos pelo cérebro, transformado em Ook.fonte
a[(a.indexOf(s)+2)%3]
, não precisará definira[-1]="rock"
. Além disso, você não pode colocar o código Ook dentro da string JavaScript também?