Su desafío es escribir un programa que, dado un año, arroje el número de "Viernes 13" en él.
Reglas y detalles:
- Puede recibir información a través de
STDIN
, o como un argumento pasado a su programa. - Debe enviar el resultado a
STDOUT
. - Puede suponer que la entrada será un año válido y no es anterior al calendario gregoriano (se permite un comportamiento indefinido en estos casos).
- Se permiten bibliotecas de calendario / fecha.
Este es un código de golf , por lo que gana el código más corto (en bytes).
Respuestas:
APL (Dyalog APL) con cal de dfns , 29 bytes
Pruébalo en línea!
⍳ 12
los enteros del uno al doce⎕ ,¨
tomar entrada numérica y anteponer a cada uno de los doce números{
...}¨
en cada uno de los pares, aplique la función ...cal⍵
obtener un calendario para ese año-mes2 ↓
soltar dos filas (título y días)⍉
transposición (para que podamos direccionar columnas en lugar de filas)¯5 ↑
tome los últimos cinco (dos dígitos para cada viernes y sábado más un espacio)3 ↑
tome los dos primeros (dos dígitos para el viernes más un espacio)⍉
transponer (para que podamos leer el orden),
enmarañar⍎
ejecutar como expresión APL (da una lista de las fechas de los viernes)13 ∊
¿Trece es miembro de esa lista?+/
suma los 12 booleanosUsando el algoritmo de @ Wrzlprmft , podemos hacerlo sin bibliotecas para 53 bytes:
-∘0 1
restar cero y uno400 100 4 ∘.|
tabla de resto de división para los dos años (a través) dividida por estos números (abajo)0 ≠.=
"producto" interno con 0, pero usando ≠ y = en lugar de +. ×⊢ ,
anteponer el año del argumento no modificado2 3 ¯1 +.×
producto interno con estos números14 |
resto de división cuando se divide por catorce'21232211321211' ⌷⍨
indexar en esta cadenafuente
Mathematica
49 46 45 4442Como una función pura : 42 caracteres
Ejemplo
Como una función con nombre : 44 caracteres
Ejemplos
fuente
f=DayName@{#,m,6}~Table~{m,12}~Count~Friday&
Rubí,
49 48 4746Editar: afeitó a un personaje retrocediendo una semana, gracias a Jan, y otro cambiando de Time.new a Time.gm
Editar: a expensas de ofuscarlo un poco más, puedo llegar a 46 con
fuente
Time.gm(m,i).wday<1
. Además, no sé por qué estás nombrando la función.Powershell,
6863585250Gracias Iszi por el dato.
Usando el hecho de que si el primer día del mes es domingo, el 13 será el viernes.
También he intentado:
pero no es lo mismo
$args
dentro del bloque de script.fuente
$n
con$args
en el bucle, y puede prescindir por$n=read-host;
completo. Guarda 8. Elimina @, como se mencionó anteriormente, y tienes 54.$args
para$input
, alimentando así el año en el de la tubería, y el script se ejecutará, pero siempre da salida 3.R
767257fuente
"%a %d")=="Fri 13"
con el"%w%d)=="513")
uso de dow como número y eliminar los espacios.seq
único en el mes es más corto aquí!sum(format(as.Date(paste(scan(),1:12,13,sep="-")),"%w%d")=="513")
solo tiene 65 caracteres!<
obligaría a un personaje a un entero ¡Buen truco!Python2.7
9086El lunes 9 puede no tener el mismo tono pero funciona igual de bien.
Editar: Un año y medio para notar que
date
es más corto quedatetime
:)fuente
from datetime import*
f=lambda y:sum([date(y,m,13).weekday()==4 for m in range(1,13)])
.... Solución del mismo tamaño con la importación (86 bytes), sin embargo.No usar ninguna biblioteca o funciones de fecha integradas:
Golfscript - 51
Python -
8279Esencialmente el mismo algoritmo.
Usando este truco , esto se puede reducir aún más para:
fuente
do
301+287No es la respuesta más corta, pero no usa bibliotecas.
fuente
static char GetNumberOfFriday13s(int year) { const string perpetualCalendar = "1221212213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213112213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122221122213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122221122131"; return perpetualCalendar[year % 400];
. No funcionará por años negativos.v[0]
debería serv[1]
. También puedes jugar golf un poco; considere usarstrcat
, almacenar caracteres para imprimir directamentea[]
y restar constantes numéricas en lugar de constantes de caracteres. :)main(int x,char**v){char p[400],*a[]={"1221212213113213","2131222","21122131","1222","112213113","122223113","122221122"},*b="adcadcadcaebcadcadcafbcadcadcagbcadcadcadc";*p=0;for(;*b;b++)strcat(p,a[*b-97]);putchar(p[atoi(v[1])%400]);}
(215 caracteres)C (
151145137131130 caracteres)Me sorprende ver que solo hay otra solución que no utiliza herramientas de calendario integradas. Aquí hay un enfoque matemático (altamente ofuscado), también en C:
(Lo anterior se compila en GCC sin errores)
Solución alternativa: C (287-> 215 caracteres)
Disfruté bastante la solución de Williham Totland y su uso de la compresión. Arregle dos pequeños errores y modifiqué el código para acortar su longitud:
fuente
PHP, 82
<?for($i=1,$c=0;$i<13;$i++)$c+=(date("N",mktime(0,0,0,$i,1,$argv[1]))==7);echo $c;
Residencia en
"Cualquier mes que comienza un domingo contiene un viernes 13, y hay al menos un viernes 13 en cada año calendario".
De http://en.wikipedia.org/wiki/Friday_the_13th
fuente
fiesta
4736Gracias @DigitalTrauma por guardar 10 caracteres usando
seq
el inicio predeterminado en1
.(La versión anterior usaba
echo
presente un error debido a la línea vacía cuando<(echo $1-{1..12}-6$'\n')
. Así que esta función funcionó bien hasta hoy es viernes.Veamos:
Es dependiente de la configuración regional , si no funciona, es posible que deba
o
En una función; +7 -> 43
Bono: +78 -> 121
A partir de ahí, si mi función se convierte en:
o
fuente
C
. Pero hay un error ...%s\\n
seq
para soltar 8 caracteres:date -f<(seq -f$1-%g-6 1 12)|grep -c ^F
seq -f$1-%g-6 12|date -f-|grep -c ^F
JavaScript, 70
fuente
,b,c
de la declaración de la función (! Está bien que la fuga vars para el golf), como tambiénb
se presenta como unNumber
puedas+=
el resultado de la prueba en lugar de la&&b++
:b+=/^F/.test(new Date(a,c,6))
. Sin embargo, puede guardar otro byte usando!new Date(a,c,1).getDay()
(esto funciona porquegetDay
devuelve 0 para el domingo, y si el 13 es un viernes, el primero será un domingo) en lugar deltest
que debería ahorrarle 7 bytes.k
64 caracteres
Lecturas de stdin
fuente
Lisp común (CLISP), 149
fuente
DO#
1101019392C # Linq 88
Gracias a Jeppe Stig Nielsen por linq y sugerencia de verificar el domingo 8.
Gracias a Danko Durbić por sugerir en
>
lugar de==
.fuente
c+=(int)new DateTime(y,i,13).DayOfWeek==5?1:0;
usar el equivalentec+=new DateTime(y,i,8).DayOfWeek==0?1:0;
. El truco es restar5
, porque entonces puedes deshacerte del yesoint
, y también el número8
tiene un dígito menos que el número13
. ¡Domingo 8!int g(int y){return Enumerable.Range(1,12).Count(m=>new DateTime(y,m,8).DayOfWeek==0);}
. Por supuesto, como lambda esto esy=>Enumerable.Range(1,12).Count(m=>new DateTime(y,m,8).DayOfWeek==0)
..DayOfWeek<1
.c#
respuesta pero no está seguro de cómo aplicarlalinq
.DayOfWeek
con ningún otro número entero que no sea0
-error CS0019: Operator '<' cannot be applied to operands of type 'System.DayOfWeek' and 'int'
.PHP, 55 bytes
Corre con
echo <year> | php -nR '<code>'
.Básicamente lo mismo que intentó Oleg y Damir Kasipovic hizo, solo que con un mejor golf:
cada mes que comienza con un domingo, tiene un viernes 13.
Así que recorro los meses y cuento los primeros días que son domingos.
Descompostura
fuente
K, 42
.
fuente
Bash (
5247 caracteres)fuente
Rebol, 63
Ejemplo de uso en la consola Rebol:
La solución alternativa que recoge todo el viernes 13 en un año determinado es:
fuente
Bash y Sed, 39
ncal
imprime un calendario para el año dado con los días de la semana a la izquierda.sed
con una/g
bandera subscribe los 13 con nuevas líneasgrep -c
cuenta las líneas que comienzan con "2" (20 siempre sigue a 13)¡Gracias a @DigitalTrauma por encontrar un error en mi versión anterior y proponer una solución!
fuente
ncal $1|sed /F/s/13/\\n/g|grep -c ^\ 2
Scala,
7668 caracteresEn 78 caracteres:
def f(y:Int)=0 to 11 count(new java.util.GregorianCalendar(y,_,6).get(7)==6)
Nada fuera de lo común, excepto el uso de números mágicos para
DAY_OF_WEEK = 7
yFRIDAY = 6
.Versión de 68 caracteres:
def f(y:Int)=0 to 11 count(new java.util.Date(y-1900,_,6).getDay==5)
Sí, Java cambió los valores de las constantes del día de la semana entre las API.
fuente
new java.util.GregorianCalendar
tenga que ser tan largo :(Pitón 195/204
Solo funciona para años anteriores, porque
monthdatescalendar
devuelve un calendario para el año dado hasta ahora . Creo que queda mucho potencial de optimización :).Otra solución, funciona para cada fecha pero no es más pequeña:
fuente
Perl 6,
5553Vieja respuesta:
fuente
Python (v2) 120
fuente
Perl + lib POSIX 55
Con la idea de no buscar
13th
sino primero, y comosunday
es0
esto, ¡ahorre 3 caracteres! Gracias @ Iszi y Danko Durbić!Podría calcular 2010 a 2017 (para muestra) de esta manera:
(Ok, no hay nueva línea , pero eso no se preguntó;)
Mensaje antiguo: 63
En acción:
fuente
En Smalltalk (sabor Squeak / Pharo), implemente este método en Integer ( 86 caracteres)
A continuación, utilizar de esta manera:
2014countFriday13
.Por supuesto, podríamos usar un nombre más corto, pero entonces no sería Smalltalk
fuente
C ++ - Demasiados bytes :(
Intenté una solución que no utiliza ninguna biblioteca de fechas.
Encontré una solución bastante buena (si puedo decirlo yo mismo). Lamentablemente, no puedo hacerlo más corto que esto, lo que realmente me molesta porque parece que debería haber una mejor manera.
La solución depende de este algoritmo que tiene solo 44 bytes en sí mismo. Desafortunadamente necesito otros 100 bytes para envolverlo bien ...
La salida a través del código de retorno (en C ++, usar
cout
oprintf
algo así requiere otro#include
, lo que haría explotar aún más la solución).Conductor / programa de prueba:
Salida del programa controlador:
fuente
($m<3?$y--:$y-2)+3
en lugar ded=13,
,d+=m<3?y--:y-2,
yd+4
debería funcionar tan bien y ahorra mucho.+5
en lugar de+3
y-5
debería funcionar también y ahorra 2 bytes.for(m=0;++m<13;)
ahorra un byte. Moverm=0
a la cabeza de la función guarda otro byte; y pasar()%7||++f
a la cabeza del bucle guarda otro. Bajó de 149 a 136 bytes.Clojure,
207187 bytes-20 bytes al deshacerme del
import
espacio en blanco que perdí.A partir del 1 de enero del año dado, se repite cada día. Si el día es el viernes 13, aumenta el recuento. Continúa en bucle hasta que alcance el próximo año.
fuente
PHP, no incorporado, 81 bytes
Corre con
echo <year> | php -nR '<code>'
.Descompostura
Los días laborables se repiten cada 400 años.
En los resultados de 1600 a 1999 (por ejemplo), hay un período de 28 períodos con solo tres brechas:
Después de ajustar el año para estas brechas, podemos obtener el resultado con un simple hash:
No corto (95 bytes) pero bonito. Y podemos jugar al golf
fuente
for(;++$m<13;23*$m/9+($m<3?$y--:$y-2)+5+$y/4-$y/100+$y/400)%7?:$f++)$y=$argn;echo$f;
Japt
-x
, 10 bytesIntentalo
fuente