Frohes neues Jahr 2016!

40

Ihre Eingabe ist eine ganze Zahl zwischen 1970 und 2090 (einschließlich), die ein Jahr darstellt. Ihr Programm sollte das nächste Jahr ausgeben, an dem der Neujahrstag auf denselben Wochentag fällt wie das Eingabejahr.

Testfälle:

Unten sind die Beispielein- und -ausgänge aufgeführt

2001 => 2007
2047 => 2058
2014 => 2020
1970 => 1976
1971 => 1982
1977 => 1983
2006 => 2012

20% Bonus: Geben Sie den Wochentag des Neujahrs aus

2001 => 2007 (Mon)
2047 => 2058 (Tue)
2014 => 2020 (Wed)
1970 => 1976 (Thu)
1971 => 1982 (Fri)
1977 => 1983 (Sat)
2006 => 2012 (Sun)

30% Bonus: AusgabeAdvance Happy New Year, <year>

2010 => Advance Happy New Year, 2016

50% Bonus: Machen Sie beide oben genannten Boni

2010 => Advance Happy New Year, 2016 (Fri)

Schreiben Sie ein Programm, das Eingaben von STDIN liest oder Befehlszeilenargumente akzeptiert, oder eine Funktion, die ein Argument akzeptiert.

Hinweis: Fügen Sie nach Möglichkeit einen Link hinzu, um Ihren Code zu testen.

Bestenliste:

Vasu Adari
quelle
6
Ich habe das Gefühl, dass jede Herausforderung für ein einzelnes Datum die Berechnung der Schaltjahre als Teilproblem erfordert, und dass sie veraltet ist.
15.
Verwandte: diese Frage .
Addison Crump
@xnor Wenn das nicht der Fall wäre, wäre es nur eine +7 gewesen. Dh "zu breit"
Erik der Outgolfer
@EriktheGolfer Nein. Als ich diesen Kommentar schrieb, war meine Antwort die akzeptierte.
Dennis

Antworten:

1

Gelee, 9 Bytes

%4*3%7+5+

Dies ist eine monadische Kette, die ein ganzzahliges Befehlszeilenargument als Eingabe verwendet. Es benutzt meinen (x+5+(x%4)**3%7)Algorithmus.

Probieren Sie es hier aus . Obwohl dies die aktuelle Version von Jelly ist, funktioniert sie auch in dieser Version , die der Herausforderung vorausgeht. (Danke @Dennis!)

Lirtosiast
quelle
Das ist großartig! Ich kann bestätigen, dass es mit dieser Überarbeitung des Jelly-Interpreters funktioniert , die der Herausforderung vorausgeht.
Dennis
31

Mathematica, 45 37 27 24 Bytes

#+5[6,6,11][[#~Mod~4]]&

Verbesserungen dank @ MartinBüttner (10 Bytes) und @ChipHurst (weitere 3 Bytes).

martin
quelle
7
Oh wow. Niemand scheint dieses Muster bemerkt zu haben, aber es funktioniert.
Lynn
4
Hier ist eine etwas kürzere Version:#+5[6,6,11][[#~Mod~4]]&
Chip Hurst
@ChipHurst sehr klug mit 5[6, 6, 11][[0]]:)
Martin
18

CJam, 21 12 11 Bytes

{_9587Cb=+}

@ Martin fand eine sehr einfache Methode!

Probieren Sie es hier aus .

EDIT: Danke, Dennis!

Lynn
quelle
1
@ Mauris Könnten Sie eine Erklärung hinzufügen?
Vasu Adari
@ Vasu: Dieser Code ist eine anonyme Funktion, die denselben 5 6 6 11Trick implementiert, der auch in anderen Antworten verwendet wird, aber die Liste wird als "die Ziffern von 9587 in Basis 12" codiert .
Lynn
Habe ich, danke. Ich wollte, dass Sie eine Erklärung hinzufügen, damit Leute, die Ihre Antwort überprüfen, verstehen, wie es in der Sprache funktioniert.
Vasu Adari
10

