En el juego Yahtzee , los jugadores lanzan cinco dados de seis lados e intentan crear ciertas manos para ganar puntos. Una de esas manos es una pequeña escalera : cuatro números consecutivos, no necesariamente en orden. Las tres posibles pequeñas rectas son 1, 2, 3, 4
, 2, 3, 4, 5
y 3, 4, 5, 6
.
Por ejemplo, [3, 5, 6, 1, 4]
contiene la pequeña recta [3, 4, 5, 6]
.
Entrada
Una lista sin clasificar de cinco enteros, cada uno entre 1 y 6 inclusive, que representa una mano Yahtzee.
Salida
Un valor verdadero si la mano contiene una recta pequeña y un valor falso de lo contrario.
Casos de prueba
Verdad:
[[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 esto
Catalogar
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
fuente
fuente
[1,2,3,3,4]
. Muchas respuestas mueren por esto.Respuestas:
MATL ,
71211986 bytesMuchas gracias a @lirtosiast por eliminar 2 bytes
La verdad es una matriz de valores distintos de cero. Falsy es una matriz vacía (no se muestra ningún resultado).
A partir de la versión 16.2.0,
u
es estable de manera predeterminada. Entonces, el código necesita un extraS
para ordenar la salida:uSd7BXf
( 7 bytes ). El enlace incluye esta modificación.Pruébalo en línea!
fuente
Python, 44 bytes
De vuelta después de 9 meses con una mejora. No necesitamos verificar si
i
está en el conjunto con la idea de Zgarb de verificar solo los valores iniciales en el conjunto. Ahora también podemos usar<
para subconjuntos estrictos porquei
también deben incluirse.47 bytes:
Comprueba si alguna tirada de dados es el comienzo de una pequeña serie recta. Gracias a Zgarb por la idea de verificar solo los valores iniciales en la lista, ahorrando 5 bytes.
Python 3.5 tiene una conversión de conjunto más corta, para 45 bytes
Es la misma longitud que hacer
{*range(i,i+4)}
tan{i,i+1,i+2,i+3}
.fuente
Laberinto, 41 bytes
Una respuesta colaborativa con @ MartinBüttner. Creo que hemos exprimido esto mucho más allá de mis expectativas iniciales.
La salida es
1
para la verdad, vacía para la falsedad. Pruébalo en línea!Explicacion rapida
Convierta cada número
n
a un entero binario 1 seguido den+1
ceros, es decir2^(n+1)
. Bitwise O los resultados y verifique1111
(en binario). La exponenciación debe implementarse manualmente en Labyrinth.Explicación detallada
La cartilla habitual:
n
y empujann*10 + <digit>
. Para comenzar un nuevo número,_
presiona cero.Preparar
La ejecución comienza en la esquina superior izquierda, con el puntero de instrucciones hacia la derecha. Ejecutamos:
Además de empujar efectivamente los ceros, estas instrucciones no cambian la pila.
Bucle izquierdo: exponencial y bit a bit O
El laberinto no tiene exponenciación, por lo que debemos implementarlo manualmente. Primero leemos un número entero con
?
, y como se garantiza que es positivo, giramos a la derecha._1
empuja 1 y entramos en el bucle interno.El bucle interno hace lo siguiente:
Dado que este es un bucle do-while, para la entrada
n
esto calcula2^(n+1)
. Terminamos con la entrada puesta a cero en la pila y30
convertimos este cero en 30. Luego realizamos las mismas instrucciones de la configuración, pero esta vez son realmente útiles.Este ciclo continúa para cada número en la entrada hasta EOF, cuando
?
devuelve 0. Esto nos hace avanzar en lugar de girar, lo que lleva a ...Puente: alguna configuración extra
El
30
después de las?
vueltas del 0 de EOF en 30, que se empuja a la pila auxiliar a través}
. Es importante el hecho de que empujamos un 30 a la pila auxiliar para cada número de entrada, por lo que ahora la pila auxiliar contiene5 + 1 = 6
copias del número 30 .Mientras tanto, la pila principal contiene el OR bit a bit de
2^(n+1)
cada entradan
. Llamemos a esto OR bit a bitb
, ya que se modifica en el bucle derecho.Bucle derecho: verificar el resultado y la salida
Esto es lo que sucede en el bucle del lado derecho:
Ahora, la terminación es un poco complicada con este programa. Estas son las posibles formas en que el programa puede terminar:
Después de 3 iteraciones del bucle derecho, y
b
sigue siendo positivo: ¿Recuerdas cómo colocamos seis 30 en la pila auxiliar? Como usamos dos de ellos en cada iteración, en la cuarta iteración comenzamos a extraer ceros desde la parte inferior de la pila auxiliar. Esto provoca una división por cero cuando lo hacemos{/
, y el programa termina.Después de generar un 1 para una recta pequeña : hemos ejecutado y
!
luego giramos a la derecha en el"
cruce sin operaciones . Luego nos espera una montaña rusa cuando comenzamos a gatear por la mitad izquierda nuevamente:Después de algunos viajes en el exponente, la pila se ve algo así
[12 | 30 30]
, que se equivoca por división por cero después de otras dos iteraciones en el bucle derecho.:
bucle derecho está en una unión. Si la entrada fue, digamos,1 1 1 1 1
entoncesb
sería4
, luego2
, luego1
, luego de0
la tercera iteración. En lugar de girar en el:
, la IP ahora se mueve hacia adelante, y algo como el caso anterior causa una eventual terminación.En general, es un desastre cómo termina el programa, ¡pero oye cualquier cosa para guardar esos pocos bytes!
fuente
Mathematica,
394344313944 bytesfuente
Haskell,
3934 bytesEjemplo de uso:
f [1,2,3,3,4]
->True
.Similar a la respuesta de @ xnor , es decir, verifique si alguna de las rectas pequeñas está en la lista de entrada. En realidad, estoy probando todas las "rectas pequeñas" (es decir, 4 números consecutivos) comenzando con cualquiera de los números de la lista de entrada, algunos de ellos no son válidos y, por lo tanto, siempre fallan la
all
prueba y no distorsionan laany
prueba, por ejemplo[5,6,7,8]
.Editar: @Zgarb ahorró 5 bytes. ¡Gracias!
fuente
MATL, 11 bytes
Pruébalo en línea
fuente
JavaScript (ES6),
5553 bytesvuelve
true
por la verdad yfalse
por la falsedad.Cómo funciona
Devuelva si algún valor en [0, 1, 2, 3] cumple la condición de que para cada valor en [0, 1, 2, 3] la suma de estos dos valores está en la matriz de entrada.
Entonces, regrese si la matriz tiene todos los valores en [0, 1, 2, 3] (imposible), [1, 2, 3, 4], [2, 3, 4, 5], o [3, 4, 5 6].
fuente
Ruby, 31
En lugar de tratar de ser inteligente como la primera respuesta de Ruby , esto solo pasa por la matriz de enteros, y para cada entero, ve si hay una pequeña recta en la entrada que comienza con ese entero. No se preocupa por los posibles valores o la unicidad.
Esto parece estar usando el mismo algoritmo que la respuesta de Sherlock .
fuente
Ruby,
585550474333 bytesAcabo de ver que la respuesta de Paul Ruby me ha golpeado hasta el golpe . Sin embargo, no estoy disuadido ya que creo que esto podría ser una respuesta decente con un poco más de golf. Basado, en parte, en la respuesta de Python de xnor .
Editar: Algunos jugando al golf y corrigiendo una confusión en el condicional ternario.
Editar: ahora uso
.any?
como No lo que Charles hace en su respuesta de Ruby, sino solo porque necesitaba una forma simple de eliminara
y devolver solo una verdad y una falsey con!([*i..i+3]-l)[0]
ya.map
que devolvería una matriz detrue
yfalse
.Devuelve ya sea
true
ofalse
.Sin golf:
Nota importante: para aquellos que quieran usar el
(a2 - a1).empty?
código para determinar si todos los elementosa2
están ena1
, tenga en cuenta que si desea asegurarse de que, por ejemplo,[2,1,2]
esté en la[1,2,3,3]
multiplicidad de elementos, necesita otro código. Discusión relevante de este problema aquí .fuente
0
es veraz en Ruby, creo que su respuesta no es válida.p
es un valor falso de un caracter.Japt,
1312 bytes¡Pruébelo en línea! o Verificar todos los casos de prueba .
Cómo funciona
fuente
Perl,
474342393729 bytesIncluye +1 para
-p
Ejecutar con la secuencia en STDIN, p. Ej.
smallstraight.pl
:Explicación
fuente
CJam,
161512 bytesProduce una cadena no vacía para casos de prueba verdaderos y una cadena vacía para casos falsos.
Banco de pruebas.
Explicación
Al final del programa, esta lista se aplana en una sola cadena y se imprime en STDOUT. Si se encuentra alguna de las rectas pequeñas, sus elementos restantes estarán en la cadena. De lo contrario, todas las listas estaban vacías, por lo que la cadena también está vacía.
fuente
[0 1 2 3]
él costaría 2 bytes.05AB1E ,
9810 bytesLa verdad contiene una matriz en la salida, la falsa es cuando no se produce ninguna salida. Código:
Explicación desactualizada :
Pruébalo en línea!
Utiliza la codificación CP-1252 .
fuente
Javascript ES6 47 bytes
Javascript ES6 52 bytes
Vieja respuesta
Javascript ES6 64 bytes
gracias a ETHproductions por ayudar a ahorrar varios bytes
Pruebas
fuente
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 versión regresa1
para la verdad y la0
falsedad.C #,
156151150131121939290 byteso: (mismo número de bytes)
Sin golf:
Big Edit: Acabo de darme cuenta de que solo necesito publicar una función, no un programa completo. Eso ahorra mucho. No hay repeticiones, no es necesario convertir la entrada de cadena en números, etc. Ahora nos estamos acercando a un número respetable de bytes (de todos modos, para un lenguaje que no sea de golf).
fuente
main
en C # debe devolver unovoid
u otroint
). Desafortunadamente, también gané 2 bytes porque esperaba 0-5 en lugar de 1-6. Entonces la pérdida neta de 1 byte de todos modos.Ruby - 80 -> 79 -> 76 -> 54 -> 48 -> 40 bytes
Quinto intento (40 bytes):
Utiliza la sintaxis lambda para definir la función. (Gracias a la competidora de golf Ruby @ Sherlock9 por esta idea).
Para probar usando la llamada lambda:
Cuarto intento:
Reemplazado nulo? y negación con === operador.
Tercer intento:
Utiliza expresiones regulares.
Segundo intento:
El nuevo enfoque utiliza dedup (uniq), ordenar y unir, además de incluir? para buscar una coincidencia de cualquier solución en la entrada representada como una cadena.
Primer intento: 79 bytes
Ensayador:
Utiliza la deducción (función uniq) más la intersección establecida (y operador) para probar si alguna de las secuencias correctas coincide con la secuencia dada. No se necesita clasificación.
fuente
Pyth
13112 bytes gracias a Jakube!
Devuelve una lista no vacía para verdadero, lista vacía para falso.
Pruébelo en línea o ejecute Test Suite (dividido por un error de sintaxis para Readability ™).
fuente
.PQ4
en lugar de.:{SQ4
PHP, 95 bytes
Vista en despiece ordenado Llamada de entrada / función Salidafuente
En serio, 21 bytes
Pruébalo en línea!
Emite un valor positivo para verdadero y un 0 para falso.
Explicación:
fuente
PARI / GP , 71 bytes
Esto probablemente se pueda jugar más, pero como comienzo:
No veo una forma de reducir la duplicación sin usar más espacio; esta versión es de 75 bytes:
fuente
Retina ,
7054 bytesLa entrada es una sola cadena de enteros como
13342
. La salida es un1
si se encuentra, o un0
si no.Tenga en cuenta que la eliminación de duplicados solo debe ocurrir una vez, ya que solo hay cinco números. La necesidad de eliminar más de un número significaría que no hay una recta pequeña de todos modos.
Pruébalo en línea
Gracias a Martin por la idea de mover las comas dentro de los grupos de captura, ahorrando la friolera de 16 bytes.
fuente
. $*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
ActualizadoPyth, 11 bytes
Banco de pruebas
Genere las 4 subcadenas de longitud de [1..6], luego fíltrelas en ningún elemento restante cuando se eliminen los elementos de la entrada.
fuente
Jalea, 9 bytes
Tiene que haber una solución de 8 bytes, continuará buscando ... Código:
Esto es lo mismo que mi solución 05AB1E .
Explicación:
Pruébalo en línea!
fuente
Œ!I=1ZS3e
...[1, 2, 1, 2, 1]
, y desafortunadamente su otra respuesta tampoco. Mi alternativa parece funcionar (pero me he equivocado antes ... pruébelo también :)), siéntase libre de usar eso.Jalea, 8 bytes
Pruébalo en línea! o verificar los casos de prueba de la verdad y los casos de prueba de la falsedad .
Cómo funciona
fuente
Scala,
76706160 bytesEnsayador:
fuente
Javascript ES6 43 bytes
// no podría hacer que esto funcione: /
Esto toma el número 62 (111110 en binario) Para cada número en la matriz de entrada, elimina ese bit
El número resultante debería ser
entonces verifico si el resultado es menor que 7 (0000111) o si es igual a 32 (100000)fuente
[3, 4, 5, 4, 3]
. Creo que necesita usar 126 en lugar de 62 ...TI-BASIC, 25 bytes
Una expresión de Python equivalente (sin golf) que puede probar :
La idea detrás de esto es la divisibilidad. Para verificar si a
1, 2, 3, 4
,2, 3, 4, 5
u3, 4, 5, 6
ocurre, podemos mapear los números 1-6 a 37-42, y luego multiplicar los números correctos.Cada uno de los números en [37,42] tiene un factor primo que los otros números carecen.
Por lo tanto, si el producto de los cinco números es divisible por 37, la lista original contenía un 1. Si por 19, contenía un 2; etc. Si es divisible por
37*19*13*5
=65*703
, que contiene1
,2
,3
, y4
y lo mismo para los otros dos números.Esta solución es una mejora en uno que @Weregoose publicada en 2009.
fuente
Paperas,
11378 BytesLa versión de Paperas que estoy usando es InterSystems Cache.
No puedo pensar en una forma de jugar golf esta técnica más corta; con una técnica diferente podría ser posible, pero por ahora esto funcionará y al menos es más corto que C ++ ... pero no por mucho. De todas formas...OK, aquí hay un camino más corto. En lugar de tener 3 variables separadas para las tiradas cortas, use una sola variable para los 6 'dados' y extraiga las porciones más tarde:
tanto para mí no encontrar una mejor manera con la misma técnica ... Debería buscar antes de saltar, ¿eh? ;-)
Dejaré mi respuesta original a continuación para fines históricos ...
y aquí está la explicación de lo que está pasando con el código:
No he probado todos y cada uno Truthy y entrada Falsy como la implicada escribir manualmente todos ellos en; pero probé aproximadamente la primera mitad de cada una, verifiqué que las rectas largas todavía muestran la verdad y varias de las carreras notaron que no necesariamente funcionan correctamente ([4,2,5,3,4], [1,2,3,3 , 4] etc.) y parece estar funcionando correctamente.
fuente
Dyalog APL , 15 bytes
{∨/∧/⍵∊⍨⍵∘.+⍳4}
usos
⎕IO=0
⍳4
es0 1 2 3
⍵∘.+⍳4
es 5 × 4 una matriz de cada dado incrementada por cada uno de⍳4
⍵∊⍨
comprueba si los elementos de la matriz están en la mano, el resultado es una matriz booleana (0-o-1), necesitamos encontrar una fila de todos los 1s∧/
es la reducción y por filas, el resultado es un vector booleano∨/
es la o-reducción de ese vectorfuente
Gelatina, 11
Pruébalo en línea!
Esto es más o menos una copia de mi respuesta de Pyth, solo tratando de descubrir cómo encadenar cosas. Parece que debería ser golfable.
Expansión:
Si desea hacer preguntas difíciles, como por qué los separadores son diferentes, mi respuesta es: "Contestaré en 6-8 semanas": P (Más en serio, creo que es la coincidencia de patrones, mónada-díada vs nilad-dyad, pero no sé y no quiero difundir información errónea).
fuente
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
es con los operadores de overdot en mayúsculas en la documentación. Tal vez fue un exceso una vez?