Sie haben lange Zeit Daten von einem Advanced Collecting Device Controller ™ gesammelt . Sie überprüfen die Protokolle und stellen zu Ihrem Entsetzen fest, dass etwas furchtbar schief gelaufen ist: Die Daten enthalten nur die letzten Bits der Zahlen!
Zum Glück kennen Sie den Startwert und wissen, dass sich der Wert nie schnell ändert. Das heißt, Sie können den Rest wiederherstellen, indem Sie nur die Entfernung vom Start finden.
Herausforderung
Sie schreiben ein Programm oder eine Funktion, um den Betrag zu berechnen, um den sich ein Wert geändert hat, wenn ein Modul N
und eine Liste der Zwischenwerte modulo gegeben sind N
.
Der Wechsel zwischen jedem Zahlenpaar ist immer kleiner alsN/2
, sodass es für jeden Testfall nur eine gültige Antwort gibt.
Als Eingabe erhalten Sie eine Ganzzahl N
> 2 und eine Werteliste in einem Format Ihrer Wahl. Die Eingabe kann über STDIN oder Befehlszeilen- oder Funktionsargumente erfolgen.
Sie geben eine einzelne Ganzzahl aus, den Betrag, um den sich der ursprüngliche Wert geändert hat. Die Ausgabe kann auf STDOUT gedruckt oder zurückgesendet werden.
Regeln
- Ihr Programm muss für alle Entfernungen und Module arbeiten, die kleiner als
2^20
. - Sie können davon ausgehen, dass:
N
ist zumindest3
.- Die Liste hat mindestens 2 Werte.
- Alle Werte in der Liste sind mindestens 0 und kleiner als
N
. - Alle Änderungen in den Zahlen sind kleiner als
N/2
.
- Alles andere ist eine ungültige Eingabe, und Ihr Programm kann tun, was es will.
- Standardlücken, nicht standardisierte Bibliotheken und integrierte Funktionen für diesen Zweck sind verboten.
- Das ist Code-Golf , also gewinnt das kürzeste Programm in Bytes.
Beispiel Testfälle
Eingang:
3
0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Ausgabe:
4
Erklärung (mit Beispielwert):
Value mod 3: 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Value: 0 1 2 2 3 4 3 2 1 2 3 4 5 4 4
Eingang:
10
5 2 8 9 5
Ausgabe:
-10
Erklärung (mit Beispielwert):
Value mod 10: 5 2 8 9 5
Value: 15 12 8 9 5
Ungültige Eingaben:
2
0 0 0 0 0
(zu kleiner Modul)
6
2 5 4 2
(zu großer Wechsel zwischen 2 und 5)
:^;[5 2 8 9 5](\
?Antworten:
TI-BASIC, 15 Byte
Nimmt die Liste ab
Ans
und den Modul abInput
.quelle
Python 2, 53 Bytes
Super direkte Antwort. Ich frage mich, ob es einen kürzeren Weg gibt.
quelle
.:_2
ich Paare generieren sollte, bis ich Ihre Antwort sah - ich habe zip verwendet.Mathematica, 30 Bytes
Dies ist eine anonyme Funktion, die zwei Argumente akzeptiert. Beispielverwendung:
Dies funktioniert, indem die
Differences
aufeinanderfolgenden Elemente in den Bereich-n/2
bis+n/2
mitMod
und den dazugehörigen Offset-Parameter eingeschlossen und dann die Summe mitTr
(Matrix-Kurve, Summe der diagonalen Elemente) genommen werden.Beachten Sie, dass es selbst ungolfed nur 43 Bytes sind!
quelle
@
ist unnötig, wenn Sie die Funktion bereits mit eckigen Klammern aufrufen. Beides ist ein Syntaxfehler.J, 24 Bytes
Verwendung:
Ich werde versuchen mehr Golf zu spielen und danach eine Erklärung hinzufügen.
Probieren Sie es hier online aus.
quelle
Pyth,
20 bis19 BytesStola
.:_2
aus Jakube, Idee von Mauris.quelle
R, 38 Bytes
Dadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl und einen Vektor als Eingabe akzeptiert und eine einzelne Ganzzahl zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=function(n,v)...
.Ungolfed + Erklärung:
Beispiele:
quelle
MatLab, 33 Bytes
Entschuldigung, dies ist meine erste Antwort auf dieser Website. Wenn Sie dies in MatLab eingeben und dann die Eingabe verwenden,
ans(modulus_value, [intermediate_values])
wird der angeforderte Wert zurückgegeben, wobei 'modulus_value' der Modulwert ist und 'intermediate_values' eine Liste der durch Leerzeichen oder Kommas getrennten Zwischenwerte ist.Beispiel:
Die anonyme Funktion nutzt Matlab
mod
,diff
undsum
Funktionen , die Antwort zu berechnen. Zunächst wird die Differenz zwischen den einzelnen Zwischenwerten berechnet. Das Ergebnis wird dann durch den durch zwei geteilten Modul versetzt, was zu einer Menge von Differenzwerten führt, die durch [- Modul / 2 Modul / 2] begrenzt ist. Das Ergebnis wird dann versetzt und erneut aufsummiert.Ich denke, das kann man mehr Golf spielen, ich werde bald mit einem Update zurück sein. Besonderer Dank geht an @ 2012rcampion für die Idee.
Edit: Matlabs
unwrap
Funktion funktioniert hier fast, aber es ist schwierig, Golf zu spielen. Der folgende Code gibt ein Array zurück, in dem der letzte Wert dem Betrag entspricht, um den sich der erste Wert geändert hat:@(x,y)unwrap(y/x*2*pi)/2/pi*x-y(1)
Die Zwischenwerte werden auf den Bereich von [-pi pi] skaliert und dann "abgewickelt", so dass kein aufeinanderfolgender Wert mehr als pi voneinander entfernt ist. Diese Werte werden dann neu skaliert und verschoben, was zu einer Reihe von Abständen vom Startwert führt.
Interessant, aber nicht sehr praktisch für diese Herausforderung: D
quelle
Pyth, 29 Bytes
Probieren Sie es online aus: Pyth Compiler / Executor
quelle
CJam, 27 Bytes
Teste es hier.
quelle
Pip , 39 Bytes
Erfordert die Liste der Daten als Befehlszeilenargumente und den Modul für STDIN. Wenn das zu viel ist, habe ich eine Version, die zwei Befehlszeilenargumente für weitere 5 Byte benötigt.
Erläuterung:
Und nur um zu beweisen, dass diese nicht so wettbewerbsfähige Punktzahl meine Golffähigkeiten besser widerspiegelt als meine Sprache, hier eine Portierung von Mauris 'Python-Lösung in 30 Bytes :
quelle
Gelee , nicht konkurrierend
6 bytes Diese Antwort ist nicht konkurrierend, da die Herausforderung vor der Erstellung von Jelly liegt.
Probieren Sie es online!
Wie es funktioniert
quelle