Tâche : imprimer des nombres de 1 à 1 000 sans utiliser de boucle ni d'instructions conditionnelles. Ne vous contentez pas d'écrire la déclaration printf()ou cout1000 fois.
La réponse évidente est d'utiliser 500 appels printfet d'imprimer deux numéros à chaque fois, non?
James McNellis
433
printf ("nombres de 1 à 1000");
jondavidjohn
7
:?n'est pas une déclaration conditionnelle (c'est une expression) ...
Chris Lutz
127
L'entrevue votre chance de briller. Dites-leur "Sans boucles ni conditionnels? Un jeu d'enfant. Je peux le faire sans ordinateur!" Retirez ensuite le stylo et le bloc-notes. Ils peuvent vous donner un aspect confus, mais expliquez simplement que si vous ne pouvez pas compter sur des constructions de langage intégrées, vous ne pouvez vraiment rien supposer.
JohnFx
8
Personnellement, je pense qu'il y avait plusieurs réponses qui avaient des solutions intelligentes et intéressantes. Je pense également que bien que cela puisse facilement être une horrible question d'entrevue, elle pourrait avoir une bonne valeur, tant que l'intervieweur ne recherche pas tant une solution complètement bien formée que la question de savoir si la personne interrogée a envisagé des approches qui indiquent une connaissance de TMP ou l'utilisation de constructions de manière inhabituelle. Je pense que ce serait mauvais si cela était utilisé comme une pure question «avoir raison / faux», mais s'il était utilisé comme point de départ d'une discussion, je pourrais voir beaucoup de valeur.
Michael Burr
Réponses:
785
Compiler la récursion du temps! : 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);}
@Zack: Soyons réalistes, nous imprimons 1 000 lignes à partir d'un programme écrit pour éviter délibérément les boucles. La performance n'est pas un problème.
dreamlax
42
Pour ceux qui sont assez curieux de le compiler: dans g ++, définissez -ftemplate-depth-1000. Le maximum de récursivité du modèle par défaut est 500.
Tom
6
Cela utilise toujours des conditions: la correspondance de motifs est un si glorifié.
David K.
10
@dreamlax: Ce n'est qu'une des choses que j'ai apprises au fil des ans: utilisez à '\n'moins que vous ne vouliez vraiment vider, utilisez à ++imoins que vous n'ayez réellement besoin de l'ancienne valeur de i, passez par constréférence à moins d'avoir une bonne raison de ne pas ... Lorsque les développeurs cessent d'y penser (ou ne commencent même jamais), ils se heurteront tôt ou tard à un problème où cela est important, mais ils ne savaient même pas qu'il y a des endroits où cela pourrait avoir de l'importance.
sbi
1195
Celui-ci compile en fait un assemblage qui n'a pas de conditions:
Eh bien, le code dans cette réponse n'est évidemment ni C ni C ++, donc c'est bien seulement si nous supprimons l'exigence. Ensuite, toute réponse peut être qualifiée car un compilateur hypothétique pourrait simplement produire le programme requis à partir de n'importe quelle entrée.
eq-
321
@PP, c'est assez long à expliquer, mais au fond, jc'est d'abord 1parce que c'est en fait argc, c'est-à-dire 1si le programme est appelé sans arguments. Ensuite, j/1000c'est 0jusqu'à ce que jdevienne 1000, après quoi c'est 1. (exit - main)est bien sûr la différence entre les adresses de exit()et main(). Cela signifie (main + (exit - main)*(j/1000))est main()que jdevient 1000, après quoi il devient exit(). Le résultat final est celui qui main()est appelé lorsque le programme démarre, puis s'appelle récursivement 999 fois en incrémentant j, puis appelle exit(). Ouf :)
Frédéric Hamidi
7
C'est l'un des abus les plus étonnants de CI jamais vus. Mais cela fonctionnera-t-il sur toutes les plateformes?
Qwertie
13
@Mark: il s'agit d'une signature non standard de main, vous n'êtes pas autorisé à appeler main de manière récursive, et le résultat de la soustraction des pointeurs de fonction n'est pas défini.
Yakov Galka
9
Ouais, ouais, ce n'est pas du code C ++ strictement légal pour les raisons que @ybungalobill donne, mais je dois +1 pour la pure folie et le fait qu'il compile et fonctionne sur quelques plates-formes. Il y a des moments où la réponse correcte à "Mais ce n'est pas standard!" est "Qui s'en soucie!" :)
Les gens l'ont posté. Les autres versions transmettent le nombre à imprimer au lieu d'utiliser un global, mais c'est essentiellement la même solution.
Chris Lutz
1
@Chris, ils utilisent la même logique exprimée dans les macros ou les modèles, faisant exploser la taille du code, non? Vous pourriez aussi bien générer la chaîne de sortie elle-même au lieu de mille printfs.
Darius Bacon
Oh ouais, je vois que la réponse de Keith génère la chaîne entière, cool. :) J'ai manqué ça.
Darius Bacon
43
Eh bien, un bel effort, mais plutôt étrange que vous n'ayez pas décomposé 8 en 2 * 2 * 2 et que vous ayez donc utilisé la factorisation de facteurs premiers unique
David Heffernan
298
On dirait qu'il n'a pas besoin d'utiliser de boucles
on pourrait dire que l'utilisation copyest de la triche
John Dibling
13
@Johannes en fait, je suis presque sûr d' printfavoir une boucle: p
icecrime
1
@litb: Notez que je n'ai pas dit que "utiliser, copyc'est tricher"
John Dibling
2
@John: copier c'est tricher. en doutez-vous? : P
Nawaz
1
sur une échelle de 1 à 10, quelle est la chance que j'utilise le binaire?
Jordan
270
Voici trois solutions que je connais. La seconde pourrait être discutée cependant.
// 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}
[ Modifier: (1) et (4) peuvent être utilisés uniquement pour la compilation des constantes de temps, (2) et (3) peuvent également être utilisés pour les expressions d'exécution - terminer la modification. ]
De plus, je dirais qu'un court-circuit n'est pas un conditionnel ... Pas une déclaration, c'est vrai, mais une expression conditionnelle, je dirais. À condition de définir une expression conditionnelle comme "quelque chose qui génère des sauts conditionnels dans l'assembleur".
Kos
5
Question qui m'a frappé lors de la lecture du constructeur: la norme exige-t-elle que chaque élément du tableau soit construit en séquence? Il importerait que le constructeur ait des effets secondaires. Je suis sûr que chaque compilateur sensé l'implémente comme une boucle 0-> 1000, mais je me demande si vous pourriez toujours être conforme et faire une boucle en arrière ...
Joseph Garvin
6
@Joseph - Le constructeur ne devrait pas être affecté par l'ordre dans lequel les objets individuels sont lancés, mais c'est une bonne question.
Chris Lutz
12
@Joseph ceci est défini par 12.6 / 3 (C ++ 03). L'initialisation se fait par ordre d'abonnement.
Johannes Schaub - litb
2
@Joseph: Et ils sont également détruits dans l'ordre inverse, vous pouvez donc utiliser un destructeur tout aussi facilement :)
mon préféré après 'printf ("nombres de 1 à 1000")' - les questions idiotes nécessitent des réponses idiotes.
SEngstrom
C'est génial. +1 pour avoir profité de l'ambiguïté de la question. haha
Nawaz
2
Édité; en aucune manière, la forme ou la forme a ce code print "Print numbers from 1 to 1000."- question ambiguë pour la victoire, les descriptions inexactes sucent :)
sehe
Wow, il y a eu un peu de vandalisme sur les réponses à cette question ces derniers temps. Quelque chose me dit que nous devrions mettre à niveau ce verrou vers un verrou historique.
BoltClock
172
Déclenchez une erreur fatale! Voici le fichier, countup.c:
vous devez appeler fflush (stdout); après chaque printf () ... Lorsqu'un programme plante, il n'est pas garanti que le tampon de sortie sera imprimé à l'écran.
zakk
10
@zakk: Ce n'est pas strictement nécessaire - par défaut, stdout est mis en mémoire tampon, donc le \nsera suffisant pour vider la sortie.
psmears
24
stdout est mis en mémoire tampon de ligne s'il peut être déterminé qu'il s'agit d'un périphérique interactif , sinon il est entièrement mis en mémoire tampon. Si le professeur redirige stdout vers un fichier pour une vérification automatique, vous
échouerez
danger de débordement de pile (par exemple dans un environnement intégré)
High chance /usr/bin/sequtilise une boucle en interne. :)
@jokester: vous voulez dire, parce que Solaris / BSD n'a pas d' sequtilitaire (dans la configuration par défaut)? <sourire />
sehe
Je déteste dire cela (enfin, non, je ne le fais pas), mais il y a un bug dans votre solution. Il n'imprime pas le bon ensemble de chiffres. :) Voici le correctif: system("/bin/echo {1..1000}"); Si seulement vous aviez d'abord écrit le test unitaire ...
Don Branson
1
Un mec brillant a décidé de changer ma réponse, ce n'est donc pas mon erreur.
moinudin
100
Non testé, mais devrait être le standard C vanille:
l'exigence est "pas de conditions" (si, interrupteur, etc.). pas "sans conditions"
jon_darkstar
32
<n'est pas une condition. C'est un opérateur relationnel. if/ elseest une instruction conditionnelle. ?:est un opérateur conditionnel. <est juste un opérateur qui retourne une valeur booléenne. Il s'agit probablement d'une seule instruction machine sans saut ni quoi que ce soit.
Chris Lutz
12
Lutz @ Chris: Sur x86, il est 3: instructions cmpl, setleet movzbl. x86-64 est cela plus un cltq. PowerPC est 2 instructions: cmpwiet crnot.
Adam Rosenfield
4
1 - i / 1000. Aucune comparaison!
Thai
96
Un peu ennuyeux par rapport aux autres ici, mais probablement ce qu'ils recherchent.
Le rend plus court. définir i = 1 en dehors de main puis à l'intérieur de main: printf ("% d \ n", 11 - i) && --i && main (i);
jftuga
3
@Jens Schauder: En profitant de l' &&évaluation paresseuse dans la première ligne de f().
Rafał Dowgird
10
Ce n'est pas ennuyeux, c'est simple. Si vous pouvez faire la même chose avec une fonction courte que vous pouvez avec un énorme gâchis de magie de modèle, alors vous devriez le faire avec la fonction :)
amertune
21
Le && est un conditionnel. Un ET mathématique évaluera les deux côtés (comme le font Java et Ada "ET"). && n'évaluera le 2e opérateur que si (le voici) le premier est vrai. Ou autre exemple: dans Ada, l'opérateur de court-circuit est appelé "OU ALORS" - en utilisant ALORS pour indiquer l'aspect conditionnel. Désolé, vous auriez pu tout aussi bien utiliser le? : opérateur.
Martin
Pas besoin de s'excuser. && est un opérateur de comparaison. L'opérateur ternaire est un conditionnel.
Aaron
71
La tâche n'a jamais spécifié que le programme doit se terminer après 1000.
Peut être raccourci uniquement si vous supprimez l'exigence de C ou C ++. Ensuite, tout "programme" fera l'affaire, car un compilateur théorique pourrait générer le programme que vous voulez (à partir de n'importe quelle entrée).
eq-
@eq Encore une fois, cela se compile et fonctionne très bien…
Mark McDonald
72
Après coup: nous pouvons même échapper aux mathématiques apparentes . Si nous employons rand(), nous imprimerons tous les nombres de 1 à 1000. Finalement =: P
5
@pooh: Pas nécessairement, car rand () a une chance de se répéter après une certaine séquence, et cette séquence pourrait ne pas tomber dans la solution définie pour ce problème
dchhetri
71
C'est de la tarte! : P
#include<iostream>staticint current =1;structprint{print(){ std::cout << current++<< std::endl;}};int main(){print numbers [1000];}
vous voudrez peut-être faire "static int current = 0" sinon vous imprimerez de 2 à 1001.
Shinnok
j'ai changé ++ actuel en courant ++
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);}
Nous pouvons lancer 1000 threads, chacun imprimant l'un des numéros. Installez OpenMPI , compilez en utilisant mpicxx -o 1000 1000.cppet exécutez en utilisant mpirun -np 1000 ./1000. Vous devrez probablement augmenter votre limite de descripteurs à l'aide de limitou ulimit. Notez que cela sera plutôt lent, à moins que vous n'ayez beaucoup de cœurs!
Boucle implicite dans la bibliothèque? Mais +1 quand même pour une nouvelle approche.
Chris Lutz
11
@Chris La plupart des solutions n'ont-elles pas une boucle cachée quelque part?
moinudin
Je suppose que si vous prenez l'approche "boucles dans le compilateur". Puisque (en dehors d'une boucle possible sur les arguments dans MPI::Init()) je ne peux pas imaginer de boucles dans le binaire réel de votre programme 1000.cpp, je vous ai donné un +1, même s'il y a certainement des boucles en cours d'exécution lorsque vous l'exécutez.
Chris Lutz
40
Avec C simple:
#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;}
Bien sûr, vous pouvez implémenter la même idée pour d'autres bases (2: print2 print4 print8 ...) mais le nombre 1000 ici suggère la base 10. Vous pouvez également réduire un peu le nombre de lignes en ajoutant des fonctions intermédiaires: print2() print10() print20() print100() print200() print1000()et d'autres alternatives équivalentes.
Pourquoi le nombre 1000 suggère-t-il la base 10? Dans toute notation positionnelle avec base B, 1000 est un nombre parfaitement valide et toujours égal B^3.
Philip
Je voulais juste dire que, étant donné la façon dont le nombre est représenté dans la base 10, la factorisation "10x10x10" s'est suggérée, mais que d'autres alternatives sont possibles. Je suppose que j'aurais dû dire "factorisation" au lieu de "base"
leonbloy
34
Utilisez simplement std :: copy () avec un itérateur spécial.
Je pense que votre code commence à 0. Je suis également d'accord avec Chris, la question telle que je l'ai vue il y a des années a été déclarée "sans aucune bibliothèque sauf pour IO". encore +1 :)
Yakov Galka
3
@Chris Lutz: L'implémentation de la copie n'est pas définie. Je peux même utiliser le code du modèle comme ci-dessus (vous ne le savez pas; je ne sais pas). Vous ne pouvez donc pas dire qu'il utilise une boucle parce que nous ne savons pas.
Martin York
7
En fait, mon choix médiocre ne serait pas autant la boucle implicite std::copyque le conditionnel implicite dans le operator !=(). Quoi qu'il en soit, c'est une approche intelligente du traitement d'une plage, et des approches intelligentes sont ce que je recherche en réponse à des questions comme celle-ci.
Michael Burr
l'implémentation spécifique n'est pas définie
selvaiyyamperumal
@selvaiyyamperumal: Je ne sais pas exactement de quoi vous parlez. Mais si vous parlez de comportement, la norme n'est pas d'accord avec vous. «Comportement défini par l'implémentation» signifie qu'il est bien défini mais doit être explicitement documenté par l'implémentation. "Comportement indéfini" signifie que tout peut arriver.
Martin York
33
Utilisation du pointeur de fonction (ab). Pas de magie de préprocesseur pour augmenter la sortie. 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();}
Voilà à quoi je pensais. Une personne précédente a dit que 5 * 5 * 5 * 8 = 1000. Je pensais que c'était drôle qu'il lui manquait les 10 ^ 3 évidents. Bonne solution!
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);}
tout va bien, mais pourquoi "void main ()"? les mauvaises habitudes disparaissent rarement? : P
Nawaz
30
@Nawaz: Parce que c'est secrètement une application Windows GUI, donc cela n'a pas d'importance. Je l'ai seulement appelé "principal" parce que je pensais aux homards et à l'orthographe terrible.
Martin
29
Débordement de pile:
#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);}
C'est pour une pile de 8 Mo. Chaque appel de fonction semble prendre environ 32 octets (d'où le 32 * 1000). Mais ensuite, lorsque je l'ai exécuté, je n'ai atteint que 804 (d'où le 196 * 32; peut-être que le runtime C a d'autres parties de la pile que vous devez également déduire).
En remarque: j'ai pris l'interdiction des conditionnels pour s'étendre également aux opérateurs logiques et relationnels. Si vous autorisez la négation logique, l'appel récursif peut être simplifié pour:
j'aime la façon dont vous l'avez avec le décalage de bits. mais avec votre simplification après coup, que fait le double coup? son au niveau du bit ou logique? im perdu et google m'a fait tourner en rondfuncs[!!(limit-1)](x+1, limit-1);
jon_darkstar
Je préfère en avoir un seul !et changer les éléments du tableau de pointeurs de fonction, mais je ne sais pas si cela fonctionnera bien avec votre autre folie.
Chris Lutz
@Chris: Je suis entièrement d'accord - mais je n'ai envisagé d'utiliser des opérateurs logiques / relationnels qu'après la publication, et je me suis dit qu'un patch sur une seule ligne serait plus approprié. En outre, il s'intègre un peu mieux à l'ensemble de la sensation obscurcie du problème.
Michael Burr
24
Je pense que cette réponse sera très simple et facile à comprendre.
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;}
Votre réponse utilise des instructions conditionnelles, qui sont interdites selon la question.
stevelove
4
les instructions conditionnelles sont sinon, etc. Je viens d'utiliser une opération logique !! Hpe c'est clair!
Pappu
2
Même dans vos commentaires, vous avez écrit "Si oui, appelez la fonction récursive pour imprimer". Un conditionnel écrit d'une manière non évidente est toujours un conditionnel. La valeur par défaut num est également conditionnelle.
Gerry
23
J'ai raté tout le plaisir, toutes les bonnes réponses C ++ ont déjà été postées!
C'est la chose la plus étrange que j'ai pu trouver, je ne parierais pas que c'est légal C99 cependant: p
#include<stdio.h>int i =1;int main(int argc,char*argv[printf("%d\n", i++)]){return(i <=1000)&& main(argc, argv);}
Un autre, avec un peu de triche:
#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,~));}
J'étais moi-même curieux à ce sujet. Cela fonctionne correctement avec GCC, mais je ne sais pas si c'est un comportement bien défini.
Keithmo
Bien défini dans C99, je ne me souviens pas de ce que C89 a dit, cela cause des problèmes avec au moins certaines versions de MSVC si la mémoire est bonne.
printf
et d'imprimer deux numéros à chaque fois, non?:?
n'est pas une déclaration conditionnelle (c'est une expression) ...Réponses:
Compiler la récursion du temps! : P
la source
'\n'
moins que vous ne vouliez vraiment vider, utilisez à++i
moins que vous n'ayez réellement besoin de l'ancienne valeur dei
, passez parconst
référence à moins d'avoir une bonne raison de ne pas ... Lorsque les développeurs cessent d'y penser (ou ne commencent même jamais), ils se heurteront tôt ou tard à un problème où cela est important, mais ils ne savaient même pas qu'il y a des endroits où cela pourrait avoir de l'importance.Celui-ci compile en fait un assemblage qui n'a pas de conditions:
Edit: Ajout de '&' pour qu'il considère l'adresse, évitant ainsi les erreurs de pointeur.
Cette version de ce qui précède en C standard, car elle ne repose pas sur l'arithmétique sur les pointeurs de fonction:
la source
j
c'est d'abord1
parce que c'est en faitargc
, c'est-à-dire1
si le programme est appelé sans arguments. Ensuite,j/1000
c'est0
jusqu'à ce quej
devienne1000
, après quoi c'est1
.(exit - main)
est bien sûr la différence entre les adresses deexit()
etmain()
. Cela signifie(main + (exit - main)*(j/1000))
estmain()
quej
devient1000
, après quoi il devientexit()
. Le résultat final est celui quimain()
est appelé lorsque le programme démarre, puis s'appelle récursivement 999 fois en incrémentantj
, puis appelleexit()
. Ouf :)Je suis surpris que personne ne semble avoir posté cela - je pensais que c'était le moyen le plus évident.
1000 = 5*5*5*8.
la source
On dirait qu'il n'a pas besoin d'utiliser de boucles
la source
copy
est de la tricheprintf
avoir une boucle: pcopy
c'est tricher"Voici trois solutions que je connais. La seconde pourrait être discutée cependant.
[ Modifier: (1) et (4) peuvent être utilisés uniquement pour la compilation des constantes de temps, (2) et (3) peuvent également être utilisés pour les expressions d'exécution - terminer la modification. ]
la source
Je n'écris pas la déclaration printf 1000 fois!
Vous êtes les bienvenus ;)
la source
$r='printf("'; for (1..1000) { $r.="$_\\n" } $r.='");'; print $r;
Il n'imprime pas tous les nombres, mais il "Imprime les nombres de 1 à 1000". Question ambiguë pour la victoire! :)
la source
print "Print numbers from 1 to 1000."
- question ambiguë pour la victoire, les descriptions inexactes sucent :)Déclenchez une erreur fatale! Voici le fichier, countup.c:
Compilez, puis exécutez à l'invite du shell:
Cela imprime en effet les nombres de 1 à 1000, sans boucles ni conditions!
la source
\n
sera suffisant pour vider la sortie.Utilisation des commandes système:
la source
/usr/bin/seq
utilise une boucle en interne. :)seq
utilitaire (dans la configuration par défaut)? <sourire />system("/bin/echo {1..1000}");
Si seulement vous aviez d'abord écrit le test unitaire ...Non testé, mais devrait être le standard C vanille:
la source
<
n'est pas une condition. C'est un opérateur relationnel.if
/else
est une instruction conditionnelle.?:
est un opérateur conditionnel.<
est juste un opérateur qui retourne une valeur booléenne. Il s'agit probablement d'une seule instruction machine sans saut ni quoi que ce soit.cmpl
,setle
etmovzbl
. x86-64 est cela plus uncltq
. PowerPC est 2 instructions:cmpwi
etcrnot
.1 - i / 1000
. Aucune comparaison!Un peu ennuyeux par rapport aux autres ici, mais probablement ce qu'ils recherchent.
la source
&&
évaluation paresseuse dans la première ligne def()
.La tâche n'a jamais spécifié que le programme doit se terminer après 1000.
( Peut être raccourci à ceci si vous exécutez ./a.out sans paramètres supplémentaires )
la source
rand()
, nous imprimerons tous les nombres de 1 à 1000. Finalement =: PC'est de la tarte! : P
la source
la source
Nous pouvons lancer 1000 threads, chacun imprimant l'un des numéros. Installez OpenMPI , compilez en utilisant
mpicxx -o 1000 1000.cpp
et exécutez en utilisantmpirun -np 1000 ./1000
. Vous devrez probablement augmenter votre limite de descripteurs à l'aide delimit
ouulimit
. Notez que cela sera plutôt lent, à moins que vous n'ayez beaucoup de cœurs!Bien sûr, les numéros ne seront pas nécessairement imprimés dans l'ordre, mais la question ne nécessite pas qu'ils soient commandés.
la source
MPI::Init()
) je ne peux pas imaginer de boucles dans le binaire réel de votre programme 1000.cpp, je vous ai donné un +1, même s'il y a certainement des boucles en cours d'exécution lorsque vous l'exécutez.Avec C simple:
Bien sûr, vous pouvez implémenter la même idée pour d'autres bases (2: print2 print4 print8 ...) mais le nombre 1000 ici suggère la base 10. Vous pouvez également réduire un peu le nombre de lignes en ajoutant des fonctions intermédiaires:
print2() print10() print20() print100() print200() print1000()
et d'autres alternatives équivalentes.la source
B
, 1000 est un nombre parfaitement valide et toujours égalB^3
.Utilisez simplement std :: copy () avec un itérateur spécial.
la source
std::copy
que le conditionnel implicite dans leoperator !=()
. Quoi qu'il en soit, c'est une approche intelligente du traitement d'une plage, et des approches intelligentes sont ce que je recherche en réponse à des questions comme celle-ci.Utilisation du pointeur de fonction (ab). Pas de magie de préprocesseur pour augmenter la sortie. ANSI C.
la source
la source
Réponse Ugly C (déroulée pour une seule trame de pile par puissance de 10):
la source
Débordement de pile:
C'est pour une pile de 8 Mo. Chaque appel de fonction semble prendre environ 32 octets (d'où le 32 * 1000). Mais ensuite, lorsque je l'ai exécuté, je n'ai atteint que 804 (d'où le 196 * 32; peut-être que le runtime C a d'autres parties de la pile que vous devez également déduire).
la source
Amusant avec les pointeurs de fonction (rien de tout cela TMP nouveau-né nécessaire):
En remarque: j'ai pris l'interdiction des conditionnels pour s'étendre également aux opérateurs logiques et relationnels. Si vous autorisez la négation logique, l'appel récursif peut être simplifié pour:
la source
funcs[!!(limit-1)](x+1, limit-1);
!
et changer les éléments du tableau de pointeurs de fonction, mais je ne sais pas si cela fonctionnera bien avec votre autre folie.Je pense que cette réponse sera très simple et facile à comprendre.
la source
J'ai raté tout le plaisir, toutes les bonnes réponses C ++ ont déjà été postées!
C'est la chose la plus étrange que j'ai pu trouver, je ne parierais pas que c'est légal C99 cependant: p
Un autre, avec un peu de triche:
Dernière idée, même triche:
la source
main
entraîne un comportement indéfini si je me souviens bien.&&
et||
seraient probablement tomber sous « conditionals » car ils court-circuit (comme le ferait?:
).C'est de la tarte:
méthode d'exécution:
La spécification ne dit pas que la séquence doit être générée à l' intérieur du code :)
la source
la source
la source
Plus d'abus de préprocesseur:
Je me sens tellement sale; Je pense que je vais prendre une douche maintenant.
la source
A2()
sans argument comme ça?Si les solutions POSIX sont acceptées:
la source
Puisqu'il n'y a aucune restriction sur les bugs ..
Ou encore mieux (?),
la source
volatile
à la déclaration dej