puzzle di programmazione 1 di m3ph1st0s (C ++) [chiuso]


26

Questo è il primo di una serie di puzzle C ++ per te. Spero ti piacerà.

Quindi, puzzle n. 1:

Dato il seguente programma:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Inserisci del codice su una singola nuova riga in qualsiasi punto all'interno del programma in modo che l'output sia 0. La nuova riga conterrà ALMENO 18 caratteri (spazi inclusi) e il resto delle righe rimarrà non modificato. Per essere chiari, ecco un esempio di un nuovo codice valido:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   int* p = NULL;
   const float c=0.5;
   std::cout << a/b-a*c;
}

È stata inserita una nuova riga con 15 caratteri, quindi va bene. Tuttavia non risolve il problema.

Se questo è troppo semplice per te, non preoccuparti, ne arriveranno altri !!


2
Sono molto felice che qualcuno invii occasionalmente una domanda C ++! Voglio dire, con tutti i puzzle in cui una soluzione C ++ sarebbe di 20 o 30 righe, le persone che pubblicano soluzioni in J o K o Golfscript diventano frustranti dopo un po '.
Lister,

3
Il risultato deve essere C ++ valido, ben definito o può usare UB? (Ma come notato da Lister, il codice originale non è nemmeno valido in C ++.)
Konrad Rudolph,

4
non è valido main deve restituire int (leggi lo standard c ++)
BЈовић,

2
ci manca il punto qui. metti un int e un return 0 se ti dispiace, non l'ho fatto.
Bogdan Alexandru,

11
@Bogdan: Dafuq? Per uno, DevC ++ è così indicibilmente antico, il suo output è irrilevante. In secondo luogo, indipendentemente dal fatto che un determinato compilatore in una determinata configurazione in qualsiasi momento venga scelto come target per qualsiasi sistema operativo, non lo rende C ++ valido.
DeadMG,

Risposte:


14
#define int float

dovrebbe funzionare anche ed è della stessa lunghezza.


questo è quello che avevo in mente quando mi è venuta l'idea per la prima volta
Bogdan Alexandru,

5
#define int floatè in realtà un comportamento indefinito. Non ti è permesso dare un nuovo significato alle parole chiave.
fredoverflow,

Fred, puoi citare le tue fonti? I documenti cpp di GCC dicono "Puoi definire qualsiasi identificatore valido come macro, anche se è una parola chiave C."
Dan,

@Dan: lo standard C ++ lo proibisce.
DeadMG,

3
Potrebbe essere UB, ma molti compilatori popolari lo supportano comunque. Ho #define int ERRORcostretto me stesso a usare l'equivalente int32_tinvece dei tipi incorporati. Quando sono arrivato a int main(), mi ero dimenticato della macro e mi chiedevo perché diavolo il mio codice non potesse essere compilato.
dan04,

33

Possiamo sbarazzarci di a = 1 spostandolo in un altro ambito:

#include <iostream>
main() 
{
int a=0;if(0)
    const int a=1;
    const int b=2;
    const float c=0.5;
    std::cout << a/b-a*c;
}

Penso che siano 13 personaggi. O meglio ancora ottenere un nuovo ache si traduce anche in 0:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
if(int a=2)
   std::cout << a/b-a*c;
}

Sono 11 personaggi


24
#include <iostream>
main() 
{
   const int a=1;
#define a 0
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

1 nuova linea, 12 nuovi caratteri


Questo è quello che volevo inviare ... +1 per te.
H2CO3

La mia prima idea quando leggi la domanda)))
Qwertiy il

23

Quindi #define a 0, Fatto. Ho visto che è stato pubblicato - non sorprende.

Sorprendentemente, questo non è stato pubblicato:

#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout<<0||
   std::cout << a/b-a*c;
}

14 caratteri

Quello dovrebbe fare, giusto?