gs2, 12 bytes

V@¶4☻s%☺♀i50

Übersetzung meiner CJam-Antwort. Wie gewohnt in CP437 codiert. Probieren Sie es online !

Lynn
quelle
Der Link führt zu Code, der 2spooky4me erzeugt, und wenn ich den obigen Code ausschneide und einfüge, erhalte ich das falsche Jahr: imgur.com/VAkXT0k (mit "falschem Jahr" meine ich, ich erhalte ein Jahr früher als das beabsichtigte Jahr)
question_asker
Ich hatte ein Byte vergessen. Versuch's jetzt.
Lynn
Ich habe den Link auch bearbeitet.
Lynn
Cool, es funktioniert jetzt
question_asker
8

JavaScript (ES6), 50 49 20 Bytes (keine Boni)

a=>a+[5,6,6,11][a%4]

Der Algorithmus von @martin erweist sich als viel kleiner, also habe ich mich entschieden.

Ich habe mich für einen mathematischen Ansatz entschieden, da JavaScript in der Regel ausführlich ist. Der Code ist so kurz, dass Boni ihn nur verlängern.

Hier ist meine vorherige Antwort (49 Bytes) und meine ursprüngliche Antwort (50 Bytes):

F=(a,b=a)=>((a+--a/4|0)-(b++/4+b|0))%7?F(++a,b):b

F=(a,b=a)=>(f=c=>(c--+c/4|0)%7)(a)-f(++b)?F(a,b):b

Sie arbeiten, indem sie das Jahr nehmen und eine Zahl (0-6) berechnen, um den "Starttag des Jahres" darzustellen. Da der Datumsbereich für diese Herausforderung im Bereich von Jahren liegt, die einfachen Schaltjahrregeln folgen (kein Überspringen bei 2000), ist die Berechnung relativ einfach. Dann ist es nur eine Frage des Vorwärtsvergleichs, um Jahre zu finden, die mit demselben Wert beginnen. Die Rekursion erwies sich als der prägnanteste Weg, dies zu tun.

Mwr247
quelle
7

Pyth, 14 12 11 Bytes

+QC@"♣♠♠♂"Q

Die vier Bytes in der Zeichenfolge sollten sein 05 06 06 0B.

EDIT: Danke, FryAmTheEggman!

EDIT: Danke, Dennis!

Lynn
quelle
6

JavaScript (ES6), 104 Byte - 50% Bonus = 52

y=>eval('for(a=0;a!=(b=(new Date(""+y++)+"").slice(0,3));a=a||b)`Advance Happy New Year, ${y} (`')+b+")"

Erläuterung

y=>
  eval(`                  // eval enables for loop without {} or return
    for(
      a=0;                // a = first day of input year
      a!=                 // check if the day of the current year is equal to the first
        (b=(new Date(     // b = day of current year
          ""+y++)+"")     // cast everything as strings!
            .slice(0,3)); // the first 3 letters of the date string are the day name
      a=a||b              // set a to the day on the first iteration
    )

      // return the string
      \`Advance Happy New Year, \${y} (\`
  `)+b+")"

Prüfung

user81655
quelle
6

Z80-Maschinencode, 12 Byte

Eine zu speichernde Z80-Prozedur 0000h, die mit der Eingabe in aufgerufen wird HL, und alle anderen Register löschen:

.org 0000h
              ; Bytes   ; Explanation
  ;---------------------------------------------------------------
  DEC B       ; 05      ; 
  LD B, 6     ; 06 06   ;   
  DEC BC      ; 0B      ;
  LD A, 3     ; 3E 03   ;   A = 3
  AND L       ; A5      ;   A = input & 3
  LD E, A     ; 5F      ;   A = input & 3     DE = input & 3
  LD A, (DE)  ; 1A      ;   A = [input & 3]   DE = input & 3
  LD E, A     ; 5F      ;   A = [input & 3]   DE = [input & 3]
  ADD HL, DE  ; 19      ;   HL = input + offset
  RET         ; C9      ;

