Drukowanie od 1 do 1000 bez pętli lub warunków warunkowych
323
Zadanie : Wydrukuj liczby od 1 do 1000 bez użycia instrukcji pętli lub instrukcji warunkowych. Nie pisz po prostu oświadczenia printf()lub cout1000 razy.
Oczywistą odpowiedzią jest użycie 500 połączeń printfi wydrukowanie dwóch numerów za każdym razem, prawda?
James McNellis,
433
printf („liczby od 1 do 1000”);
jondavidjohn
7
:?nie jest stwierdzeniem warunkowym (jest wyrażeniem) ...
Chris Lutz
127
Wywiad twoja szansa zabłysnąć. Powiedz im „Bez pętli i warunków? Dziecinnie. Mogę to zrobić bez komputera!” Następnie wyciągnij długopis i notatnik. Mogą wyglądać na zdezorientowane, ale po prostu wyjaśnij, że jeśli nie możesz liczyć na wbudowane konstrukcje językowe, naprawdę nie możesz niczego zakładać.
JohnFx,
8
Osobiście uważam, że było kilka odpowiedzi, które miały sprytne, interesujące rozwiązania. Myślę też, że chociaż może to być okropne pytanie podczas rozmowy kwalifikacyjnej, może mieć w tym dużą wartość, o ile osoba przeprowadzająca wywiad naprawdę nie szuka tak dobrze sformułowanego rozwiązania, jak to, czy rozmówca rozważa podejście wskazujące znajomość TMP lub używanie konstruktów w niecodzienny sposób. Myślę, że byłoby źle, gdyby wykorzystano to jako czyste pytanie „dobrze-źle / źle”, ale gdyby zostało użyte jako punkt wyjścia do dyskusji, widziałbym dużą wartość.
Michael Burr,
Odpowiedzi:
785
Skompiluj rekurencję czasu! : P
#include<iostream>template<int N>structNumberGeneration{staticvoidout(std::ostream& os){NumberGeneration<N-1>::out(os);
os << N << std::endl;}};template<>structNumberGeneration<1>{staticvoidout(std::ostream& os){
os <<1<< std::endl;}};int main(){NumberGeneration<1000>::out(std::cout);}
Czy ktoś może mi wyjaśnić, jak to działa? naprawdę imponujące.
gath
28
@Zack: Bądźmy szczerzy, drukujemy 1000 wierszy z programu napisanego, aby celowo unikać pętli. Wydajność nie stanowi problemu.
dreamlax
42
Dla tych, którzy są na tyle ciekawi, aby to skompilować: w g ++ ustaw -ftemplate-depth-1000. Domyślna maksymalna rekursja szablonu to 500.
Tom
6
Nadal używa warunków warunkowych: dopasowanie wzoru jest uwielbione, jeśli.
David K.
10
@dreamlax: To tylko jedna z tych rzeczy, których nauczyłem się przez lata: używaj, '\n'chyba że naprawdę chcesz się spłukać, używaj, ++ichyba że naprawdę potrzebujesz poprzedniej wartości i, przekaż constreferencję, chyba że masz dobry powód, aby nie ... Gdy programiści przestaną o nich myśleć (lub nawet nigdy nie zaczną), prędzej czy później napotkają problem, w którym to ma znaczenie, tylko oni nie wiedzieli, że są miejsca, w których może to mieć znaczenie.
sbi 30.01.11
1195
Ten faktycznie kompiluje się w asemblerze, który nie ma żadnych warunków warunkowych:
Cóż, kod w tej odpowiedzi nie jest oczywiście ani C, ani C ++, więc jest w porządku tylko wtedy, gdy zniesiemy wymaganie. Wtedy każda odpowiedź może się kwalifikować, ponieważ hipotetyczny kompilator może po prostu wygenerować wymagany program z dowolnego wejścia.
eq-
321
@PP, jest to dość długie do wyjaśnienia, ale w gruncie rzeczy jpoczątkowo 1dlatego, że tak naprawdę jest argc, to znaczy, 1jeśli program jest wywoływany bez argumentów. Wtedy j/1000jest, 0aż stanie jsię 1000, po czym jest 1. (exit - main)jest oczywiście różnica między adresami exit()i main(). Oznacza to, że (main + (exit - main)*(j/1000))jest main()aż jstaje się 1000, po czym staje exit(). Rezultatem końcowym jest to, że main()jest wywoływany podczas uruchamiania programu, a następnie wywołuje się rekurencyjnie 999 razy podczas zwiększania j, a następnie wywołuje exit(). Uff :)
Frédéric Hamidi
7
Jest to jedno z najbardziej niesamowitych nadużyć CI, jakie kiedykolwiek widziałem. Ale czy będzie działać na wszystkich platformach?
Qwertie,
13
@ Mark: jest to niestandardowa sygnatura main, nie wolno wywoływać main rekurencyjnie, a wynik odejmowania wskaźników funkcji jest niezdefiniowany.
Yakov Galka
9
Tak, tak, nie jest to całkowicie legalny kod C ++ z powodów podanych przez @ybungalobill, ale muszę dać +1 za zwykłe szaleństwo i fakt, że kompiluje się i działa na kilku platformach. Są chwile, kiedy poprawna odpowiedź na „Ale to nie jest standard!” to „Kogo to obchodzi!” :)
Ludzie to opublikowali. Inne wersje przekazują numer do wydrukowania zamiast globalnego, ale jest to zasadniczo to samo rozwiązanie.
Chris Lutz
1
@Chris, używają tej samej logiki wyrażonej w makrach lub szablonach, wysadzając rozmiar kodu, prawda? Równie dobrze możesz wygenerować sam łańcuch wyjściowy zamiast tysiąca printfs.
Darius Bacon
O tak, widzę, że odpowiedź Keitha generuje cały łańcuch, spoko. :) Tęsknie za tym.
Darius Bacon
43
Cóż, niezły wysiłek, ale raczej dziwne, że nie rozłożyłeś 8 na 2 * 2 * 2, a zatem użyłeś wyjątkowej faktoryzacji liczby podstawowej
@Johannes faktycznie jestem pewien, że printfma pętlę: p
icecrime
1
@litb: Uwaga: Nie powiedziałem, że „używanie copyto oszustwo”
John Dibling,
2
@John: kopiowanie to oszustwo. wątpisz w to? : P
Nawaz
1
w skali od 1 do 10, jaka jest szansa, że używam pliku binarnego?
Jordan
270
Oto trzy rozwiązania, które znam. Drugi można jednak spierać.
// compile time recursiontemplate<int N>void f1(){
f1<N-1>();
cout << N <<'\n';}template<>void f1<1>(){
cout <<1<<'\n';}// short circuiting (not a conditional statement)void f2(int N){
N &&(f2(N-1), cout << N <<'\n');}// constructors!struct A {
A(){staticint N =1;
cout << N++<<'\n';}};int main(){
f1<1000>();
f2(1000);delete[]new A[1000];// (3)
A data[1000];// (4) added by Martin York}
[ Edycja: (1) i (4) mogą być używane tylko do kompilowania stałych czasowych, (2) i (3) mogą być również używane do wyrażeń środowiska wykonawczego - edycja końcowa. ]
Poza tym spieram się o to, że zwarcie nie jest warunkowe ... Powiedziałbym, że to nie stwierdzenie, prawda, ale wyrażenie warunkowe. Pod warunkiem, że zdefiniujemy wyrażenie warunkowe jako „coś, co powoduje warunkowe skoki w asemblerze”.
Kos,
5
Pytanie, które mnie uderzyło podczas czytania konstruktora nr 1: Czy standardowe polecenie nakazuje, aby każdy element w tablicy był konstruowany kolejno? Miałoby to znaczenie, gdyby konstruktor miał skutki uboczne. Jestem pewien, że każdy rozsądny kompilator implementuje go jako pętlę 0-> 1000, ale zastanawiam się, czy nadal możesz być zgodny i zapętlać wstecz ...
Joseph Garvin
6
@Joseph - Konstruktor nie powinien mieć wpływu na to, w jakiej kolejności poszczególne obiekty są inicjowane, ale to dobre pytanie.
Chris Lutz
12
@Joseph to jest zdefiniowane przez 12,6 / 3 (C ++ 03). Inicjalizacja odbywa się w kolejności subskrypcji.
Johannes Schaub - litb
2
@Joseph: I są również niszczone w odwrotnej kolejności, więc równie łatwo można użyć destruktora :)
mój ulubiony po „printf („ liczby od 1 do 1000 ”)” - głupie pytania wymagają głupich odpowiedzi.
SEngstrom
to jest niesamowite. +1 za skorzystanie z dwuznaczności w pytaniu. haha
Nawaz
2
Edytowane; w żaden sposób, kształt ani forma tego kodu print "Print numbers from 1 to 1000."- niejednoznaczne pytanie o wygraną, niedokładne opisy są do kitu :)
sehe
Wow, ostatnio w odpowiedzi na to pytanie było trochę wandalizmu. Coś mi mówi, że powinniśmy ulepszyć ten zamek do historycznego.
powinieneś wywołać fflush (stdout); po każdym printf () ... Gdy program ulega awarii, nie ma gwarancji, że bufor wyjściowy zostanie wydrukowany na ekranie.
zakk
10
@zakk: Nie jest to absolutnie konieczne - domyślnie stdout jest buforowany liniowo, więc \nwystarczy do opróżnienia wyjścia.
psmears
24
stdout jest buforowany w linii, jeśli można go określić jako urządzenie interaktywne , w przeciwnym razie jest w pełni buforowany. Jeśli profesor przekieruje standardowe wyjście do pliku w celu automatycznego sprawdzania, nie powiedzie się :-)
@ jokester: masz na myśli, ponieważ Solaris / BSD nie ma seqnarzędzia (w domyślnej konfiguracji)? <grin />
patrz
Nienawidzę tego mówić (cóż, nie, nie wiem), ale w twoim rozwiązaniu jest błąd. Nie drukuje właściwego zestawu liczb. :) Oto poprawka: system("/bin/echo {1..1000}"); Gdybyś tylko napisał test jednostkowy jako pierwszy ...
Don Branson
1
Jakiś bystry koleś postanowił zmienić moją odpowiedź, więc to nie mój błąd.
moinudin
100
Nie przetestowano, ale powinien być waniliowy standard C:
Wymaganie to „brak warunków” (jeśli, przełącznik itp.). nie „brak warunków”
jon_darkstar
32
<nie jest warunkiem. To operator relacyjny. if/ elsejest instrukcją warunkową. ?:jest operatorem warunkowym. <jest tylko operatorem, który zwraca wartość logiczną. Prawdopodobnie jest to instrukcja pojedynczej maszyny bez skoków lub czegokolwiek.
Chris Lutz
12
@Chris Lutz: Na x86, to 3 instrukcje: cmpl, setle, i movzbl. x86-64 to plus cltq. PowerPC to 2 instrukcje: cmpwii crnot.
Adam Rosenfield
4
1 - i / 1000. Brak porównań!
Thai
96
Trochę nudno w porównaniu do innych tutaj, ale prawdopodobnie tego, czego szukają.
Skróciłem to. ustaw i = 1 poza głównym, a następnie wewnątrz głównego: printf ("% d \ n", 11 - i) && - i && main (i);
jftuga
3
@Jens Schauder: Korzystając z leniwej &&oceny w pierwszym wierszu f().
Rafał Dowgird,
10
To nie jest nudne, to proste. Jeśli możesz zrobić to samo za pomocą krótkiej funkcji, jak możesz z ogromnym bałaganem magii szablonów, powinieneś to zrobić za pomocą funkcji :)
amertune
21
Warunek && jest warunkowy. Matematyczne AND ocenia obie strony (jak Java i Ada „AND” robi). && oceni drugiego operatora tylko wtedy, gdy (tutaj jest) pierwszy jest prawdziwy. Lub inny przykład: w Adzie operator zwarć nazywa się „LUB TO” - używając TO, aby wskazać aspekt warunkowy. Przepraszam, mogłeś równie dobrze użyć? : operator.
Martin
Nie ma potrzeby przepraszać. && jest operatorem porównawczym. Operator trójskładnikowy jest warunkowy.
Aaron,
71
Zadanie nigdy nie określało, że program musi zakończyć się po 1000.
Jednak nie zatrzymuje się na 1000. Po prostu idzie dalej.
Remy Lebeau,
Można skrócić tylko wtedy, gdy zeskrobujesz wymaganie C lub C ++. Wtedy zrobi to każdy „program”, ponieważ teoretyczny kompilator mógłby wygenerować żądany program (z dowolnego wejścia).
eq-
@eq Znowu to się kompiluje i działa dobrze…
Mark McDonald,
72
Jako następstwo: możemy nawet uniknąć oczywistej matematyki. Jeśli zastosujemy rand(), wydrukujemy wszystkie liczby od 1 do 1000. W końcu =: P
5
@pooh: Niekoniecznie, ponieważ rand () ma szansę powtórzyć się po określonej sekwencji i ta sekwencja może nie znaleźć się w zestawie rozwiązań tego problemu
dchhetri
71
Proste jak ciasto! : P
#include<iostream>staticint current =1;structprint{print(){ std::cout << current++<< std::endl;}};int main(){print numbers [1000];}
możesz chcieć zrobić „static int current = 0” w przeciwnym razie wydrukuje od 2 do 1001.
Shinnok
zmieniłem ++ prąd na bieżący ++
Zelix
65
#include<stdio.h>#defineOut(i) printf("%d\n", i++);#define REP(N) N N N N N N N N N N
#defineOut1000(i) REP(REP(REP(Out(i))));void main(){int i =1;Out1000(i);}
Możemy uruchomić 1000 wątków, z których każdy drukuje jedną z liczb. Zainstaluj OpenMPI , skompiluj używając mpicxx -o 1000 1000.cppi uruchom używając mpirun -np 1000 ./1000. Prawdopodobnie będziesz musiał zwiększyć limit deskryptorów za pomocą limitlub ulimit. Pamiętaj, że będzie to raczej powolne, chyba że masz mnóstwo rdzeni!
Pośrednia pętla w bibliotece? Ale +1 i tak dla nowego podejścia.
Chris Lutz
11
@Chris Czy w większości rozwiązań gdzieś nie ma ukrytej pętli?
moinudin
Przypuszczam, że jeśli przyjmiesz podejście „pętli w kompilatorze”. Ponieważ (poza możliwą pętlą nad argumentami w MPI::Init()) nie wyobrażam sobie żadnych pętli w rzeczywistym pliku binarnym twojego programu 1000.cpp, dałem ci +1, nawet jeśli na pewno są uruchomione pętle podczas jego wykonywania.
Chris Lutz
40
Ze zwykłym C:
#include<stdio.h>/* prints number i */void print1(int i){
printf("%d\n",i);}/* prints 10 numbers starting from i */void print10(int i){
print1(i);
print1(i+1);
print1(i+2);
print1(i+3);
print1(i+4);
print1(i+5);
print1(i+6);
print1(i+7);
print1(i+8);
print1(i+9);}/* prints 100 numbers starting from i */void print100(int i){
print10(i);
print10(i+10);
print10(i+20);
print10(i+30);
print10(i+40);
print10(i+50);
print10(i+60);
print10(i+70);
print10(i+80);
print10(i+90);}/* prints 1000 numbers starting from i */void print1000(int i){
print100(i);
print100(i+100);
print100(i+200);
print100(i+300);
print100(i+400);
print100(i+500);
print100(i+600);
print100(i+700);
print100(i+800);
print100(i+900);}int main(){
print1000(1);return0;}
Oczywiście możesz wdrożyć ten sam pomysł dla innych baz (2: print2 print4 print8 ...), ale liczba 1000 tutaj sugerowana podstawa 10. Możesz również nieco zmniejszyć liczbę linii dodając funkcje pośrednie: print2() print10() print20() print100() print200() print1000()i inne równoważne alternatywy.
Dlaczego liczba 1000 sugeruje podstawę 10? W każdym zapisie pozycyjnym z bazą B1000 jest liczbą całkowicie prawidłową i zawsze jest równa B^3.
Filip
Chodziło mi tylko o to, że biorąc pod uwagę sposób, w jaki liczba jest reprezentowana w podstawie 10, faktoryzacja „10x10x10” sugeruje się, ale możliwe są inne alternatywy. Chyba powinienem powiedzieć „faktoryzacja” zamiast „baza”
leonbloy
34
Wystarczy użyć std :: copy () ze specjalnym iteratorem.
Myślę, że twój kod zaczyna się od 0. Zgadzam się również z Chrisem, pytanie, które widziałem przed laty, zostało sformułowane jako „bez bibliotek z wyjątkiem IO”. jeszcze +1 :)
Jakow Galka
3
@Chris Lutz: Implementacja kopii jest niezdefiniowana. Mogę nawet użyć kodu szablonu jak wyżej (po prostu nie wiesz; t). Nie możesz więc powiedzieć, że używa pętli, ponieważ nie wiemy.
Martin York
7
W rzeczywistości mój wybór nitów nie byłby niejawną pętlą w std::copytakim stopniu, jak niejawne warunkowe w operator !=(). Niezależnie od tego, sprytne podejście do przetwarzania zakresu, a sprytne podejście jest tym, czego szukam w odpowiedzi na takie pytania.
Michael Burr,
specyficzne dla implementacji jest niezdefiniowane
selvaiyyamperumal
@selvaiyyamperumal: Nie jestem pewien, o czym mówisz. Ale jeśli mówisz o zachowaniu, standard nie zgadza się z tobą. „Zachowanie zdefiniowane w ramach wdrożenia” oznacza, że jest dobrze zdefiniowane, ale musi zostać wyraźnie udokumentowane przez wdrożenie. „Niezdefiniowane zachowanie” oznacza, że wszystko może się zdarzyć.
Martin York,
33
Użyj wskaźnika funkcji (ab). Brak magii preprocesora zwiększającej wydajność. ANSI C.
#include<stdio.h>int i=1;void x10(void(*f)()){
f(); f(); f(); f(); f();
f(); f(); f(); f(); f();}void I(){printf("%i ", i++);}void D(){ x10( I );}void C(){ x10( D );}void M(){ x10( C );}int main(){
M();}
Właśnie o tym myślałem. Poprzednia osoba powiedziała, że 5 * 5 * 5 * 8 = 1000. Myślałem, że to zabawne, że brakuje mu oczywistego 10 ^ 3. Fajne rozwiązanie!
Evan Moran,
32
#include<iostream>#include<iterator>usingnamespace std;int num(){staticint i =1;return i++;}int main(){ generate_n(ostream_iterator<int>(cout,"\n"),1000, num);}
wszystko w porządku, ale dlaczego „void main ()”? złe nawyki rzadko odchodzą? : P
Nawaz
30
@Nawaz: Ponieważ jest to potajemnie aplikacja Windows GUI, więc nie ma to znaczenia. Nazwałem to „głównym”, ponieważ myślałem o homarach i mam straszną pisownię.
Martin
29
Przepełnienie stosu:
#include<stdio.h>staticvoid print_line(int i){
printf("%d\n", i);
print_line(i+1);}int main(int argc,char* argv[]){//get up near the stack limitchar tmp[8388608-32*1000-196*32];
print_line(1);}
To jest dla stosu 8 MB. Wydaje się, że każde wywołanie funkcji zajmuje około 32 bajtów (stąd 32 * 1000). Ale kiedy go uruchomiłem, dostałem tylko 804 (stąd 196 * 32; być może środowisko uruchomieniowe C ma inne elementy na stosie, które również musisz odjąć).
Na marginesie: wziąłem zakaz stosowania warunkowych rozszerzeń również na operatorów logicznych i relacyjnych. Jeśli zezwolisz na logiczną negację, wywołanie rekurencyjne można uprościć w celu:
podoba mi się sposób, w jaki masz to dzięki przesunięciu bitów. ale po twoim uproszczeniu, co robi podwójny huk? jest to bitowe czy logiczne? zgubiłem się i google funcs[!!(limit-1)](x+1, limit-1);
sprawiło, że chodziłem
Wolę mieć jeden !i przełączać elementy tablicy wskaźników funkcji, ale nie wiem, czy będzie to dobrze współgrać z twoim drugim szaleństwem.
Chris Lutz
@Chris: Zgadzam się całkowicie - ale nie zastanawiałem się nad użyciem operatorów logicznych / relacji, dopóki nie opublikowałem postu, i pomyślałem, że poprawka jednowierszowa byłaby bardziej odpowiednia. Poza tym pasuje trochę lepiej z całym zaciemnionym odczuciem problemu.
Michael Burr
24
Myślę, że ta odpowiedź będzie bardzo prosta i łatwa do zrozumienia.
int print1000(int num=1){
printf("%d\n", num);// it will check first the num is less than 1000. // If yes then call recursive function to printreturn num<1000&& print1000(++num);}int main(){
print1000();return0;}
Twoja odpowiedź wykorzystuje twierdzenia warunkowe, które są zabronione zgodnie z pytaniem.
stevelove
4
instrukcje warunkowe są, jeśli inaczej itp. Właśnie użyłem operacji logicznej !! Hpe to jasne!
Pappu
2
Nawet w swoich komentarzach napisałeś „Jeśli tak, to wywołaj funkcję rekurencyjną, aby wydrukować”. Warunek napisany w nieoczywisty sposób jest nadal warunkowy. Domyślna liczba jest również warunkowa.
Gerry
23
Brakowało mi całej zabawy, wszystkie dobre odpowiedzi w C ++ zostały już opublikowane!
To jest najdziwniejsza rzecz, jaką mogłem wymyślić, ale nie założę się, że to legalne C99: str
#include<stdio.h>int i =1;int main(int argc,char*argv[printf("%d\n", i++)]){return(i <=1000)&& main(argc, argv);}
Kolejny, z odrobiną oszustwa:
#include<stdio.h>#include<boost/preprocessor.hpp>#define ECHO_COUNT(z, n, unused) n+1#define FORMAT_STRING(z, n, unused)"%d\n"int main(){
printf(BOOST_PP_REPEAT(1000, FORMAT_STRING,~), BOOST_PP_ENUM(LOOP_CNT, ECHO_COUNT,~));}
printf
i wydrukowanie dwóch numerów za każdym razem, prawda?:?
nie jest stwierdzeniem warunkowym (jest wyrażeniem) ...Odpowiedzi:
Skompiluj rekurencję czasu! : P
źródło
'\n'
chyba że naprawdę chcesz się spłukać, używaj,++i
chyba że naprawdę potrzebujesz poprzedniej wartościi
, przekażconst
referencję, chyba że masz dobry powód, aby nie ... Gdy programiści przestaną o nich myśleć (lub nawet nigdy nie zaczną), prędzej czy później napotkają problem, w którym to ma znaczenie, tylko oni nie wiedzieli, że są miejsca, w których może to mieć znaczenie.Ten faktycznie kompiluje się w asemblerze, który nie ma żadnych warunków warunkowych:
Edycja: Dodano „&”, aby uwzględnić adres, dlatego omija błędy wskaźnika.
Ta wersja powyższego standardu C, ponieważ nie opiera się na arytmetyce wskaźników funkcji:
źródło
j
początkowo1
dlatego, że tak naprawdę jestargc
, to znaczy,1
jeśli program jest wywoływany bez argumentów. Wtedyj/1000
jest,0
aż staniej
się1000
, po czym jest1
.(exit - main)
jest oczywiście różnica między adresamiexit()
imain()
. Oznacza to, że(main + (exit - main)*(j/1000))
jestmain()
ażj
staje się1000
, po czym stajeexit()
. Rezultatem końcowym jest to, żemain()
jest wywoływany podczas uruchamiania programu, a następnie wywołuje się rekurencyjnie 999 razy podczas zwiększaniaj
, a następnie wywołujeexit()
. Uff :)Dziwi mnie, że nikt tego nie opublikował - myślałem, że to najbardziej oczywisty sposób.
1000 = 5*5*5*8.
źródło
Wygląda na to, że nie trzeba używać pętli
źródło
copy
to oszustwoprintf
ma pętlę: pcopy
to oszustwo”Oto trzy rozwiązania, które znam. Drugi można jednak spierać.
[ Edycja: (1) i (4) mogą być używane tylko do kompilowania stałych czasowych, (2) i (3) mogą być również używane do wyrażeń środowiska wykonawczego - edycja końcowa. ]
źródło
Nie piszę instrukcji printf 1000 razy!
Nie ma za co ;)
źródło
$r='printf("'; for (1..1000) { $r.="$_\\n" } $r.='");'; print $r;
Nie drukuje wszystkich liczb, ale „Drukuje liczby od 1 do 1000”. Niejednoznaczne pytanie o zwycięstwo! :)
źródło
print "Print numbers from 1 to 1000."
- niejednoznaczne pytanie o wygraną, niedokładne opisy są do kitu :)Wywołaj błąd krytyczny! Oto plik countup.c:
Skompiluj, a następnie uruchom w wierszu poleceń powłoki:
To rzeczywiście wypisuje liczby od 1 do 1000, bez żadnych pętli i warunków!
źródło
\n
wystarczy do opróżnienia wyjścia.Za pomocą poleceń systemowych:
źródło
/usr/bin/seq
wykorzystuje wewnętrznie pętlę. :)seq
narzędzia (w domyślnej konfiguracji)? <grin />system("/bin/echo {1..1000}");
Gdybyś tylko napisał test jednostkowy jako pierwszy ...Nie przetestowano, ale powinien być waniliowy standard C:
źródło
<
nie jest warunkiem. To operator relacyjny.if
/else
jest instrukcją warunkową.?:
jest operatorem warunkowym.<
jest tylko operatorem, który zwraca wartość logiczną. Prawdopodobnie jest to instrukcja pojedynczej maszyny bez skoków lub czegokolwiek.cmpl
,setle
, imovzbl
. x86-64 to pluscltq
. PowerPC to 2 instrukcje:cmpwi
icrnot
.1 - i / 1000
. Brak porównań!Trochę nudno w porównaniu do innych tutaj, ale prawdopodobnie tego, czego szukają.
źródło
&&
oceny w pierwszym wierszuf()
.Zadanie nigdy nie określało, że program musi zakończyć się po 1000.
( Można to skrócić, jeśli uruchomisz ./a.out bez dodatkowych parametrów )
źródło
rand()
, wydrukujemy wszystkie liczby od 1 do 1000. W końcu =: PProste jak ciasto! : P
źródło
źródło
Możemy uruchomić 1000 wątków, z których każdy drukuje jedną z liczb. Zainstaluj OpenMPI , skompiluj używając
mpicxx -o 1000 1000.cpp
i uruchom używającmpirun -np 1000 ./1000
. Prawdopodobnie będziesz musiał zwiększyć limit deskryptorów za pomocąlimit
lubulimit
. Pamiętaj, że będzie to raczej powolne, chyba że masz mnóstwo rdzeni!Oczywiście liczby niekoniecznie będą drukowane w kolejności, ale pytanie nie wymaga ich zamówienia.
źródło
MPI::Init()
) nie wyobrażam sobie żadnych pętli w rzeczywistym pliku binarnym twojego programu 1000.cpp, dałem ci +1, nawet jeśli na pewno są uruchomione pętle podczas jego wykonywania.Ze zwykłym C:
Oczywiście możesz wdrożyć ten sam pomysł dla innych baz (2: print2 print4 print8 ...), ale liczba 1000 tutaj sugerowana podstawa 10. Możesz również nieco zmniejszyć liczbę linii dodając funkcje pośrednie:
print2() print10() print20() print100() print200() print1000()
i inne równoważne alternatywy.źródło
B
1000 jest liczbą całkowicie prawidłową i zawsze jest równaB^3
.Wystarczy użyć std :: copy () ze specjalnym iteratorem.
źródło
std::copy
takim stopniu, jak niejawne warunkowe woperator !=()
. Niezależnie od tego, sprytne podejście do przetwarzania zakresu, a sprytne podejście jest tym, czego szukam w odpowiedzi na takie pytania.Użyj wskaźnika funkcji (ab). Brak magii preprocesora zwiększającej wydajność. ANSI C.
źródło
źródło
Brzydka odpowiedź C (rozwinięta tylko dla jednej ramki stosu na moc 10):
źródło
Przepełnienie stosu:
To jest dla stosu 8 MB. Wydaje się, że każde wywołanie funkcji zajmuje około 32 bajtów (stąd 32 * 1000). Ale kiedy go uruchomiłem, dostałem tylko 804 (stąd 196 * 32; być może środowisko uruchomieniowe C ma inne elementy na stosie, które również musisz odjąć).
źródło
Zabawa ze wskaźnikami funkcji (nie jest potrzebny żaden nowy TMP):
Na marginesie: wziąłem zakaz stosowania warunkowych rozszerzeń również na operatorów logicznych i relacyjnych. Jeśli zezwolisz na logiczną negację, wywołanie rekurencyjne można uprościć w celu:
źródło
funcs[!!(limit-1)](x+1, limit-1);
!
i przełączać elementy tablicy wskaźników funkcji, ale nie wiem, czy będzie to dobrze współgrać z twoim drugim szaleństwem.Myślę, że ta odpowiedź będzie bardzo prosta i łatwa do zrozumienia.
źródło
Brakowało mi całej zabawy, wszystkie dobre odpowiedzi w C ++ zostały już opublikowane!
To jest najdziwniejsza rzecz, jaką mogłem wymyślić, ale nie założę się, że to legalne C99: str
Kolejny, z odrobiną oszustwa:
Ostatni pomysł, ten sam kod:
źródło
main
skutkuje niezdefiniowanym zachowaniem, jak pamiętam.&&
i||
prawdopodobnie podlegałyby „warunkom”, ponieważ powodowałyby zwarcie (jak w przypadku?:
).Łatwe jak ciasto:
metoda wykonania:
Specyfikacja nie mówi, że sekwencja musi zostać wygenerowana wewnątrz kodu :)
źródło
źródło
źródło
Więcej nadużyć preprocesora:
Czuję się taki brudny; Chyba pójdę teraz wziąć prysznic.
źródło
A2()
bez takiego argumentu?Jeśli rozwiązania POSIX są akceptowane:
źródło
Ponieważ nie ma ograniczeń dotyczących błędów ..
A może nawet lepiej (?),
źródło
volatile
do deklaracjij