Układanka programowania 1 m3ph1st0s (C ++) [zamknięta]

26

To pierwsza z serii łamigłówek C ++ dla Ciebie. Mam nadzieję, że ci się spodoba.

Tak więc zagadka nr 1:

Biorąc pod uwagę następujący program:

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

Wstaw trochę kodu w jednym nowym wierszu w dowolnym miejscu w programie, tak aby wynik wynosił 0. Nowy wiersz będzie zawierać AT MOST 18 znaków (łącznie ze spacjami), a reszta wierszy pozostanie niezmodyfikowana. Dla jasności, oto przykład prawidłowego nowego kodu:

#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;
}

Wstawiono nowy wiersz z 15 znakami, więc jest w porządku. Jednak to nie rozwiązuje problemu.

Jeśli jest to dla ciebie zbyt proste, nie martw się, nadchodzi więcej !!

Bogdan Alexandru
źródło
2
Bardzo się cieszę, że od czasu do czasu ktoś publikuje pytanie w C ++! Mam na myśli, że przy wszystkich łamigłówkach, w których rozwiązaniem C ++ byłoby 20 lub 30 wierszy, osoby publikujące rozwiązania w J, K lub Golfscript po pewnym czasie stają się frustrujące.
Pan Lister,
3
Czy wynik musi być poprawnym, dobrze zdefiniowanym C ++, czy może używać UB? (Ale jak zauważył pan Lister, oryginalny kod nie jest nawet poprawnym C ++.)
Konrad Rudolph,
4
to nie jest poprawne. main musi zwrócić int (przeczytaj standard c ++)
BЈовић
2
brakuje nam tutaj sensu. wstaw int i return 0, jeśli nie masz nic przeciwko.
Bogdan Alexandru
11
@Bogdan: Dafuq? Po pierwsze, DevC ++ jest tak niewymownie starożytny, że jego wydajność jest nieistotna. I po drugie, to, czy dany kompilator w dowolnej konfiguracji w dowolnym momencie celujący w jakimkolwiek systemie operacyjnym akceptuje, nie czyni go poprawnym C ++.
DeadMG,

Odpowiedzi:

14
#define int float

powinien również działać i ma tę samą długość.

Dan
źródło
o tym pomyślałem, kiedy po raz pierwszy wpadłem na ten pomysł
Bogdan Alexandru
5
#define int floatjest faktycznie niezdefiniowanym zachowaniem. Nie wolno nadawać słowom kluczowym nowego znaczenia.
fredoverflow
Fred, możesz przytoczyć swoje źródła? Dokumenty CPC GCC mówią „Możesz zdefiniować dowolny poprawny identyfikator jako makro, nawet jeśli jest to słowo kluczowe C.”
Dan
@Dan: Standard C ++ zabrania tego.
DeadMG
3
Może to być UB, ale i tak obsługuje go kilka popularnych kompilatorów. Zmusiłem #define int ERRORsię do użycia ekwiwalentu int32_tzamiast wbudowanych typów. Zanim doszedłem do int main(), zapomniałem o makrze i zastanawiałem się, dlaczego mój kod się nie skompiluje.
dan04
33

Możemy pozbyć się a = 1, przenosząc go do innego zakresu:

#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;
}

To chyba 13 znaków. Lub jeszcze lepiej uzyskaj nowy, aktóry również spowoduje 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;
}

To 11 znaków

frozenkoi
źródło
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 nowa linia, 12 nowych znaków

tłum
źródło
Właśnie to chciałem przesłać ... +1 dla Ciebie.
H2CO3
Mój pierwszy pomysł po przeczytaniu pytania)))
Qwertiy,
23

Tak więc #define a 0, Gotowe. Widziałem, że został opublikowany - nic dziwnego.

Zaskakujące, że nie zostało to opublikowane:

#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 znaków

To powinno wystarczyć, prawda?

sehe
źródło
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 znaków.

Nawiasem mówiąc, oryginalny program nie kompiluje się pod MSVC, który narzeka, że mainnie ma typu zwrotu.

Pan Lister
źródło
2
int a = 0; // \ również załatwi sprawę
skopiuj
2
Absolutnie. Ale czy jest to konkurs typu „najkrótsza linia wygrywa”?
Pan Lister
Tak myślałem, ale tak nie jest. Nawiasem mówiąc,
skopiuj
2
Tak, najkrótsze rozwiązanie wygrywa na codegolf SE. patrz
często
2
@ BЈовић FAQ mówi, że najkrótsze rozwiązanie wygrywa w przypadku rzeczywistych pytań związanych z golfem. To pytanie nie jest jednoznacznie pytaniem golfowym.
kojiro
11