Die ersten drei Befehle sind "NOPs", werden jedoch später im Code als Daten indiziert. Bei der Rückkehr ist die Ausgabe in HL.

Lynn
quelle
Ja, ich habe es dem Beitrag hinzugefügt.
Lynn
Sieht für die Jahre 2097 und 2098 nicht richtig aus, für die jeweils 7 und 12 hinzugefügt werden müssen.
Toby Speight
1
Das OP sagt, dass das Eingabejahr garantiert im Bereich 1970-2090 liegt.
Lynn
6
Ich mag keine Fragen, die sich ändern, nachdem ich sie beantwortet habe!
Toby Speight
2
Dürfen Sie angeben, dass die Eingabe in ist DEund Sie daher verwenden können LD A, 3; AND E; LD L, A; LD L, (HL);?
Neil
5

Python 3, 140 100 102 84,5 154 * 0,5 = 77 Byte

Ich könnte wahrscheinlich eine bessere Lösung mit Sakamotos Algorithmus schreiben, aber das wird vorerst reichen

Ich lag richtig. Hier ist eine Implementierung unter Verwendung des Sakamoto-Algorithmus.

def s(y):
 d=lambda j:(j+j//4)%7
 for i in range(y,y+15):
  if d(i)==d(y-1):return"Advance Happy New Year, %d (%s)"%(-~i,"SMTWTFSuouehranneduit"[d(i)::7])

Erläuterung:

def day_of_the_week(year):
    return (year + year//4 - 1 + 0 + 1) % 7
    # The month code for January is 0, and you add 1 from January *1*.
    # The -1 is to correct for starting on Saturday 
    # and so that it cancels out the 1 from January 1.

def new_years(this_year):
# But in Sakamoto's algorithm, if the month is January or February, we must subtract 1.
    weekdays = "SunMonTueWedThuFriSat"
    for item in range(this_year, this_year + 15):
        if day_of_the_week(this_year - 1) == day_of_the_week(item):
            day = weekdays[day_of_the_week(item)*3 : day_of_the_week(item)*3+3]
            return "Advance Happy New Year, %d (%s)"%(item + 1, day)
        # So we subtract from every year we check, including this_year
        # And add 1 back in at the end
        # And print the greeting, the year, and the corresponding day of the week
Sherlock9
quelle
Ich habe die Frage aktualisiert. Sie müssen nicht jahrhundertelang nachschauen.
Vasu Adari
1
Wie wäre es w="SMTWTFSuouehranneduit"und dann drucken w[d(i)::7]?
Lynn
4

Im Ernst, 35 17 Bytes

[5,6,6,11] Trick rettet den Tag.

4,;)%[5,6,6,11]E+

Probieren Sie es online aus

Erläuterung:

4,;)%[5,6,6,11]E+
4,;)%              push input, input % 4
     [5,6,6,11]E   push (input % 4)th element of [5,6,6,11]
                +  add to the input

Alte Version:

,;;D`45/*≈7@%`;╝ƒ╗35*r+`╛ƒ╜=`M1@íu+

Probieren Sie es online aus

Erläuterung:

,;;D`45/*≈7@%`;╝ƒ╗35*r+`╛ƒ╜=`M1@íu+
,;;                                  push 3 copies of the input (n)
   D                                 decrement the top copy of n
    `45/*≈7@%`;╝                     push Sakamoto's algorithm as a function and save a copy in register 1
                ƒ╗                   call Sakamoto's algorithm function and save result in register 0
                  35*r+              push [n, n+1, ..., n+14]
                       `    `M       map the function:
                        ╛ƒ╜=           push Sakamoto's algorithm, call, push 1 if equal to value in register 0 else 0
                              1@í    get the index of the first 1
                                 u+  increment and add n

Sakamotos Algorithmus:

