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 !!


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ść.


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


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


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?


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.


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

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



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.


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.


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)


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


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;


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

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

-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 ...


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.