18, w tym nowa linia

#define float int
shiona
źródło
Nie jestem do końca pewny, czy to działa ... Twój deklarując c jako liczbę zmiennoprzecinkową i inicjując go za pomocą 0.5
Bogdan Alexandru
5
Który obetnie do zera.
DeadMG
masz rację, zabawne, że nigdy nie spotkałem się z inicjowaniem int z wartością dziesiętną, myślałem, że to błąd kompilatora, ale wydaje tylko ostrzeżenie
Bogdan Alexandru
2
@BogdanAlexandru rzuć okiem na standard C ++, szczegółowo opisuje on ukrytą konwersję podczas gry.
oldrinb
2
Zauważ, że chociaż wszystkie kompilatory na to pozwalają, standard zabrania redefiniowania słów kluczowych (i floatjest słowem kluczowym).
avakar
11
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   1?std::cout<<0:
   std::cout << a/b-a*c;
}

15 znaków.

Andrey Regentov
źródło
wyświetli więcej niż „0”
Bogdan Alexandru
2
dlaczego operator trójskładnikowy nie miałby działać?
Andrey Regentov,
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 znaków.

Robaczek świętojański
źródło
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 znaków.

Ashrr
źródło
1
Najlepsze rozwiązanie, ponieważ leci w obliczu wszystkiego, co związane z C ++.
fabspro
3
„puts” nie zostało zadeklarowane w tym zakresie
shiona 30.09.12
@shiona jakiego kompilatora używasz?
Ashrr
@Ashrr gcc (g ++) 4.5.4
shiona
1
Nie myśl, ten kod zwraca 0. Ale możesz zastąpić spację wykrzyknikiem. W każdym razie nie jestem pewien, kiedy put zwraca 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;
}

Ma 17 znaków, więc po prostu pasuje.

marinus
źródło
7

Nie znam C ++, jednak w oparciu o pytanie, czy nie możesz po prostu wpisać wiersza, aby po prostu wyzerować 0? pytanie określa, że ​​wyjście powinno wynosić 0, nie określa, że ​​ZMIEŃ wyjście na 0.

std::cout << 0

(Mam 0 wskazówek na temat C ++, być może ktoś może skorzystać z tej koncepcji)

NRGdallas
źródło
No cóż, wynik powinien wynosić tylko 0, myślałem, że to oczywiste, inaczej nie byłoby układanki, prawda?
Bogdan Alexandru
7
@BogdanAlexandru Przekonasz się, że wykorzystywanie źle napisanego pytania jest powszechną techniką rozwiązywania tych zagadek. Jeśli chcesz uniemożliwić użytkownikom korzystanie ze skrótów, poświęć kilka dodatkowych minut na przeanalizowanie własnego pytania i spróbuj usunąć wszelkie potencjalne niejasności.
nowy
3

12 znaków, podobne do rozwiązania moba

#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;
}

działają również inne kombinacje, takie jak #define a club#define c 0

Csq
źródło
2

Wiem, że to nie jest , ale wydaje mi się, że mam dziś na sobie ten kapelusz!

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

--za;

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

pięć znaków, w tym nowa linia;

Toby Speight
źródło
2
To się nie kompiluje, ponieważ ajest const.
Csq,
Ups, powinienem był przekazać to kompilatorowi! :-(
Toby Speight
0

c ++ cokolwiek ...

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;
}

uruchomić przez:

sh mp.cpp
króliczek
źródło
Dobra próba, ale narusza wymaganie: poprawny C ++.
Konrad Rudolph
0

Wariant odpowiedzi pana Listera, ale nieco mniej oczywisty.

#include <iostream>
int main() 
{
   const float a=1; //??/
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}
Toby Speight
źródło
-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;
}

Co powiesz na te 11 znaków ...

holowniczy
źródło
1
Problem polega na tym, że int aprzed ifinicjowaniem nie inicjuje się, więc amoże mieć dowolną wartość.
frozenkoi
1
Nie jest to zdefiniowane, używasz niezainicjowanej wartości dla a.
Konrad Rudolph