La respuesta obvia es usar 500 llamadas printfe imprimir dos números cada vez, ¿no?
James McNellis
433
printf ("números del 1 al 1000");
jondavidjohn
77
:?no es una declaración condicional (es una expresión) ...
Chris Lutz
127
La entrevista tu oportunidad de brillar. Dígales "¿Sin bucles ni condicionales? Juego de niños. ¡Puedo hacerlo sin una computadora!" Luego saque el bolígrafo y el bloc de notas. Pueden darle una mirada confusa, pero solo explique que si no puede contar con construcciones de lenguaje incorporadas, realmente no puede asumir nada.
JohnFx
8
Personalmente, creo que hubo varias respuestas que tuvieron soluciones inteligentes e interesantes. También creo que si bien esta podría ser una pregunta de entrevista horrible, podría tener un buen valor, siempre y cuando el entrevistador realmente no busque tanto una solución completamente bien formada como si el entrevistado consideró enfoques que indiquen conocimiento de TMP o el uso de construcciones de formas inusuales. Creo que sería malo si esto se usara como una pregunta pura de "acierto / error", pero si se usara como el punto de partida de una discusión, podría ver mucho valor.
Michael Burr
Respuestas:
785
Tiempo de compilación recursividad! :PAGS
#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);}
¿Alguien puede explicarme cómo funciona esto? muy impresionante.
Gath
28
@Zack: Seamos realistas, estamos imprimiendo 1,000 líneas de un programa escrito para evitar bucles deliberadamente. El rendimiento no es un problema.
dreamlax
42
Para aquellos lo suficientemente curiosos como para compilar esto: en g ++, establezca -ftemplate-depth-1000. La recursividad máxima de plantilla predeterminada es 500.
Tom
66
Esto todavía utiliza condicionales: la coincidencia de patrones es un glorificado if.
David K.
10
@dreamlax: Es solo una de esas cosas que he aprendido de la experiencia a lo largo de los años: use a '\n'menos que realmente quiera enjuagar, use a ++imenos que realmente necesite el valor anterior i, pase por constreferencia a menos que tenga una buena razón para no ... Cuando los desarrolladores dejan de pensar en estos (o nunca comienzan), tarde o temprano se encontrarán con un problema donde esto importa, solo que ni siquiera sabían que hay puntos en los que podría importar.
sbi
1195
Este realmente se compila en un ensamblaje que no tiene condicionales:
Bueno, el código en esta respuesta obviamente no es ni C ni C ++, por lo que está bien solo si eliminamos el requisito. Entonces cualquier respuesta puede calificar porque un compilador hipotético podría producir el programa requerido desde cualquier entrada.
eq-
321
@PP, eso es bastante largo de explicar, pero básicamente jes inicialmente 1porque en realidad argces así, 1si el programa se llama sin argumentos. Entonces, j/1000es 0hasta que se jconvierte 1000, después de lo cual es 1. (exit - main)es, por supuesto, la diferencia entre las direcciones de exit()y main(). Eso significa que (main + (exit - main)*(j/1000))es main()hasta que se jconvierte 1000, después de lo cual se convierte exit(). El resultado final es que main()se llama cuando se inicia el programa, luego se llama recursivamente 999 veces mientras se incrementa j, luego se llama exit(). Whew :)
Frédéric Hamidi
77
Este es uno de los abusos más sorprendentes de CI que he visto. ¿Pero funcionará en todas las plataformas?
Qwertie
13
@ Mark: esta no es la firma estándar de main, no se le permite llamar a main de forma recursiva y el resultado de restar los punteros de función no está definido.
Yakov Galka
99
Sí, sí, no es un código C ++ estrictamente legal por las razones que explica @ybungalobill, pero tengo que hacer +1 por pura locura y el hecho de que compila y funciona en algunas plataformas. Hay momentos en que la respuesta correcta a "¡Pero no es estándar!" es "¡A quién le importa!" :)
La gente ha publicado esto. Las otras versiones pasan el número para imprimir en lugar de usar un global, pero es esencialmente la misma solución.
Chris Lutz
1
@ Chris, usan la misma lógica expresada en macros o plantillas, explotando el tamaño del código, ¿verdad? También podría generar la cadena de salida en lugar de mil printfs.
Darius Bacon
Oh sí, veo que la respuesta de Keith genera toda la cadena, genial. :) Me lo perdí.
Darius Bacon
43
Bueno, buen esfuerzo, pero bastante extraño que no descompongas 8 en 2 * 2 * 2 y, por lo tanto, utilices la factorización prima única
@Johannes en realidad estoy bastante seguro de que printftiene un bucle: p
icecrime
1
@litb: Tenga en cuenta que no dije que "usar copyes hacer trampa"
John Dibling
2
@John: copiar es hacer trampa. lo dudas? : P
Nawaz
1
en una escala del 1 al 10, ¿cuál es la posibilidad de que esté usando binario?
Jordan
270
Aquí hay tres soluciones que sé. Sin embargo, el segundo podría ser discutido.
// 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}
[ Editar: (1) y (4) se pueden usar solo para compilar constantes de tiempo, (2) y (3) también se pueden usar para expresiones de tiempo de ejecución - finalice la edición. ]
Además, diría que un cortocircuito no es condicional ... No es una declaración, es cierto, sino una expresión condicional, diría. Siempre que definamos una expresión condicional como "algo que produce saltos condicionales en ensamblador".
Kos
55
Pregunta que me golpeó al leer el constructor: ¿El estándar exige que cada elemento de la matriz se construya en secuencia? Importaría si el constructor tuviera efectos secundarios. Estoy seguro de que cada compilador cuerdo lo implementa como un ciclo 0-> 1000, pero me pregunto si aún podría cumplir y hacer un ciclo hacia atrás ...
Joseph Garvin
66
@Joseph: el constructor no debería verse afectado por el orden en que se inician los objetos individuales, pero es una buena pregunta.
Chris Lutz
12
@Joseph, esto se define en 12.6 / 3 (C ++ 03). La inicialización se realiza en orden de suscripción.
Johannes Schaub - litb
2
@Joseph: Y también se destruyen en orden inverso, por lo que podría usar un destructor con la misma facilidad :)
j_random_hacker
263
¡No estoy escribiendo la declaración printf 1000 veces!
mi favorito después de 'printf ("números del 1 al 1000") - las preguntas tontas requieren respuestas tontas.
SEngstrom
Esto es asombroso. +1 por aprovechar la ambigüedad en la pregunta. jaja
Nawaz
2
Editado; de ninguna manera, o forma, este código print "Print numbers from 1 to 1000."- pregunta ambigua para la victoria, descripciones inexactas apestan :)
sehe
Wow, últimamente ha habido un poco de vandalismo en las respuestas de esta pregunta. Algo me dice que deberíamos actualizar ese bloqueo a un bloqueo histórico.
BoltClock
172
¡Activa un error fatal! Aquí está el archivo, countup.c:
debe llamar a fflush (stdout); después de cada printf () ... Cuando un programa falla, no se garantiza que el búfer de salida se imprima en la pantalla.
zakk
10
@zakk: Eso no es estrictamente necesario: de forma predeterminada, stdout tiene un buffer de línea, por lo \nque será suficiente para vaciar la salida.
Salidas del
24
stdout tiene un buffer de línea si se puede determinar que es un dispositivo interactivo , de lo contrario, está completamente protegido. Si el profesor redirige stdout a un archivo para verificación automática,
fallarás
peligro de desbordamiento de pila (por ejemplo, en un entorno incrustado)
Alta probabilidad /usr/bin/sequtiliza un bucle internamente. :)
@jokester: ¿quiere decir que Solaris / BSD no tiene una sequtilidad (en la configuración predeterminada)? <sonrisa />
sehe
Odio decir esto (bueno, no, no lo hago), pero hay un error en su solución. No imprime el conjunto correcto de números. :) Aquí está la solución: system("/bin/echo {1..1000}"); Si solo hubieras escrito la prueba de la unidad primero ...
Don Branson
1
Un tipo brillante decidió cambiar mi respuesta, así que ese no es mi error.
el requisito es "sin condicionales" (if, switch, etc.). no "sin condiciones"
jon_darkstar
32
<No es una condición. Es un operador relacional. if/ elsees una declaración condicional. ?:Es un operador condicional. <es solo un operador que devuelve un valor booleano. Probablemente sea una sola instrucción de máquina sin saltos ni nada.
Chris Lutz
12
@ Chris Lutz: En x 86, que es 3: instrucciones cmpl, setley movzbl. x86-64 es eso más a cltq. PowerPC es 2 instrucciones: cmpwiy crnot.
Adam Rosenfield
44
1 - i / 1000. No hay comparaciones!
Tailandés
96
Un poco aburrido en comparación con otros aquí, pero probablemente lo que están buscando.
Lo hizo más corto. establecer i = 1 fuera de main y luego dentro de main: printf ("% d \ n", 11 - i) && --i && main (i);
jftuga
3
@Jens Schauder: Al aprovechar la &&evaluación perezosa en la primera línea de f().
Rafał Dowgird
10
Esto no es aburrido, es simple. Si puede hacer lo mismo con una función corta como puede hacerlo con un enorme desorden de plantilla mágica, entonces debe hacerlo con la función :)
amertune
21
El && es condicional. Un AND matemático evaluará ambos lados (como lo hace Java & y Ada "AND") && evaluará el segundo operador solo si (aquí está) el primero es verdadero. O otro ejemplo: en Ada, el operador de cortocircuitos se llama "O ENTONCES", usando ENTONCES para indicar el aspecto condicional. Lo siento, ¿podrías haber usado el? : operador.
Martin
No necesitas disculparte. && es un operador de comparación. El operador ternario es condicional.
Aaron
71
La tarea nunca especificó que el programa debe terminar después de 1000.
Sin embargo, no se detiene en 1000. Simplemente sigue adelante.
Remy Lebeau
Solo se puede acortar si elimina el requisito de C o C ++. Entonces cualquier "programa" funcionará, porque un compilador teórico podría generar el programa que desea (desde cualquier entrada).
eq-
@eq Nuevamente, esto se compila y funciona bien ...
Mark McDonald
72
Como una ocurrencia tardía: incluso podemos evadir las matemáticas aparentes . Si empleamos rand(), imprimiremos todos los números del 1 al 1000. Eventualmente =: P
55
@pooh: No necesariamente, ya que rand () tiene la posibilidad de repetirse después de cierta secuencia, y esa secuencia podría no estar en la solución establecida para este problema
dchhetri
71
¡Muy fácil! :PAGS
#include<iostream>staticint current =1;structprint{print(){ std::cout << current++<< std::endl;}};int main(){print numbers [1000];}
es posible que desee hacer "static int current = 0", de lo contrario se imprimirá de 2 a 1001.
Shinnok
Cambié ++ actual a actual ++
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);}
Podemos lanzar 1000 hilos, cada uno imprimiendo uno de los números. Instale OpenMPI , compile usando mpicxx -o 1000 1000.cppy ejecute usando mpirun -np 1000 ./1000. Probablemente necesitará aumentar su límite de descriptor usando limito ulimit. Tenga en cuenta que esto será bastante lento, ¡a menos que tenga muchos núcleos!
¿Bucle implícito en la biblioteca? Pero de todos modos +1 para un nuevo enfoque.
Chris Lutz
11
@Chris ¿La mayoría de las soluciones no tienen un bucle oculto en alguna parte?
moinudin
Supongo que si tomas el enfoque de "bucles en el compilador". Dado que (fuera de un posible bucle sobre los argumentos en MPI::Init()) no puedo imaginar ningún bucle en el binario real de su programa 1000.cpp, le di un +1, aunque ciertamente hay bucles en ejecución cuando lo ejecuta.
Chris Lutz
40
Con llanura 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;}
Por supuesto, puede implementar la misma idea para otras bases (2: print2 print4 print8 ...) pero el número 1000 aquí sugiere la base 10. También puede reducir un poco el número de líneas que agregan funciones intermedias: print2() print10() print20() print100() print200() print1000()y otras alternativas equivalentes.
¿Por qué el número 1000 sugiere la base 10? En cualquier notación posicional con base B, 1000 es un número perfectamente válido y siempre es igual B^3.
Philip
Simplemente quise decir que, dada la forma en que se representa el número en la base 10, la factorización "10x10x10" se sugirió, pero que otras alternativas son posibles. Creo que debería haber dicho "factorización" en lugar de "base"
leonbloy
34
Simplemente use std :: copy () con un iterador especial.
Creo que su código comienza desde 0. También estoy de acuerdo con Chris, la pregunta como la vi hace años se declaró como "sin ninguna biblioteca, excepto IO". todavía +1 :)
Yakov Galka
3
@ Chris Lutz: La implementación de la copia no está definida. Incluso puedo usar el código de plantilla como el anterior (simplemente no lo sabes). Entonces no puedes decir que usa un bucle porque no lo sabemos.
Martin York
77
En realidad, mi selección de liendres no sería el bucle implícito std::copytanto como el condicional implícito en el operator !=(). De todos modos, es una forma inteligente de procesar un rango, y los enfoques inteligentes es lo que busco en respuesta a preguntas como esta.
Michael Burr
la implementación específica no está definida
selvaiyyamperumal
@selvaiyyamperumal: No estoy seguro exactamente de lo que estás hablando. Pero si está hablando de comportamiento, el estándar no está de acuerdo con usted. "Comportamiento definido de implementación" significa que está bien definido, pero la implementación debe documentarlo explícitamente. "Comportamiento indefinido" significa que cualquier cosa puede suceder.
Martin York
33
Uso del puntero de función (ab). Sin magia de preprocesador para aumentar la producción. 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();}
Esto es en lo que estaba pensando. Una persona anterior dijo que 5 * 5 * 5 * 8 = 1000. Pensé que era divertido que le faltara el obvio 10 ^ 3. Buena solución!
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);}
todo está bien, pero ¿por qué "void main ()"? los malos hábitos rara vez desaparecen? : P
Nawaz
30
@Nawaz: Debido a que esta es secretamente una aplicación GUI de Windows, no importa. Solo lo llamé "principal" porque estaba pensando en las langostas y tenía una ortografía terrible.
Martin
29
Desbordamiento de pila:
#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);}
Esto es para una pila de 8 MB. Cada invocación de función parece tomar aproximadamente 32 bytes (de ahí el 32 * 1000). Pero luego, cuando lo ejecuté, solo llegué a 804 (de ahí el 196 * 32; quizás el tiempo de ejecución C tiene otras partes en la pila que también debes deducir).
Como nota al margen: tomé la prohibición de los condicionales para extenderla también a operadores lógicos y relacionales. Si permite la negación lógica, la llamada recursiva se puede simplificar para:
Me gusta cómo lo tienes con el cambio de bits. pero con su simplificación de último momento, ¿qué hace el doble golpe? es bitwise o lógico? estoy perdido y google me hizo dar vueltas en círculosfuncs[!!(limit-1)](x+1, limit-1);
jon_darkstar
Prefiero tener un solo !y cambiar los elementos de la matriz de puntero de función, pero no sé si eso funcionará bien con su otra locura.
Chris Lutz
@ Chris: Estoy completamente de acuerdo, pero no consideré usar operadores lógicos / de relación hasta después de la publicación, y pensé que un parche de una sola línea sería más apropiado. Además, encaja un poco mejor con toda la sensación ofuscada del problema.
Michael Burr
24
Siento que esta respuesta será muy simple y fácil de entender.
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;}
Su respuesta utiliza declaraciones condicionales, que están prohibidas de acuerdo con la pregunta.
stevelove
44
las declaraciones condicionales son, si no, etc. ¡Acabo de usar una operación lógica! Espero que esté claro!
Pappu
2
Incluso en sus comentarios escribió "En caso afirmativo, llame a la función recursiva para imprimir". Un condicional escrito de manera no obvia sigue siendo un condicional. El valor numérico predeterminado también es condicional.
Gerry
23
¡Extrañé toda la diversión, todas las buenas respuestas de C ++ ya se han publicado!
Esto es lo más extraño que se me ocurre, aunque no apostaría que es legal C99: p
#include<stdio.h>int i =1;int main(int argc,char*argv[printf("%d\n", i++)]){return(i <=1000)&& main(argc, argv);}
Otro, con un poco de trampa:
#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
e imprimir dos números cada vez, ¿no?:?
no es una declaración condicional (es una expresión) ...Respuestas:
Tiempo de compilación recursividad! :PAGS
fuente
'\n'
menos que realmente quiera enjuagar, use a++i
menos que realmente necesite el valor anteriori
, pase porconst
referencia a menos que tenga una buena razón para no ... Cuando los desarrolladores dejan de pensar en estos (o nunca comienzan), tarde o temprano se encontrarán con un problema donde esto importa, solo que ni siquiera sabían que hay puntos en los que podría importar.Este realmente se compila en un ensamblaje que no tiene condicionales:
Editar: se agregó '&' para que considere la dirección y, por lo tanto, evada los errores de puntero.
Esta versión de lo anterior en el estándar C, ya que no depende de la aritmética en los punteros de función:
fuente
j
es inicialmente1
porque en realidadargc
es así,1
si el programa se llama sin argumentos. Entonces,j/1000
es0
hasta que sej
convierte1000
, después de lo cual es1
.(exit - main)
es, por supuesto, la diferencia entre las direcciones deexit()
ymain()
. Eso significa que(main + (exit - main)*(j/1000))
esmain()
hasta que sej
convierte1000
, después de lo cual se convierteexit()
. El resultado final es quemain()
se llama cuando se inicia el programa, luego se llama recursivamente 999 veces mientras se incrementaj
, luego se llamaexit()
. Whew :)Me sorprende que nadie haya publicado esto, pensé que era la forma más obvia.
1000 = 5*5*5*8.
fuente
Parece que no necesita usar bucles
fuente
copy
es hacer trampaprintf
tiene un bucle: pcopy
es hacer trampa"Aquí hay tres soluciones que sé. Sin embargo, el segundo podría ser discutido.
[ Editar: (1) y (4) se pueden usar solo para compilar constantes de tiempo, (2) y (3) también se pueden usar para expresiones de tiempo de ejecución - finalice la edición. ]
fuente
¡No estoy escribiendo la declaración printf 1000 veces!
De nada ;)
fuente
$r='printf("'; for (1..1000) { $r.="$_\\n" } $r.='");'; print $r;
No imprime todos los números, pero sí "Imprime números del 1 al 1000". ¡Pregunta ambigua para la victoria! :)
fuente
print "Print numbers from 1 to 1000."
- pregunta ambigua para la victoria, descripciones inexactas apestan :)¡Activa un error fatal! Aquí está el archivo, countup.c:
Compile, luego ejecute en un indicador de shell:
¡De hecho, esto imprime los números del 1 al 1000, sin ningún bucle o condicionales!
fuente
\n
que será suficiente para vaciar la salida.Usando comandos del sistema:
fuente
/usr/bin/seq
utiliza un bucle internamente. :)seq
utilidad (en la configuración predeterminada)? <sonrisa />system("/bin/echo {1..1000}");
Si solo hubieras escrito la prueba de la unidad primero ...No probado, pero debe ser estándar C de vainilla:
fuente
<
No es una condición. Es un operador relacional.if
/else
es una declaración condicional.?:
Es un operador condicional.<
es solo un operador que devuelve un valor booleano. Probablemente sea una sola instrucción de máquina sin saltos ni nada.cmpl
,setle
ymovzbl
. x86-64 es eso más acltq
. PowerPC es 2 instrucciones:cmpwi
ycrnot
.1 - i / 1000
. No hay comparaciones!Un poco aburrido en comparación con otros aquí, pero probablemente lo que están buscando.
fuente
&&
evaluación perezosa en la primera línea def()
.La tarea nunca especificó que el programa debe terminar después de 1000.
( Se puede acortar a esto si ejecuta ./a.out sin parámetros adicionales )
fuente
rand()
, imprimiremos todos los números del 1 al 1000. Eventualmente =: P¡Muy fácil! :PAGS
fuente
fuente
Podemos lanzar 1000 hilos, cada uno imprimiendo uno de los números. Instale OpenMPI , compile usando
mpicxx -o 1000 1000.cpp
y ejecute usandompirun -np 1000 ./1000
. Probablemente necesitará aumentar su límite de descriptor usandolimit
oulimit
. Tenga en cuenta que esto será bastante lento, ¡a menos que tenga muchos núcleos!Por supuesto, los números no se imprimirán necesariamente en orden, pero la pregunta no requiere que se ordenen.
fuente
MPI::Init()
) no puedo imaginar ningún bucle en el binario real de su programa 1000.cpp, le di un +1, aunque ciertamente hay bucles en ejecución cuando lo ejecuta.Con llanura C:
Por supuesto, puede implementar la misma idea para otras bases (2: print2 print4 print8 ...) pero el número 1000 aquí sugiere la base 10. También puede reducir un poco el número de líneas que agregan funciones intermedias:
print2() print10() print20() print100() print200() print1000()
y otras alternativas equivalentes.fuente
B
, 1000 es un número perfectamente válido y siempre es igualB^3
.Simplemente use std :: copy () con un iterador especial.
fuente
std::copy
tanto como el condicional implícito en eloperator !=()
. De todos modos, es una forma inteligente de procesar un rango, y los enfoques inteligentes es lo que busco en respuesta a preguntas como esta.Uso del puntero de función (ab). Sin magia de preprocesador para aumentar la producción. ANSI C.
fuente
fuente
Respuesta fea de C (desenrollada para un solo cuadro de pila por potencia de 10):
fuente
Desbordamiento de pila:
Esto es para una pila de 8 MB. Cada invocación de función parece tomar aproximadamente 32 bytes (de ahí el 32 * 1000). Pero luego, cuando lo ejecuté, solo llegué a 804 (de ahí el 196 * 32; quizás el tiempo de ejecución C tiene otras partes en la pila que también debes deducir).
fuente
Diversión con punteros de función (no se necesita nada de ese TMP novedoso):
Como nota al margen: tomé la prohibición de los condicionales para extenderla también a operadores lógicos y relacionales. Si permite la negación lógica, la llamada recursiva se puede simplificar para:
fuente
funcs[!!(limit-1)](x+1, limit-1);
!
y cambiar los elementos de la matriz de puntero de función, pero no sé si eso funcionará bien con su otra locura.Siento que esta respuesta será muy simple y fácil de entender.
fuente
¡Extrañé toda la diversión, todas las buenas respuestas de C ++ ya se han publicado!
Esto es lo más extraño que se me ocurre, aunque no apostaría que es legal C99: p
Otro, con un poco de trampa:
Última idea, mismo truco:
fuente
main
resulta en un comportamiento indefinido como recuerdo.&&
y||
probablemente caerían en "condicionales" ya que se cortocircuitan (como lo haría?:
).Muy fácil:
método de ejecución:
La especificación no dice que la secuencia debe generarse dentro del código :)
fuente
fuente
fuente
Más abuso del preprocesador:
Me siento tan sucia; Creo que iré a ducharme ahora.
fuente
A2()
sin una discusión como esa?Si se aceptan soluciones POSIX:
fuente
Dado que no hay restricción en los errores ..
O mejor(?),
fuente
volatile
a la declaración dej