Insira um número e retorne o dia da semana

8

Não restrito a nenhuma linguagem de programação.

O que estou dizendo é que você passa 1 para ele e retorna segunda-feira, 7 corresponde ao domingo e assim por diante.

Eu consegui uma declaração de 146 bytes em Java para fazer o mesmo.

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"))))))));

Seu programa deve:

  • palavras completas de saída (STDOUT)
  • não trava se a entrada for menor que 1 ou maior que 7
CrazyMod
fonte
6
Não sei para que outras pessoas estão votando, mas espero que as pessoas não gostem do uso do "concurso de popularidade" em uma questão que é puramente uma questão de golfe. Geralmente, o concurso de popularidade é usado para perguntas que não têm uma maneira objetiva de decidir um vencedor.
Trichoplax
9
Esta questão não pode estar de acordo sobre o que quer que as pessoas escrevam. Uma declaração que encontra entrada em uma variável e a retorna ou um programa que grava no stdout? (Também é um uso bizarro do concurso de popularidade que, se for detectado, pode fazer muito para ajudar aqueles que querem matar a etiqueta completamente).
Peter Taylor
2
Você aprenderá o que funciona e o que faz uma boa pergunta fazendo perguntas exatamente como você é e obtendo feedback. Pessoalmente, achei que essa pergunta era simples demais para fazer um desafio interessante, mas você já tem três respostas em apenas meia hora, o que mostra que é difícil adivinhar o que faz um bom desafio até que você o faça. Com a nova reputação que você ganha com essa pergunta, em breve você poderá usar a sandbox para obter feedback sobre as ideias antes de publicá-las.
Trichoplax
2
Observe que as perguntas são independentes de idioma por padrão - você não precisa especificar que não está restrito a uma linguagem de programação.
Trichoplax
2
A pergunta diz que você deve enviar para stdout, mas a resposta aceita não o faz e até assume a existência de uma variável. Além disso, temos que produzir invalidse a entrada for inválida? A questão não afirma isso, mas o exemplo sugere isso.
precisa saber é o seguinte

Respostas:

8

Ruby, 69 ou 38 bytes

Aqui está uma maneira simples de melhorar seu código (escrito em Ruby, mas funciona da mesma forma em Java):

n>0&&n<8?%w{Mon Tues Wednes Thurs Fri Satur Sun}[n-1]+"day":"Invalid"
  • Combine os dois cheques inválidos em um.
  • Coloque todos os dias em uma matriz e use ncomo um índice.
  • Fatore o comum day.

Você pode torná-lo ainda mais curto se importar os nomes dos dias da semana de uma biblioteca, como Ruby:

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

Note que agora eu não diminuir n, mas sim levá-la módulo 7 para mapear 7a 0. Isso ocorre porque DAYNAMEScomeça no domingo.

Martin Ender
fonte
Gah, eu estava prestes a colocar uma versão Lua desta mesma coisa (a não ser que ia ser cerca de 100 personagens mais) ...
Kyle Kanos
caramba, eu não estava pensando nas linhas das matrizes. Eu tinha ficado tão envolvido no ensino médio, que não tinha percebido que poderia fundir os dois. surpreendente!
CrazyMod
Você pode fazer n> 0 e n <8 (removendo o segundo &) em Ruby? Eu sei que funciona em Java.
marcas
@bmarks Parece que você não pode devido a precedência, pelo menos antes do Ruby 2.0 (eu não tenho um intérprete do Ruby 2.x aqui agora).
Martin Ender
1
21 in Rebmu ... :-)
HostileFork disse que não confia em SE 18/08/19
9

Bash: 47 bytes

Ainda não há entrada no bash? Estou desapontado ...

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

Ele usa os dias da semana atual e simplesmente substitui o último dígito (11 a 17 de agosto de 2014 - 11 é segunda-feira, 12 é terça-feira etc.).

Ya Sen
fonte
Uau, que solução inteligente! Codificar uma data para isso é brilhante! Não há como o formato da data aceitar apenas '8' como o mês? E então você pode encontrar um par de mês / ano em que o primeiro é uma segunda-feira.
Cruncher,
Obrigado! date -d $1sept +%Atambém funciona (embora apenas este ano; reduz bytes para 6 * 9). O GNU dateé realmente flexível nesse assunto, então deve haver possibilidades adicionais.
Yasen
Se você postar isso como uma resposta em datevez de Bash, seriam meros 14-08-1$1- 9 bytes!
Ingo Bürk
São 46 bytes, não conte a nova linha à direita;
precisa saber é o seguinte
Bem, versão 2 vezes mais curta :): 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 saída diferente de zero se a entrada for inválida

