Ingrese un número y regrese el día de la semana

8

No está restringido a ningún lenguaje de programación.

Lo que digo es que le pasas 1 y regresa el lunes, 7 corresponde al domingo y así sucesivamente.

He logrado que una declaración de 146 bytes en Java haga lo mismo.

return (n<1?"invalid":(n<2?"monday":(n<3?"tuesday":(n<4?"wednesday":(n<5?"thursday":(n<6?"friday":(n<7?"saturday":(n<8?"sunday":"invalid"))))))));

Tu programa debe:

  • salida de palabras completas (STDOUT)
  • no bloquearse si la entrada es menor que 1 o mayor que 7
CrazyMod
fuente
66
No puedo saber por qué otras personas votan negativamente, pero espero que a la gente no le guste el uso del "concurso de popularidad" en una pregunta que es puramente una pregunta de golf. En general, el concurso de popularidad se usa para preguntas que no tienen una forma objetiva de decidir un ganador.
trichoplax
99
Esta pregunta no puede estar de acuerdo con lo que quiere que la gente escriba. ¿Una declaración que encuentra la entrada en una variable y la devuelve o un programa que escribe en stdout? (También es un uso extraño del concurso de popularidad que, si se da cuenta, podría hacer mucho para ayudar a aquellos que quieren eliminar la etiqueta por completo).
Peter Taylor
2
Aprenderá qué funciona y qué hace una buena pregunta haciendo preguntas como usted y recibiendo comentarios. Personalmente, pensé que esta pregunta era demasiado simple para hacer un desafío interesante, pero ya tienes 3 respuestas en solo media hora, lo que demuestra que es difícil adivinar qué es un buen desafío hasta que lo preguntas. Con la nueva reputación que obtiene de esta pregunta, pronto podrá usar el sandbox para obtener comentarios sobre ideas antes de publicarlas.
trichoplax
2
Tenga en cuenta que las preguntas son independientes del lenguaje de manera predeterminada; no necesita especificar que no está restringido a un lenguaje de programación.
trichoplax
2
La pregunta dice que debe salir a stdout, pero la respuesta aceptada no lo hace e incluso supone la existencia de una variable. Además, ¿tenemos que dar salida invalidsi la entrada no es válida? La pregunta no dice eso, pero el ejemplo lo sugiere.
nyuszika7h

Respuestas:

8

Ruby, 69 o 38 bytes.

Aquí hay una manera simple de mejorar su código (escrito en Ruby pero funciona de manera similar en Java):

n>0&&n<8?%w{Mon Tues Wednes Thurs Fri Satur Sun}[n-1]+"day":"Invalid"
  • Combina los dos cheques inválidos en uno.
  • Ponga todos los días en una matriz y úselo ncomo índice.
  • Factoriza lo común day.

Puede hacerlo aún más corto si importa los nombres de los días de la semana desde una biblioteca, como Ruby's:

n>0&&n<8?Date::DAYNAMES[n%7]:"Invalid"

Tenga en cuenta que ahora ya no disminuye nsino que tomo módulo 7 para asignar 7a 0. Esto es porque DAYNAMEScomienza con el domingo.

Martin Ender
fuente
Gah, estaba a punto de poner una versión Lua de esta misma cosa (excepto que iba a tener unos 100 caracteres más) ...
Kyle Kanos
maldita sea, no estaba pensando en las líneas de matrices en absoluto. Me había quedado tan atrapado en el ternario, que no me había dado cuenta de que podía fusionar los dos. ¡asombroso!
CrazyMod
¿Puedes hacer n> 0 & n <8 (eliminando el segundo &) en Ruby? Sé que funciona en Java.
Comentarios del
@bmarks Parece que no puede hacerlo debido a la precedencia, al menos antes de Ruby 2.0 (no tengo un intérprete de Ruby 2.x aquí en este momento).
Martin Ender
1
21 en Rebmu ... :-)
HostileFork dice que no confíes en SE
9

Bash: 47 bytes

Todavía no hay entrada bash? Estoy decepcionado ...

case $1 in
    [1-7]) date -d "14-08-1$1" +%A
esac

Utiliza los días de la semana actual y simplemente sustituye el último dígito (11-17 de agosto de 2014 - 11 es lunes, 12 es martes, etc.).