21
#include <iostream>
main() 
{
const int a=0;//\
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

17 caratteri.

A proposito, il programma originale non si compila sotto MSVC, il quale si lamenta che mainnon ha un tipo di ritorno.


2
int a = 0; // \ farà anche il trucco
copia il

2
Assolutamente. Ma questo è un tipo di contest "vittorie più corte"?
Lister,

L'ho pensato, ma non lo è. A proposito, bel trucco
copia il

2
Sì, la soluzione più breve vince su codegolf SE. vedi faq
BЈовић

2
@ BЈовић la FAQ dice che la soluzione più breve vince per le domande sul code-golf. Questa domanda non è chiaramente una questione di code-golf.
Kojiro,

11

18, tra cui newline

#define float int

Non sono proprio sicuro che funzioni ... stai dichiarando c come float e inizializzandolo con 0,5
Bogdan Alexandru,

5
Che troncerà a zero.
DeadMG,

hai ragione, cosa divertente che non ho mai visto inizializzare un int con valore decimale, pensavo che sarebbe stato un errore del compilatore, ma emette solo un avvertimento
Bogdan Alexandru,

2
@BogdanAlexandru dà un'occhiata allo standard C ++, specifica in dettaglio la conversione implicita in gioco qui.
oldrinb,

2
Si noti che sebbene tutti i compilatori lo consentano, lo standard proibisce la ridefinizione delle parole chiave (ed floatè una parola chiave).
avakar,


9
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a 0;1
   std::cout << a/b-a*c;
}

14 caratteri.


7
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   return puts("0");
   std::cout << a/b-a*c;
}

17 caratteri.


1
La migliore soluzione finora, perché vola di fronte a qualsiasi cosa relativa al C ++.
fabspro,

3
`put´ non è stato dichiarato in questo ambito
shiona il

@shiona che compilatore stai usando?
Ashrr,

@Ashrr gcc (g ++) 4.5.4
shiona,

1
Non pensare, questo codice restituisce 0. Ma puoi sostituire lo spazio tramite il punto esclamativo. Ad ogni modo, non sono sicuro quando put restituisce zero.
Qwertiy,

7
#include <iostream>
main()
{
   const int a=1;
   const int b=2;
   const float c=0.5;
std::cout<<0;//\
   std::cout << a/b-a*c;
}

È composto da 17 personaggi, quindi si adatta perfettamente.


7

Non conosco C ++, tuttavia in base alla domanda, non potresti semplicemente inserire una riga per generare semplicemente 0? la domanda specifica che l'output deve essere 0, non specifica che è necessario modificare l'output su 0.

std::cout << 0

(Ho 0 indizio su C ++, forse qualcuno può usare questo concetto però)


Vabbè, l'output dovrebbe essere solo 0, pensavo fosse ovvio, altrimenti non ci sarebbero stati puzzle, vero?
Bogdan Alexandru,

7
@BogdanAlexandru Scoprirai che sfruttare una domanda scritta male è una tecnica comune per risolvere questi enigmi. Se vuoi impedire agli utenti di prendere queste scorciatoie, dedica qualche minuto in più ad analizzare la tua domanda e prova a rimuovere ogni potenziale ambiguità.
Ardnew,

3

12 caratteri, simili alla soluzione di mob

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a b
   std::cout << a/b-a*c;
}

anche altre combinazioni funzionano, come #define a co#define c 0


2

So che non , ma mi sembra di indossare quel cappello oggi!

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;

--un;

   std::cout << a/b-a*c;
}

cinque caratteri, incluso il newline;


2
Questo non viene compilato, perché lo aè const.
Csq,

Oops, avrei dovuto darlo a un compilatore! :-(
Toby Speight,

0

c ++ qualunque ...

echo "0"; exit
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

corri via:

sh mp.cpp

Bel tentativo ma viola il requisito: C ++ valido.
Konrad Rudolph,


-1
#include <iostream>
int main() 
{
int a;if(a)
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Che ne dici di questi 11 caratteri ...


1
Il problema qui è che int aprima ifnon viene inizializzato, quindi apotrebbe avere qualsiasi valore.
frozenkoi,

1
Questo è indefinito, stai usando un valore non inizializzato per a.
Konrad Rudolph,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.