Uso:

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

Javascript, 95 88 bytes

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

7 em binário é 0111, o que significa que você pode cortar alguns caracteres com uma operação bit a bit em vez de x>0&&x<8.

Editar: Removida a smatriz com a ajuda de edc65 .

Sean Latham
fonte
esse é um método legal!
CrazyMod
1
Método puro de fato. 1) Eu conto 95 bytes, e não 97. 2) Você não precisa variável ad s e pode fazer 88:x=prompt();alert("Invalid 0Mon0Tue0Wednes0Thurs0Fri0Satur0Sun".split(0)[x&~7?0:x]+"day")
edc65
Ah, isso é esperto! Vou atualizar minha postagem agora.
Sean Latham
5

C # - 26 bytes

Espera que o dia seja armazenado dentro n.
Não falha, conforme o esperado.
Desenvolvido por LINQPad ™

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

Agradecimentos especiais a bmarks e Stephan Schinkel pela economia de bytes e flexão de regras, respectivamente

William Barbosa
fonte
Você pode remover o segundo & no condicional? Eu não acho que a avaliação de curto-circuito aqui seja necessária.
bmarks
@bmarks você está correto, graças
William Barbosa
1
A pergunta não menciona para retornar "Inválido", apenas afirma que o programa não deve falhar. Então você pode escrever return ((DayOfWeek) (i% 7)). ToString (); (37 caracteres)
Stephan Schinkel
@StephanSchinkel Sim, eu acho que você está certo
William Barbosa
2

C #, 95 bytes

Em C #, você pode fazer algo assim:

return(i>7||i<0)?"invalid":new[]{"mon","tues","wednes","thurs","fri","satur","sun"}[i-1]+"day";
sm.abdullah
fonte
Há um erro na verificação dos limites, você precisa verificar isso i<1e pode salvar 2 bytes usando em |vez de ||(sem curto-circuito) e removendo os colchetes em torno da condição. É também mais curto para criar e dividir uma string, portanto, " mon tues wednes thurs fri satur sun".Split()[i]do que para criar uma matriz de string deste tamanho (note o espaço no início da string, o que economiza subtraindo 1 a partir de i)
VisualMelon
2

BrainFuck estendido : 104

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

Ungolfed (Idiomatic)