Yasen
fuente
¡Qué solución tan inteligente! ¡Codificar una fecha para esto es genial! ¿No hay forma de que el formato de fecha acepte solo '8' como mes? Y luego puedes encontrar un par mes / año donde el primero es un lunes.
Cruncher
¡Gracias! date -d $1sept +%Atambién funciona (aunque solo este año; reduce los bytes a 6 * 9). GNU datees realmente flexible en ese asunto, por lo que debería haber posibilidades adicionales.
Yasen
Si publica esto como respuesta en datelugar de Bash, ¡sería solo 14-08-1$19 bytes!
Ingo Bürk
Son 46 bytes, no cuente la nueva línea final;
nyuszika7h
Bueno, más de 2 veces la versión más corta :): codegolf.stackexchange.com/a/36424/11887 .
Avall
6

Marbelous 192 191 185 181

}0
=1=2=3=4=5=6=7--
&1&2&3&4&5&6&7{0
&8////////////
4D6F6E547565735765646E65735468757273467269536174757253756E646179
&1&1&1&2&2&2&2&3&3&3&3&3&3&4&4&4&4&4&5&5&5&6&6&6&6&6&7&7&7&8&8&8

Código de salida distinto de cero si la entrada no es válida

Uso:

# marbelous.py -r day-of-week.mbl 2
Tuesday
Sparr
fuente
6

Javascript, 95 88 bytes

x=prompt();alert("Invalid 0Mon0Tue0Wednes0Thurs0Fri0Satur0Sun".split(0)[x&~7?0:x]+"day")

7 en binario es 0111, lo que significa que puede eliminar algunos caracteres con una operación bit a bit en lugar de x>0&&x<8.

Editar: se eliminó la smatriz con la ayuda de edc65 .

Sean Latham
fuente
ese es un buen método!
CrazyMod
1
Método ordenado de hecho. 1) Cuento 95 bytes, no 97. 2) No necesita variable de anuncios y puede hacer 88:x=prompt();alert("Invalid 0Mon0Tue0Wednes0Thurs0Fri0Satur0Sun".split(0)[x&~7?0:x]+"day")
edc65
Ah, eso es inteligente! Actualizaré mi publicación ahora.
Sean Latham
5

C # - 26 bytes

Espera que el día se almacene en el interior n.
No se bloquea, como se esperaba.
Desarrollado por LINQPad ™

((DayOfWeek)(n%7)).Dump();

Un agradecimiento especial a bmarks y Stephan Schinkel por guardar bytes y doblar reglas, respectivamente

William Barbosa
fuente
¿Se puede eliminar el segundo y en el condicional? No creo que la evaluación de cortocircuito aquí sea necesaria.
comentarios
@bmarks Tienes razón, gracias
William Barbosa
1
La pregunta no menciona que devuelva "Inválido", solo indica que el programa no debe bloquearse. Entonces podría escribir return ((DayOfWeek) (i% 7)). ToString (); (37 caracteres)
Stephan Schinkel
@StephanSchinkel Sí, supongo que tienes razón
William Barbosa
2

C #, 95 bytes

En C # puedes hacer algo como esto:

return(i>7||i<0)?"invalid":new[]{"mon","tues","wednes","thurs","fri","satur","sun"}[i-1]+"day";
sm.abdullah
fuente
Hay un error en la comprobación de límites, debe verificarlo i<1y puede guardar 2 bytes utilizando en |lugar de ||(no en cortocircuito) y eliminando los corchetes alrededor de la condición. También es más corto crear y dividir una cadena de manera " mon tues wednes thurs fri satur sun".Split()[i]que crear una matriz de cadena de este tamaño (observe el espacio al comienzo de la cadena, lo que ahorra restando 1 de i)
VisualMelon
2

BrainFuck extendido : 104