45/*≈7@%
45/*      multiply by 5/4
    ≈     floor
     7@%  mod 7
Mego
quelle
4

C 31 Bytes

Nach der Bearbeitung der Frage, die den Eingabebereich auf 1970-2090 einschränkt, wird dies ziemlich trivial:

f(x){return"\5\6\6\13"[x%4]+x;}

Ohne die Nicht-Schaltjahre des Jahrhunderts gibt es eine einfache Folge von 5,6,6,11 Intervallen für die erste Wiederholung desselben Tages.

Vollständige Lösung des ursprünglichen Problems (nicht auf 2090 beschränkt), 90 Bytes:

f(x){return(x-1)%100>89&&(x+9)/100%4?"\6\14\5\6\6\6\6\7\14\6"[x%10]+x:"\5\6\6\13"[x%4]+x;}

Testprogramm:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    while (*++argv)
        printf("Advance Happy New Year, %d\n", f(atoi(*argv)));
    return !argc;
}

Testlauf:

$ ./66656 2001 2047 2014 1970 1971 1977 2006
Advance Happy New Year, 2007
Advance Happy New Year, 2058
Advance Happy New Year, 2020
Advance Happy New Year, 1976
Advance Happy New Year, 1982
Advance Happy New Year, 1983
Advance Happy New Year, 2012
Toby Speight
quelle
4

R 143 136 * 0,5 = 68 Bytes

G=function(y)strftime(paste(y,1,1,sep='-'),'%a')
d=seq(y<-scan(),y+14);sprintf("Advance Happy New Year, %i (%s)",d[G(d)==(w=G(y))][2],w)

Verwenden Sie den Namen %Afür den ganzen Tag anstelle von `% a, abhängig vom gewünschten Status.

R, 120 · 0,7 = 84 Bytes

G=function(y)as.POSIXlt(paste(y,1),,"%Y %j")$wday
d=seq(y<-scan(),y+14);cat("Advance Happy New Year,",d[G(d)==G(y)][2])

R, 90 Bytes

G=function(y)as.POSIXlt(paste(y,1),,"%Y %j")$wday
d=seq(y<-scan(),y+14);d[G(d)==G(y)][2]

Alle obigen Antworten sind abgeleitete Arbeiten, die auf der Antwort von @plannapus basieren. Verwenden Sie das ;Trennzeichen, um zu vermeiden, dass Sie sourcedie Datei benötigen, oder führen Sie sie als Skript in der Befehlszeile aus.

Tensibai
quelle
1
+1 habe ich ganz vergessen weekdays, nett.
Plannapus
@plannapus Danke :) (Ich habe die Zeilenumbrüche gezählt und das Dateisystem gefragt, da ich unter Windows 2 Bytes habe, aber am Ende keine Zeilenumbrüche habe, die eine POSIX-Datei haben sollte. Es ist also fair, sie so zu halten Eigentlich)
Tensibai
3

R, 145 Bytes -50% -> 72,5

y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%a");x=y+1;while(F(x)!=F(y))x=x+1;sprintf("Advance Happy New Year, %i (%s)",x,F(x))

Beispiele:

> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%a");x=y+1;while(F(x)!=F(y))x=x+1;sprintf("Advance Happy New Year, %i (%s)",x,F(x))
1: 2006
2: 
Read 1 item
[1] "Advance Happy New Year, 2012 (Sun)"
> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%a");x=y+1;while(F(x)!=F(y))x=x+1;sprintf("Advance Happy New Year, %i (%s)",x,F(x))
1: 1977
2: 
Read 1 item
[1] "Advance Happy New Year, 1983 (Sat)"
> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%a");x=y+1;while(F(x)!=F(y))x=x+1;sprintf("Advance Happy New Year, %i (%s)",x,F(x))
1: 2014
2: 
Read 1 item
[1] "Advance Happy New Year, 2020 (Wed)"

R, 97 Bytes (ohne Bonus)

y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w");x=y+1;while(F(x)!=F(y))x=x+1;x

Mit neuen Zeilen eingerückt:

y = scan() #Takes input from stdin
F = function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w") #Year to Weekday
x = y+1
while(F(x) != F(y)) x = x+1
x

Testfälle:

> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w");x=y+1;while(F(x)!=F(y))x=x+1;x
1: 1977
2: 
Read 1 item
[1] 1983
> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w");x=y+1;while(F(x)!=F(y))x=x+1;x
1: 2006
2: 
Read 1 item
[1] 2012
> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w");x=y+1;while(F(x)!=F(y))x=x+1;x
1: 2016
2: 
Read 1 item
[1] 2021
Plannapus
quelle
Ich verstehe diesen Wunsch nicht, auf eine hässliche Linie zu kommen, ein Wagenrücklauf ist nicht ;
teuerer
Sie können 1 Zeichen speichern , indem die erste Entfernung y=scan;und unter Verwendung x=y<-scan()+1Ich denke
Tensibai
und Sie können sieben mehr sparen , indem Sie as.POSIXlt(paste(y,1),,"%Y %j")$wdayals Funktionskörper
Tensibai
@Tensibai, wenn Sie es nicht in eine einzelne Zeile setzen und direkt in die Konsole einfügen, scanwird in der zweiten Zeile als Eingabe gelesen. x=y<-scan()+1mit 2014 als stdin geben Sie x = 2015 und y = 2015 (dh die Zuordnung y <- scan()+1) , und wenn Sie versuchen zu tun , x=1+y<-scan()es wird Ihnen ein Fehler ( Error in 1 + y <- scan() : target of assignment expands to non-language object) , weil es zu zuweisen versucht scan()zu 1+y.
Plannapus
@Tensibai Was deinen letzten Rat betrifft, ist das Ergebnis ...$wdaydie Wochentagsnummer: aber hier brauche ich den Wochentagsnamen, damit ich drucken kannAdvance Happy New Year, 2012 (Sun)
Plannapus
3

VBA, 130 * 0,50 = 65 Bytes

Sub k(y)
i=1
Do While Weekday(y+i)<>Weekday(y)
i=i+1
Loop
MsgBox "Advance Happy New Year," &y+i &WeekdayName(Weekday(y+i))
End Sub

VBA macht das Auffinden von Wochentagen so einfach. Wenn es nur nicht so ausführlich wäre.

JimmyJazzx
quelle
3

PHP, 120 139 Bytes - 50% = 60 Bytes

Ein funktionaler Ansatz:

$s=strtotime;for($d=date(D,$s(($y=$argv[1]).$_="-1-1"));$d!=date(D,$s(++$y.$_)););echo"Advance Happy New Year, $y ($d)";

Nimmt eine Eingabe von der Kommandozeile, wie:

$ php ahny.php 2001

Der OOP-Weg scheint wie immer länger zu sein (143 Bytes):

$s=strtotime;for($d=date(D,$s($x=($y=$argv[1])."-1-1"));$d!=date(D,$s(++$y."-1-1")););echo"Advance Happy New Year, $y ($d)";

Bearbeitungen

  • Gespeichert 18 Bytes . Anstatt mit dem PHP-Modifikator ein Jahr hinzuzufügen, erhöhe +1yearich jetzt einfach das angegebene Jahr.
  • Gespeichert 1 Byte durch Speichern -1-1in einer Variablen.
insertusernamehere
quelle
3

C, Ergebnis 53 52 (104 Bytes)

f(x){x+="0116"[x%4];printf("Advance Happy New Year, %d (%.3s)",x-43,"MonTueWedThuFriSatSun"+x*5/4%7*3);}

Idee von Toby Speight entlehnt ; Die Bonusanzeige des Wochentags wurde hinzugefügt.

Verkürzt die Zeichenfolge, indem die Zeichencodes auf einen bequemeren Bereich verschoben werden. Musste den richtigen Verschiebungsbetrag (z. B. 43) auswählen, damit der Berechnungscode für den kurzen Wochentag x*5/4%7funktioniert.

anatolyg
quelle
Ich nehme an, Ihr Zeichencode beschränkt dies auf ASCII-kompatible Codierungen.
Toby Speight
Ja. Die Codes sollten größer als 31 sein, sodass die minimale Zahl, die zu den Codes hinzugefügt werden muss, 27 ist und die Zeichenfolge ergibt " !!&".
Anatolyg
2

Mathematica, 145 * 50% = 74 73,5 72,5 Bytes

d=DateValue;StringForm["Advance Happy New Year, `` (``)",NestWhile[#+1&,(a=#)+1,#!=#2&@@DateObject@{{a},{#}}~d~"DayName"&],{a}~d~"DayNameShort"]&

Verwendet Standard-Datumsfunktionen.

LegionMammal978
quelle
2

Pyth, 23 Bytes

L%+/b4b7.VQIqyby-Q1+1bB

Qualifiziert sich nicht für einen der Boni.

Probieren Sie es hier aus .

Ähnlich wie bei der reinen Python-Antwort.

                        - Q = eval(input()) (autoassigned)
L                       - y = lambda b:
   /b4                  - b floordiv 4
  +   b                 - + b
 %     7                - mod 7


        .VQ             - for b in range(Q, infinate):
           Iqyby-Q1     - if y(b) == y(Q-1):
                   +1b  - print b+1
                      B - break
Blau
quelle
2

Java, (1-2) * 323 ( 1-5 ) * 350 348 339 = 258,4 175 174 169,5 Bytes

import java.text.*;class D{public static void main(String[]a){long y=new Long(a[0]);int i=0;for(;!s(y).equals(s(y+(++i))););System.out.printf("Advance Happy New Year, %d (%s)",y+i,s(y+i));}static String s(long y){try{return new SimpleDateFormat("E").format(new SimpleDateFormat("d/M/yyyy").parse("1/1/"+y));}catch(Exception e){}return"";}}

Pfui.

Ungolfed:

import java.text.*;
class D{
    public static void main(String[]a){
        long y=new Long(a[0]);
        int i=0;
        for(;!s(y).equals(s(y+(++i))););
        System.out.printf("Advance Happy New Year, %i (%s)",y+i,s(y+i));
    }
    static String s(long y){
        try{
            return new SimpleDateFormat("E").format(new SimpleDateFormat("d/M/yyyy").parse("1/1/"+y));
        }catch(Exception e){}
        return"";
    }
}

Probieren Sie es online!

Vielen Dank an @Kenney für den Hinweis, dass ich mit new Longund kürzen könnte printf! : D

Addison Crump
quelle
long y=new Long(a[0])Speichert 6 (12) Bytes und printfspeichert weitere 3 (6) Bytes .
Kenney
2

GNU Coreutils, 52 51 49 Bytes

(98-Byte-Programm - 50% Bonus)

seq -f$1-1-1\ %gyear 28|date -f- +'Advance Happy New Year, %Y (%a)'|sed /`date -d$1-1-1 +%a`/!d\;q

Die Eingabe erfolgt über das Befehlszeilenargument und die Ausgabe erfolgt über stdout.

Erläuterung

# generate 28 input years from $1 + 1 onwards (28 is always enough)
seq -f '$1-1-1 %g year' 28
|
# convert all of these as potential outputs
date -f- +'Advance Happy New Year, %Y (%a)'
|
 # Select the first one where the dayname matches that of input year
sed "/`date -d$1-1-1 +%a`/!d;q"

Testlauf:

Alle Gebietsschemaeinstellungen können Coder sein POSIX.

$ for i in 2001 2047 2014 1970 1971 1977 2006; do ./66656.sh $i; done
Advance Happy New Year, 2007 (Mon)
Advance Happy New Year, 2058 (Tue)
Advance Happy New Year, 2020 (Wed)
Advance Happy New Year, 1976 (Thu)
Advance Happy New Year, 1982 (Fri)
Advance Happy New Year, 1983 (Sat)
Advance Happy New Year, 2012 (Sun)

Einschränkung: Dies funktioniert nur bis zum Jahr 2147485519 (obwohl die Frage jetzt geändert wurde, um eine Untergrenze zuzulassen).

Toby Speight
quelle
2

MATL , 28 Bytes

i0:14+t1tI$YO8H$XO!st1)=f2))

Beispiel

>> matl i0:14+t1tI$YO8H$XO!st1)=f2))
> 1970
1976

Code erklärt

i           % input year
0:14+       % vector with that year and the next 14
t1tI$YO     % first day of each year
8H$XO       % transform into three letters specifying weekday
!s          % sum those three letters to reduce to unique numbers
t1)         % get first of those numbers (corresponding to input year)
=f2)        % find index of second matching
)           % index with that to obtain output year
Luis Mendo
quelle
2

Perl 6 ,  70   23 Bytes

{($^a+1...{[==] ($a,$_).map: {Date.new(:year($_)).day-of-week}})[*-1]} # 70 bytes

{($_ X+5,6,6,11)[$_%4]} # 23 bytes

Verwendungszweck:

for «2001 2047 2014 1970 1971 1977 2006 2010» {
  printf "%d => %d\n", $_, {($_ X+5,6,6,11)[$_%4]}( $_ )
}
2001 => 2007
2047 => 2058
2014 => 2020
1970 => 1976
1971 => 1982
1977 => 1983
2006 => 2012
2010 => 2016
Brad Gilbert b2gills
quelle
2

J, 14 Bytes

+5 6 6 11{~4&|
Alephalpha
quelle
2

Japt, 12 Bytes

U+"♣♠♠♂"cU%4

Wie bei der Pyth-Antwort sollten die vier Bytes in der Zeichenfolge sein 05 06 06 0B. Probieren Sie es online!

U+"♣♠♠♂"cU%4  // Implicit: U = input integer
  "♣♠♠♂"      // Take this string.
        cU%4  // Take the char code at U%4.
U+            // Add U.
              // Implicit: output last expression
ETHproductions
quelle
2
Vielen Dank für dieses Weihnachtsgeschenk einer Prämie! Aber kann mir jemand sagen, wie ich es verdient habe?
ETHproductions
Ich habe die Geschichte durchgesehen. Anscheinend hat das OP versucht, eine Antwort zu belohnen, hat aber vergessen, die Belohnung zu vergeben, und die Community hat beschlossen, die Hälfte des Rufs auf diese Antwort zu übertragen (ich denke, sie basiert auf den jüngsten positiven Stimmen).
2

Jelly , 14 Bytes

%4=0,3×-,5S++6

Probieren Sie es online!

Bis heute hatte Jelly keine Array-Indizierung. Seit dem letzten Festschreiben wurde die Array-Indizierung wie folgt implementiert: ( 10 Byte ).

ị6,6,11,5+

Probieren Sie es online!

Dennis
quelle
1
Ich denke, Jelly kann 7 Zeichen für 10 ~ 16 Konstanten sparen.
Lirtosiast
1

C # (6.0) .Net Framework 4.6 173 Bytes - 30% = 121,1 Bytes

void n(int y)=>Console.Write($"Advance Happy New Year, {Enumerable.Range(1,15).Select(i=>new DateTime(y+i,1,1)).First(x=>x.DayOfWeek==new DateTime(y,1,1).DayOfWeek).Year}");
Stephan Schinkel
quelle
1

Javascript ES7, 17 Bytes

a=>a+5+(a%4)**3%7

Ich benutze JS zum ersten Mal. Ich habe dies mit einem Python-Skript gefunden und halte es für optimal. Es funktioniert, weil 0**30 mod 7 ist 1**3und 2**3beide 1 und 3**36 sind.

Lirtosiast
quelle
1
Ist der Exponentiation Operator nicht** eine ES7- Funktion? Oder benutzt du Babel ?
Insertusernamehere
@insertusernamehere Behoben.
Lirtosiast
1

Python, 23 Bytes

lambda a:a+5+(a%4)**3%7

Ein Port meiner JavaScript-Antwort.

Lirtosiast
quelle