No jogo Yahtzee , os jogadores jogam cinco dados de seis lados e tentam criar certas mãos para marcar pontos. Uma dessas mãos é uma pequena sequência : quatro números consecutivos, não necessariamente em ordem. Os três possíveis pequenas retas são 1, 2, 3, 4
, 2, 3, 4, 5
e 3, 4, 5, 6
.
Por exemplo, [3, 5, 6, 1, 4]
contém a pequena reta [3, 4, 5, 6]
.
Entrada
Uma lista não classificada de cinco números inteiros, cada um entre 1 e 6, inclusive, representando uma mão Yahtzee.
Saída
Um valor verdadeiro se a mão contiver um pequeno straight e um valor falso caso contrário.
Casos de teste
Verdade:
[[1, 2, 3, 3, 4], [1, 2, 3, 4, 5], [3, 5, 6, 1, 4], [1, 5, 3, 4, 6], [4, 5, 2, 3, 5], [1, 4, 3, 2, 2], [5, 4, 3, 6, 3], [5, 3, 5, 4, 6], [2, 4, 5, 1, 3], [3, 6, 4, 5, 3], [5, 6, 4, 3, 5], [4, 5, 3, 6, 3], [4, 5, 5, 3, 2], [4, 5, 2, 3, 5], [4, 6, 5, 3, 6], [4, 2, 3, 1, 5], [3, 6, 4, 6, 5], [5, 2, 1, 3, 4], [4, 4, 1, 2, 3], [4, 1, 4, 2, 3], [5, 1, 4, 3, 6], [5, 2, 2, 3, 4], [4, 4, 6, 5, 3], [2, 4, 3, 5, 1], [5, 4, 2, 5, 3], [2, 3, 5, 5, 4], [1, 6, 3, 4, 5], [4, 5, 3, 3, 6], [6, 4, 3, 6, 5], [4, 6, 6, 5, 3], [4, 3, 5, 2, 2], [2, 3, 2, 1, 4], [4, 2, 6, 1, 3], [4, 4, 5, 3, 6], [4, 5, 6, 3, 6]]
Falsy:
[[1, 2, 3, 5, 6], [5, 1, 1, 6, 6], [4, 6, 4, 1, 1], [6, 4, 1, 6, 4], [4, 6, 3, 6, 6], [2, 1, 4, 6, 4], [2, 6, 1, 5, 6], [2, 6, 1, 5, 6], [3, 6, 5, 3, 2], [3, 2, 3, 5, 3], [5, 5, 6, 2, 3], [3, 4, 6, 4, 3], [1, 4, 5, 5, 1], [1, 4, 4, 4, 1], [1, 6, 5, 1, 4], [6, 6, 4, 5, 4], [5, 3, 3, 3, 2], [5, 2, 1, 5, 3], [3, 5, 1, 6, 2], [6, 4, 2, 1, 2], [1, 3, 1, 3, 2], [3, 1, 3, 4, 3], [4, 3, 1, 6, 3], [4, 6, 3, 3, 6], [3, 6, 3, 6, 4], [1, 1, 3, 1, 3], [5, 5, 1, 3, 2], [3, 4, 2, 6, 6], [5, 4, 2, 6, 1], [2, 4, 4, 5, 4], [3, 6, 2, 5, 5], [2, 5, 3, 5, 1], [3, 2, 2, 3, 4], [5, 2, 2, 6, 2], [5, 6, 2, 5, 6]]
Inspirado por isso
Catálogo
var QUESTION_ID=74997;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=30525;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"http://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>
code-golf
number
array-manipulation
game
decision-problem
lirtosiast
fonte
fonte
[1,2,3,3,4]
. Muitas respostas morrem por causa disso.Respostas:
MATL ,
71211986 bytesMuito obrigado a @lirtosiast por remover 2 bytes
Truthy é uma matriz de valores diferentes de zero. Falsy é uma matriz vazia (nenhuma saída é exibida).
A partir do release 16.2.0,
u
é estável por padrão. Portanto, o código precisa de um extraS
para classificar a saída:uSd7BXf
( 7 bytes ). O link inclui esta modificação.Experimente online!
fonte
Python, 44 bytes
Voltar após 9 meses com uma melhoria. Não precisamos verificar se
i
está no conjunto com a idéia do Zgarb de verificar apenas os valores iniciais no conjunto. Agora também podemos usar<
subconjuntos estritos porquei
também devem ser incluídos.47 bytes:
Verifica se alguma rolagem do dado é o início de um pequeno conjunto reto. Agradecemos ao Zgarb pela idéia de apenas verificar os valores iniciais na lista, economizando 5 bytes.
O Python 3.5 possui uma conversão de conjunto mais curta, para 45 bytes
É o mesmo comprimento para fazer
{*range(i,i+4)}
como{i,i+1,i+2,i+3}
.fonte
Labirinto, 41 bytes
Uma resposta colaborativa com @ MartinBüttner. Acho que esprememos este muito além das minhas expectativas iniciais.
A saída é
1
para verdade, vazia para falsidade. Experimente online!Explicação rápida
Converta cada número
n
em um número inteiro binário 1 seguido den+1
zeros, ou seja2^(n+1)
. Bit a bit OU os resultados e verifique1111
(em binário). A exponenciação precisa ser implementada manualmente no Labirinto.Explicação detalhada
A cartilha usual:
n
e empurramn*10 + <digit>
. Para iniciar um novo número,_
empurra zero.Configuração
A execução começa no canto superior esquerdo, com o ponteiro de instruções voltado para a direita. Executamos:
Além de efetivamente empurrar zeros, essas instruções não alteram a pilha.
Loop esquerdo: exponencial e OR bit a bit
O labirinto não possui exponenciação, por isso precisamos implementá-lo manualmente. Primeiro, lemos um número inteiro com
?
e, como isso é garantido, vira à direita._1
empurra 1 e entramos no loop interno.O loop interno faz o seguinte:
Como esse é um loop do-while, para entrada,
n
esse cálculo é calculado2^(n+1)
. Terminamos com a entrada zerada na pilha e30
transforma esse zero em 30. Em seguida, executamos as mesmas instruções da instalação, mas desta vez elas são realmente úteis.Esse loop continua para cada número na entrada até EOF, quando
?
retorna 0. Isso nos faz avançar, em vez de virar, levando a ...Bridge: alguma configuração extra
O
30
após as?
voltas a 0 de EOF em 30, que é accionado para a pilha auxiliar via}
. De importância é o fato de termos empurrado um 30 para a pilha auxiliar para cada número de entrada; portanto, agora a pilha auxiliar contém5 + 1 = 6
cópias do número 30 .Enquanto isso, a pilha principal contém o OR bit a bit de
2^(n+1)
cada entradan
. Vamos chamar isso de OR bit a bitb
, uma vez que é modificado no loop certo.Laço direito: verifique o resultado e a saída
Aqui está o que acontece no loop do lado direito:
Agora, a rescisão é um pouco complicada com este programa. Aqui estão as maneiras possíveis de o programa terminar:
Após 3 iterações do loop direito, e
b
ainda é positivo: Lembre - se de como colocamos seis 30s na pilha auxiliar? Como usamos dois deles em cada iteração, na quarta iteração, começamos a extrair zeros da parte inferior da pilha auxiliar. Isso causa uma divisão por zero quando o fazemos{/
, e o programa termina.Depois de dar 1 para uma sequência pequena : executamos
!
e vimos à direita no"
entroncamento no-op . Em seguida, entramos em uma montanha-russa quando começamos a engatinhar pela metade esquerda novamente:Depois de algumas viagens no exponenciador, a pilha se parece com algo que equivale
[12 | 30 30]
a zero por divisão após outras duas iterações no loop direito.:
loop direito está em uma junção. Se a entrada fosse, digamos,,1 1 1 1 1
entãob
seria4
, então2
, então1
,0
depois da terceira iteração. Em vez de virar no:
, o IP agora segue em frente, e algo como o caso anterior causa um encerramento final.Em suma, é uma bagunça como o programa termina, mas ei qualquer coisa para salvar esses poucos bytes!
fonte
Mathematica,
394344313944 bytesfonte
Haskell,
3934 bytesExemplo de uso:
f [1,2,3,3,4]
->True
.Semelhante à resposta do @ xnor , ou seja, verifique se alguma das retas pequenas está na lista de entradas. Na verdade, estou testando todas as "pequenas retas" (ou seja, 4 números consecutivos) começando com qualquer um dos números da lista de entrada, alguns deles são inválidos e, portanto, sempre falham no
all
teste e não distorcem oany
teste, por exemplo[5,6,7,8]
.Edit: @Zgarb salvou 5 bytes. Obrigado!
fonte
MATL, 11 bytes
Experimente online
fonte
JavaScript (ES6),
5553 bytesretorna
true
por verdade efalse
por falsidade.Como funciona
Retorne se algum valor em [0, 1, 2, 3] cumprir a condição de que para cada valor em [0, 1, 2, 3] a soma desses dois valores esteja na matriz de entrada.
Portanto, retorne se a matriz tiver todo valor em [0, 1, 2, 3] (impossível), [1, 2, 3, 4], [2, 3, 4, 5] ou [3, 4, 5 6].
fonte
Ruby, 31
Em vez de tentar ser inteligente como a primeira resposta do Ruby , isso passa pela matriz de números inteiros e, para cada número inteiro, verifica se há uma pequena reta na entrada começando com esse número inteiro. Não se preocupa com os possíveis valores ou singularidade.
Parece estar usando o mesmo algoritmo da resposta de Sherlock .
fonte
Ruby,
585550474333 bytesAcabei de ver que fui derrotado pela resposta de Paul em Ruby . Não estou intimidado no entanto, pois acho que isso ainda pode ser uma resposta decente com um pouco mais de golfe. Baseado, em parte, na resposta Python do xnor .
Edit: Alguns jogando golfe e corrigindo uma confusão no condicional ternário.
Edit: Agora eu uso
.any?
como Não, que Charles faz em sua resposta Ruby, mas apenas porque eu precisava de uma maneira simples de removera
e retornar apenas uma verdade e uma falsey com!([*i..i+3]-l)[0]
uma vez.map
que retornaria uma matriz detrue
efalse
.Retorna
true
oufalse
.Ungolfed:
Nota importante: Para aqueles que desejam usar o
(a2 - a1).empty?
código para determinar se todos os elementos dea2
estãoa1
, observe que, se você quiser garantir que, por exemplo,[2,1,2]
esteja na[1,2,3,3]
multiplicidade de elementos, precisará de outro código. Discussão relevante sobre esse problema aqui .fonte
0
é verdade em Ruby, acho que sua resposta é inválida.p
é um valor falso de um caractere.Japonês,
1312 bytesTeste online! ou Verifique todos os casos de teste .
Como funciona
fonte
Perl,
474342393729 bytesInclui +1 para
-p
Execute com a sequência em STDIN, por exemplo
smallstraight.pl
:Explicação
fonte
CJam,
161512 bytesGera uma sequência não vazia para casos de teste de verdade e uma sequência vazia para casos falsos.
Suíte de teste.
Explicação
No final do programa, essa lista é achatada em uma única sequência e impressa em STDOUT. Se alguma das retas pequenas for encontrada, seus elementos restantes estarão na sequência. Caso contrário, todas as listas estavam vazias e, portanto, a sequência também estará vazia.
fonte
[0 1 2 3]
se custaria 2 bytes.05AB1E ,
9810 bytesVerdade é que contém uma matriz na saída, falso é quando nenhuma saída é produzida. Código:
Explicação desatualizada :
Experimente online!
Usa a codificação CP-1252 .
fonte
Javascript ES6 47 bytes
Javascript ES6 52 bytes
Resposta antiga
Javascript ES6 64 bytes
graças à ETHproductions por ajudar a economizar vários bytes
Teste
fonte
t=(t>4)?t:1
.q=>q.sort().map(o=>(o-s?o-s<2?t++:t=t>4?t:1:0,s=o),t=1,s=9)|t>3
Esta versão retorna1
para verdade e0
para falsidade.C #,
156151150131121939290 bytesou: (mesmo número de bytes)
Ungolfed:
Edição grande: Acabei de perceber que eu só preciso postar uma função, não um programa inteiro. Isso economiza muito. Sem clichês, sem necessidade de converter a entrada de strings em números, etc. Agora, na verdade, estamos nos aproximando de um número respeitável de bytes (de qualquer maneira para um idioma que não seja de golfe).
fonte
main
em C # deve retornar umvoid
ouint
.) Infelizmente, eu também ganhei 2 bytes porque esperava 0-5 em vez de 1-6. Portanto, perda líquida de 1 byte de qualquer maneira.Ruby - 80 -> 79 -> 76 -> 54 -> 48 -> 40 bytes
Quinta tentativa (40 bytes):
Usa a sintaxe lambda para definir a função. (Agradecemos a Ruby golfista @ Sherlock9 por essa ideia.)
Para testar usando a chamada lambda:
Quarta tentativa:
Substituído zero? e negação com o operador ===.
Terceira tentativa:
Usa expressão regular.
Segunda tentativa:
A nova abordagem usa desduplicação (uniq), classificação e associação, além de incluir? para procurar uma correspondência de qualquer solução na entrada renderizada como uma sequência.
Primeira tentativa: 79 bytes
Testador:
Usa deduplicação (função uniq) mais interseção definida (& operador) para testar se alguma das boas seqüências corresponde à sequência especificada. Nenhuma classificação necessária.
fonte
Pyth,
13112 bytes graças a Jakube!
Retorna uma lista não vazia para verdade, lista vazia para falsidade.
Experimente online ou execute o Test Suite (dividido por um erro de sintaxe no Readability ™).
fonte
.PQ4
em vez de.:{SQ4
PHP, 95 bytes
Vista expandida Chamada de entrada / função Saídafonte
Sério, 21 bytes
Experimente online!
Emite um valor positivo para true e um 0 para false.
Explicação:
fonte
PARI / GP , 71 bytes
Provavelmente isso pode ser ainda mais complicado, mas como começo:
Não vejo uma maneira de reduzir a duplicação sem usar mais espaço; esta versão tem 75 bytes:
fonte
Retina ,
7054 bytesInput é uma única sequência de números inteiros, como
13342
. A saída é a1
se encontrada, ou a0
se não for.Observe que a remoção de duplicatas precisa ocorrer apenas uma vez, pois existem apenas cinco números. A necessidade de remover mais de um número significaria que não há uma pequena reta de qualquer maneira.
Experimente online
Agradecemos a Martin pela idéia de mover as vírgulas dentro dos grupos de captura, economizando 16 bytes.
fonte
. $*x Replace numbers with n x's, where n is the number.
+` Repeat the following until the string stabilizes
(x+(x+,))\2 $2$1 Replace n*xm*x,m*x, with m*x,n*xm*x
(x+,)\1 $1 Replace x*n,x*n, with x*n,
(x+,)x\1xx\1xxx\1 Match n*x,xn*x,xxn*x,xxxn*x
AtualizadaPitão, 11 bytes
Suíte de teste
Gere o comprimento 4 substrings de [1..6] e depois filtre-os em nenhum elemento restante quando os elementos da entrada forem removidos.
fonte
Geléia, 9 bytes
Tem que haver uma solução de 8 bytes, continuará pesquisando ... Código:
É o mesmo que minha solução 05AB1E .
Explicação:
Experimente online!
fonte
Œ!I=1ZS3e
...[1, 2, 1, 2, 1]
e sua outra resposta infelizmente não. Minha alternativa parece funcionar (mas já estive errada antes ... teste também :)), fique à vontade para usá-la.Geléia, 8 bytes
Experimente online! ou verifique os casos de teste de verdade e os casos de teste de falsidade .
Como funciona
fonte
Scala,
76706160 bytesTestador:
fonte
Javascript ES6 43 bytes
// não conseguiu fazer isso funcionar: /
Isso leva o número 62 (111110 em binário). Para cada número na matriz de entrada ele remove esse bit
O número resultante deve ser
então eu verifico se o resultado é menor que 7 (0000111) ou se é igual a 32 (100000)fonte
[3, 4, 5, 4, 3]
. Eu acho que você precisa usar 126 em vez de 62 ...TI-BASIC, 25 bytes
Uma expressão Python equivalente (não destruída) que você pode testar :
A idéia por trás disso é divisibilidade. Para verificar se a
1, 2, 3, 4
,2, 3, 4, 5
ou3, 4, 5, 6
ocorre, podemos mapear os números de 1 a 6 a 37 a 42 e depois multiplicar os números corretos.Cada um dos números em [37,42] possui um fator primo que os outros números não possuem.
Portanto, se o produto dos cinco números é divisível por 37, a lista original continha um 1. Se por 19, continha um 2; etc Se é divisível por
37*19*13*5
=65*703
, ele contém1
,2
,3
, e4
e similarmente para os outros dois números.Esta solução é uma melhoria de uma que a @Weregoose postou em 2009.
fonte
Caxumba,
11378 bytesA versão do Mumps que estou usando é o InterSystems Cache.
Não consigo pensar em uma maneira de jogar essa técnica mais curta; com uma técnica diferente, pode ser possível, mas por enquanto isso funciona e, pelo menos, é mais curto que o C ++ ... mas não muito. De qualquer forma...OK, aqui está uma maneira mais curta. Em vez de ter 3 variáveis separadas para execuções curtas, use uma única variável para todos os 6 'dados' e extraia as partes posteriormente:
tanto para mim não encontrar uma maneira melhor com a mesma técnica ... eu deveria olhar antes de pular, hein? ;-)
Deixarei minha resposta original abaixo para fins históricos ...
e aqui está a explicação do que está acontecendo com o código:
Não testei todas as entradas verdadeiras e falsas, pois envolviam digitar manualmente todas; mas testei aproximadamente a primeira metade de cada uma, verifiquei que as retas longas ainda mostram verdade e várias corridas observadas não necessariamente funcionam corretamente ([4,2,5,3,4], [1,2,3,3 , 4] etc.) e parece estar funcionando corretamente.
fonte
Dyalog APL , 15 bytes
{∨/∧/⍵∊⍨⍵∘.+⍳4}
usa
⎕IO=0
⍳4
é0 1 2 3
⍵∘.+⍳4
é 5 × 4 uma matriz de cada dado incrementada por cada um dos⍳4
⍵∊⍨
verifica se os elementos da matriz estão na mão, o resultado é uma matriz booleana (0 ou 1), precisamos encontrar uma linha de todos os 1s∧/
é a redução por linhas, result é um vetor booleano∨/
é a redução ou redução desse vetorfonte
Jelly, 11
Experimente online!
Esta é praticamente uma cópia da minha resposta Pyth, apenas tentando descobrir como encadear coisas. Parece que deveria ser jogável.
Expansão:
Se você quiser fazer perguntas difíceis, como por que os separadores são diferentes, minha resposta é: "Responderei em 6 a 8 semanas": P (Mais sério, acho que é o padrão de correspondência, mônada-díade vs nilad-díade, mas eu não sei e não quero espalhar desinformação.)
fonte
Q Unique elements
Ṣ sort the list
ṡ4 all slices of length 4
ðf filter by {
6R range form 1 to 6
ṡ4 all slices of length 4 from that
Q
está com os operadores de overdot em maiúsculas na documentação. Talvez tenha sido um exagero uma vez?