{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
fonte
2

T-SQL 36

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

Assume que a variável está armazenada em @. Se for uma entrada inválida (@> 7 ou @ <1), não seleciona nada.

Editar: Aparentemente, uma data pode ser um número. Removidos 5 caracteres com isso.

Editar 2: com base na primeira edição. Como é um int, não preciso usar DATEADD (); Eu posso usar adição normal em seu lugar.

marcações
fonte
2

Javascript 93 :(

q=prompt();alert(q<8&&q>0?'0mon0tues0wednes0thurs0fri0satur0sun'.split(0)[q]+'day':'invalid')
Kevin L
fonte
por que exatamente você usou perguntas e respostas <8?
CrazyMod
q && qq <8 verifica se q está entre 1 e 7
Kevin L
1
E se qfor -5?
Maçaneta
. :(, mas isso é um extra de 2 bytes para> 0 fixo usando truque ipi de bit, também salva 2 bytes
Kevin L
Funciona com q == 0?
Edc65
2

Lua - 57 bytes

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

Lua possui os.date () em sua biblioteca padrão e tem formatação. Portanto, você pode passar um tempo (neste caso "9e4 * (n + 3)") e pedir para retornar o formato "% A", que é o nome dos dias da semana. Além disso, muito útil em Lua é "a e b ou c". Se a for verdadeiro (no código a for "n> 0 e n <8"), ele retornará b, se a for falso (ou nulo), retornará c.

AndoDaan
fonte
1
Você pode fornecer uma explicação?
Cruncher
1
O OP solicitou especificamente o tratamento de erros, embora fosse bastante vago. Da próxima vez, peça esclarecimentos antes de postar uma resposta incompleta.
Rainbolt
1
Eu não acho que o espaço depois %Aé necessário
Kyle Kanos
@KyleKanos Você está certo. Obrigado!
precisa saber é o seguinte
2

Mathematica 19 16 bytes

DayName@{1,1,#}&

Como observou o Dr. Rebmu, 1º de janeiro de 1 dC é um bom ponto de partida. (Presumivelmente) caiu na segunda-feira.

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

Segunda-feira

DavidC
fonte
Por que setembro de 2014 e não 1º de janeiro do ano 1 DC ?
HostileFork diz que não confia em
A resposta é: não consegui pensar nisso. Mas vou incorporar sua sugestão.
19414
2

Bash - 21 19

Supondo que a entrada esteja na variável D:

date +%A -d$D"Jan1"

HTML + PHP - 26

Seja $dum texto de entrada

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

O registro de data e hora 86400 * 3 é o primeiro domingo desde o início do mundo UNIX.

Você pode testá-lo executando:

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

Perl, 60 bytes

Algo assim:

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

Se você quiser retornar uma mensagem e estiver preocupado com índices negativos, use esta (mais 8 caracteres):

$x>0&&qw{Mon Tues Wednes Thurs Fri Satur Sun}[$x-1]."day"||"Invalid"
Alexandre H.
fonte
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")

Basicamente, o mesmo pensamento que MartinButtner tinha, exceto cerca de 4,5 4,1 1,7 1,4 vezes mais. Supõe que né armazenado como uma variável em outro lugar.

Kyle Kanos
fonte
Para ser justo, você não precisa de nenhuma dessas E / S aqui.
Martin Ender
@ MartinBüttner: Eu acho que é mais se eu usar uma função
Kyle Kanos
Apenas espere nser armazenado em uma variável, como no snippet do OP.
Martin Ender
Sim, eu não esperava E / S do seu lado.
CrazyMod
1

Python (84)

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

Suponho que seja uma solução interessante. É preciso ter uma ideia de outro respondere que li em algum lugar (não consigo encontrá-lo, eu sei que ele estava neste site, portanto, se alguém souber, sinta-se à vontade para me dizer.) A string foi gerada com o seguinte programa J:

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

Tomando algumas dicas sutis desta resposta:

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

Bash 74 48 + mensagem de erro

Uma abordagem diferente, pois todas as outras respostas se concentram em armazenar as strings de alguma forma.

read x;((0<x&&x<8))&&date -d2007010$x +%A||echo out of range
user80551
fonte
qual é a contagem de bytes?
haskeller orgulhoso
@proudhaskeller Irrelevante como este não foi marcado como código-golf
user80551
você está certo, apenas todas as outras soluções têm uma contagem de bytes. esquisito.
haskeller orgulhoso
Essa é mais uma shresposta POSIX . Em bashvocê pode usar a avaliação aritmética. read x;((0<x&&x<8))&&date -d2007010$x +%A||echo out of rangeé mais curto.
manatwork
A questão apenas afirmou que o programa não deve falhar caso o número não esteja entre 1 e 7, para que você possa remover o ||echo out of range. Considerando que a solução aceita não segue as regras (imprimir em stdout) ... Mas se você deseja seguir o exemplo do OP, pode usar em invalidvez de out of range.
precisa saber é o seguinte
1

Perl, 54

De STDIN a STDOUT, nenhuma função de data, nenhuma falha.

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

PHP (56 bytes)

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

Clojure - 99 caracteres

Puro e simples, apesar das minhas melhores tentativas (iniciantes):

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

JS: 58

Supondo que n já esteja armazenado como uma variável.

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

Como uma função ES6 (mesmas premissas): 67

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

Isso apenas imprime "dia" para 0 e volta para n> 7

Isiah Meadows
fonte
"Terça-feira"? Além disso, sua descrição é imprecisa, ele retorna daypara 8e começa novamente a partir Mondayde 9.
precisa saber é o seguinte
@ nyuszika7h Obrigado pela captura.
Isiah Meadows
1

Rebmu : 21 caracteres

pcSYSTEM/locale/daysA

Para correr:

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

Números inválidos retornarão "nenhum".

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

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

Para aqueles que não estão familiarizados com o Rebmu, ele usa transições de caso para remover a necessidade de espaçamento - dentro dos limites do que é legalmente analisável. Em vez de usar um InitialCapsToBreak, ele usa CASEtransitionsTObreak, porque isso permite que um significado diferente seja atribuído a uma execução inicial de maiúsculas, se a execução inicial inicial for minúscula.

Portanto, é equivalente ao programa Rebol pick system/locale/days a. (Rebmu por convenção nomeia seu parâmetro de script como "a").

Salva um caractere sobre system/locale/days/(a):-)

HostileFork diz que não confia no SE
fonte
1

Haskell - 62

Envolve; 0é domingo, 8é segunda e assim por diante.

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

Se a impressão em stdout for necessária ( 68 bytes , a saída estará entre aspas duplas):

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

LiveScript - 49

Retorna undefineddayse a entrada for inválida. ;)

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

Se a impressão em stdout for necessária ( 60 bytes ):

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

Befunge-93 ( 206202 )

Este foi divertido de escrever. Tenho certeza de que isso pode ser feito de uma maneira melhor, mas… funciona! =) Pode ser experimentado aqui .

Teria sido ainda mais curto se #pulasse sobre cordas inteiras, em vez de apenas na célula 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",,,@

A idéia básica por trás disso: obtenha o número e continue diminuindo. Sempre que o diminuímos, o cursor se move para a direita, gira e é enviado um nível abaixo. Quando chegarmos ao zero, mova para a esquerda e pressione o nome da (primeira parte do) dia. A partir de então, o cursor se moverá diretamente para a parte inferior, onde a string é impressa e o "dia" é acrescentado.

Você pode ver como ele funciona usando o recurso "Etapa" no link para o intérprete online.

Edit: eu consegui raspar dois bytes, fazendo em >:#,_vez de >,,,,,,, o que é mais bonito também.

Ingo Bürk
fonte
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
fonte
Você provavelmente deve publicá-las como respostas separadas.
usar o seguinte código
Em Python: (0<n<8)é mais curto então (n in range(8)). split()também dividir string
AMK 28/08
1

Java 8 - 69 64 caracteres

Aqui está uma expressão no Java 8, incluindo a importação. Agora melhorado (graças a Tomáš Dvořák ):

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

Simplesmente imprime MONDAYpara valores falsos dei

Michael Easter
fonte
Dica: .name () é menor que .toString () e faz a mesma coisa. Você pode salvar 4 caracteres. Além disso, você pode usar apenas um e em vez de dois e salvar outro caractere.
Tomáš Dvořák
1

Python - 87

Eu não estou vendo amor suficiente pelo dict's .get () Este espera aser o número

dict(enumerate("mon,tues,wednes,thurs,fri,satur,sun".split(","),1)).get(a,"bad ")+"day"
profundo
fonte
Você pode salvar alguns caracteres removendo todas as ocorrências da daysua lista e adicionando +"day"no final do seu código.
precisa
Você também pode salvar alguns personagens, colocando todos os dias em uma cadeia e, em seguida, dividi-los em vez de colocá-los todos em separado na lista:"mon,tues,...".split(",")
ProgramFOX
Isso funciona muito bem, felicidades :-) #
3100
0

