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.