Implemente a tesoura de papel de pedra clássica.
Condições:
- o usuário inserirá 'r', 'p' ou 's'
- programa produzirá 'r', 'p' ou 's' e o resultado
- a escolha do programa ('r', 'p' ou 's') deve ser pseudo-aleatória ( estou olhando para você Howard )
- Como o resultado pode ser representado com qualquer caractere imprimível, sempre deve haver três resultados possíveis para o que o usuário inseriu (o usuário ganha, perde ou empata).
- o que acontece se o usuário não inserir nada, ou algo diferente de 'r', 'p' ou 's' não seja importante.
Você precisa:
- Forneça o código do golfe.
- O código não destruído
- Como você invoca o programa
- Uma amostra de execução
Vou escolher a resposta com menos caracteres, se um empate apresentar a resposta mais votada será escolhida.
Bom golfe e sorte pode estar sempre a seu favor.
Vou postar uma resposta em Java.
Para aqueles que vivem em uma montanha debaixo de uma rocha:
r = rock
p = papel
s = tesoura
pedra: ganha em tesoura, perde com papel, um empate com pedra.
papel: ganha a pedra, perde com tesoura, um empate com papel.
tesoura: ganha no papel, perde com pedra, um empate com tesoura.
Posições Atuais:
- UN: nome de usuário
- PL: Linguagem de Programação
- CC: contagem de caracteres
- UV: até votos
╔══════════════════╦════════════╦══════╦════╗ ║ UN ║ PL ║ CC ║ UV ║ ╠══════════════════╬════════════╬══════╬════╣ ║ Howard ║ GolfScript ║ 6 ║ 15 ║ ║ primo ║ Perl ║ 27 ║ 7 ║ ║ TwiNight ║ APL ║ 31 ║ 4 ║ ║ primo ║ Perl ║ 33 ║ 7 ║ ║ marinus ║ APL ║ 36 ║ 5 ║ ║ primo ║ Perl ║ 38 ║ 7 ║ ║ primo ║ Perl ║ 48 ║ 7 ║ ║ manatwork ║ Ruby ║ 54 ║ 13 ║ ║ w0lf ║ GolfScript ║ 62 ║ 4 ║ ║ tmartin ║ K ║ 67 ║ 2 ║ ║ Abhijit ║ Python 3 ║ 74 ║ 5 ║ ║ beary605 ║ Python 3 ║ 76 ║ 4 ║ ║ rlemon ║ javascript ║ 85 ║ 4 ║ ║ ugoren ║ C ║ 86 ║ 3 ║ ║ Egor Skriptunoff ║ LUA ║ 87 ║ 4 ║ ║ Shmiddty ║ javascript ║ 87 ║ 3 ║ ║ Fors ║ Befunge ║ 107 ║ 3 ║ ║ Briguy37 ║ javascript ║ 117 ║ 2 ║ ║ Vi. ║ Clojure ║ 129 ║ 1 ║ ║ Henrik ║ C# ║ 167 ║ 4 ║ ║ dystroy ║ Go ║ 169 ║ 1 ║ ║ Praveen ║ javascript ║ 250 ║ 0 ║ ║ ryan ║ javascript ║ 256 ║ 1 ║ ║ primo ║ ferNANDo ║ 259 ║ 5 ║ ║ anakata ║ Java ║ 259 ║ 1 ║ ║ epoch ║ Java ║ 387 ║ 1 ║ ║ jdstankosky ║ LOLCODE ║ 1397 ║ 15 ║ ╚══════════════════╩════════════╩══════╩════╝
Não consigo selecionar a resposta de Howards, pois foi uma tentativa (bem-sucedida) de dobrar as regras, mas eu as altero para torná-las mais explícitas.
A resposta primo de 27 caracteres não pode ser selecionada porque não é pseudo-aleatória em si
resposta primo -p, vou usar "-p será contado como 3 bytes: um para o -, um para o pe mais um espaço em branco necessário".
Obrigado a todos que responderam, espero que você tenha se divertido!
OBSERVAÇÃO: tentarei editar isso a cada duas semanas, para ajustar a tabela e alterar minha resposta selecionada se alguém superar a atual, então, se você acabou de chegar aqui, poste sua resposta, se quiser!
-p
seriam contados como 3 bytes: um para o-
, um para op
e mais um espaço em branco necessário. No entanto, muitas outras competições no CG.SE contam cada opção como um único byte. Geralmente, cabe ao autor da pergunta decidir qual sistema honrar.Respostas:
APL, 31
x←'rps'
Atribuir string'rps'
ax
(?3)⌷
Escolha um número inteiro aleatório 1 ~ 3, escolha esse índice dex
⍞,
Anexar entrada do usuário à escolha da máquina⎕←
String resultante de saídax⍳
Converta em matriz numérica por indexOf emx
-/
Diferença dos dois números1+|3
Módulo 3 e mais 1'TWL'[...]
indexação de'TWL'
Amostra
Usuário escolhe rock, programa escolhe papel: Perca
fonte
LOLCODE, 1397
Nota: enviei isso antes de perceber que o requisito vencedor foi alterado de popularidade com tie-break de golfe para golfe com tie-break de popularidade.
Não há realmente nenhuma sintaxe estrita, mas tenho certeza de que isso é aceitável.
Se isso fosse executado com sucesso como
RockPaperScissors.LOL
, aqui estão alguns possíveis resultados aleatórios:Rock
- Saída:I GUESSED SCIZZORS U WONNED
Paper
- Saída:I GUESSED PAPER NOWAI TIED
Scissors
- Saída:I GUESSED ROCK LOL U LOZED
Tuna
- Saída:WHAT U SAYZ? YOU BURNTED MAH TREAT!
fonte
GolfScript
O código acima implementa a funcionalidade necessária. Além disso, garante que o jogador nunca fique com raiva por causa de uma injustiça (percebida) da estratégia do computador.
Versão ungolfed
Como invocar o programa
A entrada (um único caractere de 'r', 'p', 's') deve ser fornecida no STDIN, possivelmente finalizada com nova linha.
Uma amostra de execução
Explicação do código
Para todos aqueles que não estão familiarizados com o GolfScript, adicionarei uma explicação detalhada de como esse código funciona. O código existe essencialmente de três partes.
Notas
Como este não é um código de golfe, mas um concurso de popularidade, não escolhi a versão mais curta. Talvez em caso de empate, um código mais curto elimine minha solução. No entanto, para os interessados em jogar golfe, são dadas as seguintes possibilidades:
0
como saída para empate. Portanto, o menor programa válido é o código de um caractere0
.fonte
n"d"
, como a pergunta dizia que a saída deve ter qualquer caractere imprimível, ela não diz nada sobre o uso de palavras completas.Ruby:
6154 caracteresDe alguma forma, explicou:
Todo o problema é reduzido ao cálculo dos seguintes resultados:
Onde os números significam:
Para isso, usei a fórmula: machine_choice - human_choice. Ocasionalmente, isso resulta em valor negativo, mas como é usado apenas como índice e o índice negativo é contado para trás, o elemento de matriz correto será escolhido.
Métodos usados (outros, então
Fixnum
os óbvios):inspect
seguido por uma nova linha na saída padrão do programa. ”max.to_i.abs == 0
, rand retorna um número de ponto flutuante pseudo-aleatório entre 0,0 e 1,0, incluindo 0,0 e excluindo 1,0".Ungolfed:
Exemplo de execução:
fonte
[(c-o.index($_)+3)%3]
pode ser substituído por[c.-o.index$_]
7 bytes. Além disso, você deve adicionar dois à sua pontuação-nl
pelo menos.c.
dica..-
. Operadores pontilhados têm uma precedência muito menor do que seus equivalentes não pontilhados. Por exemplo,a/(b+c)
pode ser substituído pora./b+c
.C # (167 caracteres)
Minha primeira tentativa no golfe.
Golfe
using System;class P{static void Main(string[] i){var m="rspr";var a=m[Environment.TickCount%3];Console.WriteLine(a+" "+(i[0][0]==a?"T":m.Contains(i[0]+a)?"W":"L"));}}
Sem golfe
Execução de amostra O aplicativo requer entradas de caracteres únicas como argumento 1 para o aplicativo
r
,s
oup
.Todos os resultados possíveis
cmd > app.exe r
dá saídar T
(rock, tie)cmd > app.exe r
produz saídap L
(papel, perdido)cmd > app.exe r
dá saídas W
(tesoura, vitória)cmd > app.exe p
dá saídar W
(rock, vitória)cmd > app.exe p
dá saídap T
(papel, gravata)cmd > app.exe p
dá saídas L
(tesoura, perdida)cmd > app.exe s
dá saídar L
(rocha, perdida)cmd > app.exe s
dá saídap W
(papel, vitória)cmd > app.exe s
dá saídas T
(tesoura, gravata)fonte
Perl 48 bytes
O script imprime o resultado da perspectiva do computador; por exemplo, se o jogador escolhe
r
e o computador escolhes
, o resultado éLose
.$%
(formatar número da página) é usado para armazenar a movimentação do computador, pois pode conter apenas um valor inteiro, o que salva uma conversão int.Ungolfed:
Uso da amostra:
O script também pode ser executado interativamente, digitando sua movimentação seguida por Enter:
Alongamento de Regras
Perl 35 +3 bytes
Requer a
-p
opção de linha de comando (contada como 3 bytes). Cada um dos resultadosWin
,Lose
eDraw
foram mapeados paraW
,L
,D
. A nova linha entre a escolha do computador e o resultado foi excluída.Uso da amostra:
Perl 30 +3 bytes
Mais uma vez requer
-p
. AquiWin
,Lose
eDraw
foram mapeados para2
,1
e0
respectivamente. Isso ainda é tecnicamente compatível, pois são caracteres imprimíveis.Uso da amostra:
Perl 24 +3 bytes
Requer
-p
, WLD mapeado para2
,1
,0
como antes. Cada um^T
deve ser substituído por um caractere ascii literal 20. Este é reconhecidamente um pouco exagerado;$^T
retorna o número de segundos desde a época em que o script foi iniciado. Todos os resultados são possíveis, mas não se qualificam como pseudo-aleatórios.Uso da amostra:
fonte
APL (
3836)Saídas 'T', 'W' e 'L' para empate, vitória e derrota.
Exemplo de execução:
(O usuário digita 'p' para papel. O computador escolhe 'r' (rock), o usuário vence)
Explicação:
⌽↑⌽∘'TWL'¨⍳3
: gera a seguinte matriz:⍞⍳⍨c←'rps'
: definac
a string'rps'
, leia a entrada do usuário e obtenha o índice da entrada do usuário na string (este será um valor de 1 a 3). Este índice é usado como coordenada Y na matriz.i←?3
: obtenha um número aleatório de 1 a 3 e armazene-oi
, essa é a escolha do computador. Isso é usado como a coordenada X na matriz.c[i]
: usei
como um índice parac
, exibindo a opção do computador como 'r', 'p' ou 's'.fonte
ferNANDo 1184 (259 golfed) bytes
Um intérprete escrito em Python pode ser encontrado na parte inferior da página vinculada.
ferNANDo é uma linguagem esotérica que suporta apenas um tipo de variável, booleano e apenas uma operação, NAND. Como você pode imaginar, isso pode levar a uma lógica bastante longa para realizar tarefas aparentemente simples. Ele suporta leitura de stdin (um byte de cada vez), gravação para stdout (também um byte de cada vez), loops condicionais e também um gerador booleano aleatório.
Não há palavras-chave; tudo é uma variável. A função de uma instrução é determinada apenas pelo número de variáveis que ela contém. Também não há comentários, então eu fiz o meu melhor para tornar o código com comentários próprios. As últimas quatro linhas pode ser um pouco confuso, mas provavelmente será suficiente para dizer que ele imprime
Win!
,Lose
ouDraw
dependendo do resultado.O script pode ser executado interativamente, digitando sua movimentação seguida de Enter .
Exemplo de uso (assumindo que você nomeou o intérprete
nand.py
):Edit: Apenas para provar que o ferNANDo pode competir com Java, aqui está uma versão 'golfada' com 259 bytes . A lógica é visivelmente diferente; ele verifica
not win
enot tie
, o que salva alguns portões NAND (porque então eu só preciso dasnot
versões dos movimentos do jogador e porquenot lose
não era necessário para a saída). Não é tão interessante de ler, no entanto.fonte
o_shi- o_shi- o_shi-
Isso foi hilário com comentários próprios.q
, mas ele faz a coisa sensata e rolar novamente .Python 3.x: 74 caracteres
Como funciona
Com base no destino, determina qual deve ser sua escolha com base na fórmula
Versão sem golfe
Amostra de execução
fonte
Lua, 87
Uso:
Ungolfed:
fonte
GolfScript 62
Uma solução alternativa do GolfScript, muito mais chata do que a de Howard :).
O programa escolhe um movimento aleatoriamente e exibe o resultado da perspectiva do usuário.
O código
Amostra de execução
Teste online
Você pode executar o programa e experimentar diferentes entradas aqui: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwqdcJ0xvc2UnJ1dpbidpZd17Ocmv3D
Observe, no entanto, que o parâmetro (movimentação do usuário) que normalmente é passado na linha de comando agora é adicionado à pilha no próprio código (não há como fornecer parâmetros de linha de comando "reais" nesta ferramenta online).
Versão "Ungolfed"
Eu não tenho nenhuma idéia do que significa não destruído quando se trata de GolfScript, então tentei adicionar comentários. Esperamos que isso esclareça como o código funciona e o torne um pouco mais legível:
fonte
C,
9286 caracteresImprime a escolha do computador e o resultado do ponto de vista do usuário - W = você ganha, L = você perde, T = empate.
A fórmula simples
x-y
, dados os valores ASCII das opções, fornece 0 no empate (obviamente) e um valor único nos outros casos.fonte
Python 2 (
86848078), Python 3-76 caracteres0 - empate, 1 - derrota, 2 - vitória
Ungolfed
Como executar:
python file_name_here.py
Problemas:
AI do computador: 35 caracteres
fonte
A
, e você pode salvar outro caractere comfrom random import*
.from random
, porque eu pensei que não mudá-lo ...Primeiro tente sem revisar os outros.
golfe:
10785 bytesa saída é [npc-choice] [1: vitória, 2: perda, 3: empate]
ungolfed:
fonte
PowerShell:
1441331171119273Código de golfe:
Pode ser executado diretamente do console.
Ungolfed, com comentários:
Algumas amostras são executadas no console:
fonte
JAVA 259 :(
Código altamente não destruído:
Amostras de execuções:
fonte
Befunge: 107 caracteres
Ligeiramente desajeitado. É encolhível, a questão é quanto.
fonte
JavaScript (87)
Golfe:
Ungolfed:
Você pode simplesmente colar o código no console javascript do seu navegador para executá-lo.
Se eu puder imprimir o resultado antes de imprimir a seleção do computador (83) :
fonte
K, 67
Imprime W, L, D para ganhar / perder / empatar.
Ungolfed:
Ou em Q, que é mais legível:
Exemplo de execução:
fonte
Javascript, 117 caracteres
Aqui está uma abordagem orientada a dados para o problema. Provavelmente, isso pode ser otimizado gerando os dados de vitória / perda / empate em vez de mapear manualmente, mas é um começo :)
Golfe:
Ungolfed:
Finalmente, aqui está uma mexida com ambos.
fonte
Javascript: 256
golfed:
ungolfed:
fonte
Clojure:
Mini versão (129 caracteres de código):
fonte
JAVA (387) primeiro código de golfe!
Ungolfed
Golfe (espaçamento / recuo)
Não é o código mais curto, mas minha primeira tentativa
fonte
import java.util.*
2)HashMap l
->Map l
3) converter para em(int)
vez de(Integer)
4)new Random().nextInt(3)
5) omitirnew int[][]
6) remover o elenco para(Character)
7) usar ints em vez de caracteres.Go (169)
Golfe:
Ungolfed (como formatado por
go fmt
):Corre :
fonte
Pyth , 23
A saída está no formato:
Empate: 0 Vitória: 1 Perda: 2
Explicação:
Execute da seguinte maneira:
Para apenas mais 4 personagens, podemos usar T para empate, W para vitória e L para derrota:
Tudo é o mesmo até a diferença de índices; nesse ponto, usamos a diferença como índice na string
"TWL"
.Nota: embora eu tenha desenvolvido esse idioma depois que o desafio foi publicado, eu não o havia visto até hoje. O desafio não influenciou nenhum aspecto do idioma.
fonte
Groovy, 89
Toma a escolha do usuário como argumento. Exemplo:
fonte
C # e LinqPad 133
golfed:
ungolfed:
saída de amostra (a entrada era): r> L // O computador escolhe rock (r) -> então perdemos
fonte
JavaScript (79)
Colidindo com um antigo, mas aqui vamos nós ...
Com o bônus adicional de que você pode usar qualquer pedra que você gosta de pegnatita, piroxenita, escória, sovita, kimberlita, trondjemita, tufo ou qualquer outra. A única limitação é que você não pode usar
p
ous
;-)Código de golfe:
Os principais truques usados são:
1. u = ~~{}[prompt()]
Usando objeto
{}
e recuperando valor pela entrada do usuário deprompt()
. Por enquanto, tudo bem. Então, em vez de terr : 0
, podemos forçar a conversão0
, usando o~~
operador NOT. É freqüentemente usado para andar números, mas também tem o (vantagem) de não voltarNaN
quando outros operadores, como por exemplo:+{a:1, b:2}['c']
.2. c = new Date%3
A data é frequentemente enganada, por exemplo, usando-a
+new Date
para convertê-la em carimbo de data / hora diretamente, caso contrário, seria possível obter uma representação de string. Aqui, usando o mod one, obtém o mesmo efeito.3. 'rps'[c]
Acesso indexado na corda dando computadores escolha
0 = r
,1 = p
ou2 = s
.4. (u==c ? 2 : !u&c>1 | u&!c | u>1&c )
O código não destruído pode ser algo como isto:
fonte
Golfscript - 29
Esta é uma resposta real desta vez (olhando para você
n"Draw"
: P).Ungolfed:
Você pode executá-lo com
ruby golfscript.rb MyCode.txt
, ondeMyCode.txt
está o código do programa.Amostras são executadas (todas com entrada "r", mas funcionam com tudo) (empate é 0, vitória é 2, perda é 1):
Se você quiser uma explicação sobre a versão e / ou ver uma melhoria em potencial, me diga.
fonte
Javascript,
657170Sem saída de escolha do computador: 65
Apenas para testar se a solução está correta:
Com saída de escolha do computador: 71
70
e o teste:
fonte