Python, 95 bytes

"%day"%["mon","tues","wednes","thurs","fri","satur","sun"][n-1] if 0<n<8 else "invalid"
Tom
fonte
2
segunda-feira? Eu li isso certo?
Trichoplax
Não tenho certeza de onde você obteve 95 bytes, pelo que sou 88. Consegui salvar 11 corrigindo o bug "monsday", usando concatenação de string em vez de %formatação, criando a lista a partir de um string usando split()e removendo espaços em branco desnecessários.
Undergroundmonorail
2
"mon tues wednes thurs fri satur sun".split()[n-1]+"day"if 0<n<8else"invalid"
Undergroundmonorail
@undergroundmonorail você pode economizar mais 6 bytes usando aspas simples em vez de aspas duplas
Trichoplax
2
@githubphagocyte Não sei dizer se você está brincando ou se está realmente errado sobre quantos bytes os caracteres de citação ocupam.
Undergroundmonorail
0

Python 2, 84 83 64

Supondo que n já esteja armazenado como uma variável.

import calendar as c;print c.day_name[n-1]if 0<n<8 else'Invalid' 
fsfd1100
fonte
A partir desse comentário , parece que a entrada pode ser ignorada.
precisa saber é o seguinte
0

Cobra - 43

print if(0<n<8,(n%7)to DayOfWeek,'Invalid')
Furioso
fonte