{a))<(->>}+>,49-(-(-(-(-(-((-)<->>|"sun")<(->>|"satur"&a|"fri"&a|"thurs"&a|"wednes"&a|"tues"&a|"mon")|"day"

Sin Golf (Idiomático)

{main 
  :flag +
  :input

  $input &read_number -
  (-
   (-
    (-
     (-
      (-
       (        $input &reset  ; 7-9
                $flag  &reset
                |"sun" &reset )

        $flag ( &reset         ; 6 
                |"satur" &reset  ))

       $flag (  &reset         ; 5
                |"fri" &reset    ))

      $flag (   &reset         ; 4
                |"thurs" &reset  ))

     $flag (    &reset         ; 3
                |"wednes" &reset ))

    $flag (     &reset         ; 2
                |"tues" &reset   ))

   $flag (      &reset         ; 1
                |"mon" &reset    )

   |"day"
}
{reset (-)}
{read_number , 48- }

;; call main
&main
Sylwester
fuente
2

T-SQL 36

SELECT DATENAME(w,@+6)WHERE(6+@)/7=1

Asume que la variable se almacena en @. Si es una entrada no válida (@> 7 o @ <1), entonces no selecciona nada.

Editar: Aparentemente, una fecha puede ser un número. Se eliminaron 5 caracteres con eso.

Edición 2: Basado en la primera edición. Como es un int, no tengo que usar DATEADD (); Puedo usar la suma normal en su lugar.

comentarios
fuente
2

Javascript 93 :(

q=prompt();alert(q<8&&q>0?'0mon0tues0wednes0thurs0fri0satur0sun'.split(0)[q]+'day':'invalid')
Kevin L
fuente
¿por qué exactamente has usado q && q <8?
CrazyMod
q && qq <8 comprueba si q está entre 1 y 7
Kevin L
1
¿Y si qes así -5?
Pomo de la puerta
:( pero eso es un extra de 2 bytes para> 0. Solucionado con el truco de bits de ipi, también ahorra 2 bytes
Kevin L
¿Funciona con q == 0?
edc65
2

Lua - 57 bytes

print(n>0 and n<8 and os.date("%A",9e4*(n+3))or"Invalid")

Lua tiene os.date () en su biblioteca estándar y tiene formato. Por lo tanto, puede pasar un tiempo (en este caso, "9e4 * (n + 3)") y solicitar la devolución del formato "% A", que son los nombres de los días de la semana. Además, muy útil en Lua es "a y b o c". Si a es verdadero (en el código a es "n> 0 yn <8") devuelve b, si a es falso (o nulo) devuelve c.

AndoDaan
fuente
1
¿Puedes dar una explicación?
Cruncher
1
El OP solicitó específicamente el manejo de errores, aunque fue bastante vago. La próxima vez, solicite aclaraciones antes de publicar una respuesta incompleta.
Rainbolt
1
No creo que el espacio después %Asea ​​necesario
Kyle Kanos
@KyleKanos Tienes razón. ¡Gracias!
AndoDaan
2

Mathematica 19 16 bytes

DayName@{1,1,#}&

Como señaló el Dr. Rebmu, el 1 de enero de 1 AD es un buen lugar para comenzar. (Presumiblemente) cayó un lunes.

    DayName@{2014, 9, #} &[1]

lunes

DavidC
fuente
¿Por qué septiembre de 2014 y no el 1 de enero del año 1 DC ?
HostileFork dice que no confíes en SE
La respuesta es: no pude pensar en eso. Pero incorporaré tu sugerencia.
DavidC
2

Golpe - 21 19

Suponiendo que la entrada está en variable D:

date +%A -d$D"Jan1"

HTML + PHP - 26

Dejar $dser un texto de entrada

<?=date('l',86400*(3+$d));

La marca de tiempo 86400 * 3 es el primer domingo desde el comienzo del mundo UNIX.

Puede probarlo ejecutando:

<?php $d=3; ?>
<?=date('l',86400*(3+$d));
avall
fuente
1

Perl, 60 bytes

Algo como esto:

$x&&qw{Mon Tues Wednes Thurs Fri Satur Sun}[$x-1]."day"||die

Si desea devolver un mensaje y le preocupan los índices negativos, puede usar este (8 caracteres más):

$x>0&&qw{Mon Tues Wednes Thurs Fri Satur Sun}[$x-1]."day"||"Invalid"
Alexandre H.
fuente
1

Lua 134 119 115 100 98

q={"mon","tues","wednes","thurs","fri","satur","sun"}print(n<8 and n>0 and q[n].."day"or"invalid")

Básicamente el mismo pensamiento que MartinButtner tenía, excepto alrededor de 4.5 4.1 1.7 1.4 veces más. Asume que nse almacena como una variable en otro lugar.

Kyle Kanos
fuente
Para ser justos, no necesita nada de esa E / S aquí.
Martin Ender
@ MartinBüttner: Creo que es más largo si uso una función
Kyle Kanos
Solo espera nser almacenado en una variable, como en el fragmento del OP.
Martin Ender
Sí, no esperaba ninguna E / S de tu lado.
CrazyMod
1

Pitón (84)

lambda a:'imtwtfssnouehrauvneduitnadsnrdudladesaraiyasdydyd yda a    ay y    y'[a if 0<a<8 else 0::8]

Supongo que es una solución interesante. Toma una idea de otra respuesta que leí en alguna parte (no puedo encontrarla, sé que estaba en este sitio, así que si alguien sabe no dudes en decirme). La cadena se generó con el siguiente programa J:

,|:>'invalid';'monday';'tuesday';'wednesday';'thursday';'friday';'saturday';'sunday'

Tomando algunas sugerencias sutiles de esta respuesta:

lambda a:' mtwtfssouehrauneduitn snr u   es r   s'[a::7]+'day'if 0<a<8 else'invalid'
ɐɔıʇǝɥʇuʎs
fuente
1

Bash 74 48 + mensaje de error

Un enfoque diferente ya que todas las demás respuestas se centran en almacenar las cadenas de alguna forma.

read x;((0<x&&x<8))&&date -d2007010$x +%A||echo out of range
usuario80551
fuente
¿Cuál es el recuento de bytes?
orgulloso Haskeller
@proudhaskeller Irrelevante ya que esto no ha sido etiquetado como code-golf
user80551
tienes razón, solo todas las otras soluciones tienen un conteo de bytes. extraño.
orgulloso Haskeller
Esa es más una shrespuesta POSIX . En bashusted puede usar la evaluación aritmética. read x;((0<x&&x<8))&&date -d2007010$x +%A||echo out of rangeEs más corto.
manatwork
La pregunta solo decía que el programa no debería bloquearse en caso de que el número no esté entre 1 y 7, por lo que puede eliminarlo ||echo out of range. Teniendo en cuenta que la solución aceptada no sigue las reglas (imprimir en stdout) ... Pero si desea seguir el ejemplo del OP, puede usar en invalidlugar de out of range.
nyuszika7h
1

Perl, 54

De STDIN a STDOUT, sin funciones de fecha, sin bloqueo.

print((a,Mon,Tues,Wednes,Thurs,Fri,Satur,Sun)[<>].day)
Thaylon
fuente
1

PHP (56 bytes)

$d=1;echo$d>0&&$d<8?date('D',255600+$d*86400):'Invalid';
demonio
fuente
1

Clojure - 99 caracteres

Claro y simple, a pesar de mis mejores intentos (novato):

(defn f[x](get{1"monday"2"tuesday"3"wednesday"4"thursday"5"friday"6"saturday"7"sunday"}x"invalid"))
Michael Easter
fuente
1

JS: 58

Suponiendo que n ya está almacenado como una variable.

"0Mon0Tues0Wednes0Thurs0Fri0Satur0Sun".split(0)[n%8]+"day"

Como una función ES6 (mismos supuestos): 67

let d=n=>"0Mon0Tues0Wednes0Thurs0Fri0Satur0Sun".split(0)[n%8]+"day"

Esto solo imprimirá "día" para 0 y recorrerá n> 7

Isiah Meadows
fuente
"Martes"? Además, su descripción es inexacta, devuelve daypara 8y comienza de nuevo desde Mondayal 9.
nyuszika7h
@ nyuszika7h Gracias por la captura.
Isiah Meadows
1

Rebmu : 21 caracteres

pcSYSTEM/locale/daysA

Correr:

>> rebmu/args {pcSYSTEM/locale/daysA} 1 
== "Monday"

Los números no válidos devolverán "ninguno".

>> rebmu/args {pcSYSTEM/locale/daysA} 8 
== none

>> rebmu/args {pcSYSTEM/locale/daysA} 0
== none

Para aquellos que no están familiarizados con Rebmu, utiliza transiciones de casos para eliminar la necesidad de espaciado, dentro de los límites de lo que es legalmente analizable. En lugar de usar InitialCapsToBreak, usa CASEtransitionsTObreak, porque eso permite asignar un significado diferente a una ejecución inicial de mayúsculas si la ejecución inicial inicial está en minúsculas.

Por lo tanto, es equivalente al programa Rebol pick system/locale/days a. (Rebmu por convención nombra su parámetro de script como "a").

Guarda un personaje sobre system/locale/days/(a):-)

HostileFork dice que no confíes en SE
fuente
1

Haskell - 62

Envuelve alrededor; 0es domingo, 8es lunes, etc.

words"Mon Tues Wednes Thurs Fri Satur Sun"!!(mod(n-1)7)++"day"

Si se requiere imprimir en stdout ( 68 bytes , la salida está entre comillas dobles):

print$words"Mon Tues Wednes Thurs Fri Satur Sun"!!(mod(n-1)7)++"day"
nyuszika7h
fuente
1

LiveScript - 49

Devuelve undefineddaysi la entrada no es válida. ;)

<[Mon Tues Wednes Thurs Fri Satur Sun]>[n-1]+\day

Si se requiere imprimir en stdout ( 60 bytes ):

console.log<[Mon Tues Wednes Thurs Fri Satur Sun]>[n-1]+\day
nyuszika7h
fuente
1

Befunge-93 ( 206208 )

Este fue divertido de escribir. Estoy seguro de que se puede hacer de una mejor manera, pero ... ¡funciona! =) Se puede probar aquí .

#Hubiera sido aún más corto si saltara sobre cadenas enteras en lugar de solo la celda individual.

&1-    v
vv"Mon"># :# !_
> 1-    v
vv"Tues"># :# !_
> 1-      v
vv"Wednes"># :# !_
> 1-     v
vv"Thurs"># :# !_
> 1-   v
vv"Fri"># :# !_
> 1-     v
vv"Satur"># :# !_
> 1-   v
vv"Sun"># :# !_
>>:#,_"yad",,,@

La idea básica detrás de esto: obtener el número y seguir disminuyendo. Cada vez que lo disminuimos, el cursor se mueve hacia la derecha, se envuelve y se envía un nivel más bajo. Una vez que lleguemos a cero, muévete a la izquierda y presiona el (primera parte del) nombre del día. A partir de ese momento, el cursor se moverá directamente hacia la parte inferior donde se imprime la cadena y se agrega "día".

Puede ver cómo funciona utilizando la función "Paso" en el enlace al intérprete en línea.

Editar: logré eliminar dos bytes haciendo en >:#,_lugar de >,,,,,,, que también es pretter.

Ingo Bürk
fuente
1

MATLAB: 33

datestr(3:9,'dddd');ans(1:7==n,:)

MATLAB: 71

{'mon';'tues';'wednes';'thurs';'fri';'satur';'sun'};[ans{1:7==2} 'day']

Haskell: 75

g n=((++"day").last.take(abs n).words)"mon tues wednes thurs fri satur sun"

Haskell: 97

f n=if elem n[1..7]then["mon","tues","wednes","thurs","fri","satur","sun"]!!n++"day"else"invalid"

Python 3.4.1: 81

'invalid mon tues wednes thurs fri satur sun'.split(' ')[n*(n in range(8))]+'day'
Minar Ashiq Tishan
fuente
Probablemente debería publicarlos como respuestas separadas.
nyuszika7h
En Python: (0<n<8)es más corto entonces (n in range(8)). split()también cuerda dividida
AMK
1

Java 8 - 69 64 caracteres

Aquí hay una expresión en Java 8, incluida la importación. Ahora mejorado (gracias a Tomáš Dvořák ):

import java.time.*;
return DayOfWeek.of((i>0&i<8)?i:1).name();

Simplemente imprime MONDAYpara valores falsos dei

Michael Easter
fuente
Consejo: .name () es más corto que .toString () y hace lo mismo. Puedes guardar 4 caracteres. También puede usar solo uno y en lugar de dos y guardar otro carácter.
Tomáš Dvořák
1

Python - 87

No estoy viendo suficiente amor para dict's .get () Este espera aser el número

dict(enumerate("mon,tues,wednes,thurs,fri,satur,sun".split(","),1)).get(a,"bad ")+"day"
profundo
fuente
Puede guardar algunos caracteres eliminando todas las apariciones de daysu lista y agregarlas +"day"al final de su código.
ProgramFOX
También puede guardar algunos caracteres poniendo todos los días en una cadena y luego dividiéndolos en lugar de ponerlos por separado en la lista:"mon,tues,...".split(",")
ProgramFOX
Eso funciona bien, saludos :-)
deepy
0

Python, 95 bytes

"%day"%["mon","tues","wednes","thurs","fri","satur","sun"][n-1] if 0<n<8 else "invalid"
Tom
fuente
2
lunes ¿Lo leí bien?
trichoplax
No estoy seguro de dónde obtuviste 95 bytes, según mi recuento es 88. Logré guardar 11 solucionando el error "lunes", usando la concatenación de cadenas en lugar de %formatear, creando la lista a partir de una cadena usando split()y eliminando espacios en blanco innecesarios.
undergroundmonorail
2
"mon tues wednes thurs fri satur sun".split()[n-1]+"day"if 0<n<8else"invalid"
undergroundmonorail
@undergroundmonorail puede guardar otros 6 bytes usando comillas simples en lugar de comillas dobles
trichoplax
2
@githubphagocyte No puedo decir si estás bromeando o si estás seriamente equivocado con respecto a cuántos bytes de caracteres de comillas ocupan.
undergroundmonorail
0

Pitón 2, 84 83 64

Suponiendo que n ya está almacenado como una variable.

import calendar as c;print c.day_name[n-1]if 0<n<8 else'Invalid' 
fsfd1100
fuente
De este comentario , parece que la entrada puede ser ignorada.
Kyle Kanos
0

Cobra - 43

print if(0<n<8,(n%7)to DayOfWeek,'Invalid')
Οurous
fuente