C ++, 205 179 bajtów
int main(){};static int c=1;
#define v(x) A##x
#define u(x) v(x)
#define z u(__LINE__)
#include <cstdio>
class z{public:z(){++c;};~z(){if(c){printf("%d %o %x",--c,c,c);c=0;}}}z;//
(Brak końcowego nowego wiersza - po skopiowaniu pierwszy wiersz kopii i ostatni wiersz oryginału powinny się pokrywać)
Zasadniczo działa to poprzez utworzenie sekwencji zmiennych statycznych, które podczas budowy zwiększają licznik zmiennych globalnych. Następnie po zniszczeniu, jeśli licznik nie jest równy 0, wykonuje całą swoją moc wyjściową i ustawia licznik na zero.
Aby zdefiniować sekwencję zmiennych bez konfliktów nazw, używamy makra objaśnionego w następujący sposób:
#define v(x) A##x //This concatenates the string "A" with the input x.
#define u(x) v(x) //This slows down the preprocessor so it expands __LINE__ rather than yielding A__LINE__ as v(__LINE__) would do.
#define z u(__LINE__)//Gives a name which is unique to each line.
co nieco opiera się na osobliwościach procesora ciągów. zWielokrotnie używamy do definiowania klas / zmiennych, które nie będą ze sobą sprzeczne podczas kopiowania na osobne linie. Co więcej, definicje, które muszą wystąpić tylko raz, są umieszczane w pierwszym wierszu, który jest komentowany w kopiach kodu. The#define i #includenie dbają o to, aby się powtarzały, więc nie wymagają specjalnego postępowania.
Ten kod zawiera również niezdefiniowane zachowanie w instrukcji:
printf("%d %o %x",--c,c,c)
ponieważ nie ma punktów sekwencji, ale c jest modyfikowane i dostępne. LLVM 6.0 daje ostrzeżenie, ale kompiluje je zgodnie z potrzebami - co --cocenia wcześniej c. Można by, kosztem dwóch bajtach, dodać oświadczenie --c;przed wyjść i zmiany --cw printfcelu c, który będzie pozbyć się ostrzeżenia.
Zastąpiony std::cout z printfoszczędności 26 bajty dzięki sugestią mojego brata.
1 01 0x1? (Zawiera prefiksy)