Zagadka C++

0

Wymyśliłem pewną zagadkę programistyczną. Problem wydaje mi się dość ciekawy, więc postanowiłem się nią z wami podzielić pomimo przeczucia, że zostanę zjechany.... :P Zagadka przeznaczona jest dla początkujących programistów.

Napisz program w języku C++ wczytujący na wejściu jedną liczbę całkowitą i wypisujący na wyjściu "1" jeśli podana przez użytkownika liczba jest parzysta bądź "0" jeśli nieparzysta.
W kodzie programu nie mogą zostać użyte:

  • operatory arytmetyczne
  • słowa kluczowe if oraz else
  • znak ";"
0

To jest oszustwo?

#include <cstdio>
#include <bitset>

int main(int d,char**)
{
  while (scanf("%u",&d),printf("%c",std::bitset<32>((unsigned long)d).flip().to_string()[31]),0) {}
}
2

inta, nie ma (chyba, że liczby 32 i 31 wliczać, ale możesz sobie zmienić na 32UL) :P

#include <iostream>
#include <bitset>

int main()
{
  while([](unsigned long d)->bool
    {
      while (std::cin >> d,std::cout << std::bitset<32>(d).flip().to_string()[31],0) {}
    }(0)){}
}

dałoby się na chary przerobić jakbym miał gwarancję, że wejście skończy się dokładnie na ostatnim znaku liczby, bez tej gwarancji wydaje mi się że potrzebny jest chociaż operator porównania, chyba że jeszcze będziemy naokoło kombinować :P

0

Zasugerowawszy się lambdą @krwq skonstruowałem monstrum:

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>

int main() {
  while ([](std::string s, std::string even) -> bool {
    while(std::getline(std::cin, s), !std::cin.fail()) {
      while(std::cout.put((std::find_first_of(std::prev(s.end(), 1),
                                              s.end(),
                                              even.begin(),
                                              even.end()) == s.end()) ? '0' : '1'),
            0) {}
    }     
  }("", "02468")) {}
}

http://ideone.com/TO7VX

Chyba spełnia wymagania OP i z komentarza. :-P

0

Ciekawe rozwiązanie.:P Ale Twój program kwaq się zapęla, a powinno być tak, że: wejście - wyjście - koniec, ale to akurat nie wymaga znacznej modyfikacji.
To może ktoś zostanie tylko przy moich ograniczeniach, plus takie, że tylko jedna biblioteka - iostream bądź cstdio?

2

Ostatni raz w C pisałem gdzieś w czasach gdy dinozaury były dosiadane przez stoortooperów:

#include <stdio.h>

int main(int d) {
    while(printf("Podaj liczbę: "), scanf("%d", &d), printf("%d \n", ((d & 0x01) ^ 0x01))){}
}

chyba dobrze?

wersja "na jedną liczbę":

#include <stdio.h>

int main(int d) {
    while(printf("Podaj liczbę: "), scanf("%d", &d), printf("%d \n", ((d & 0x01) ^ 0x01)), 0){}
}

//edit:

@_13th_Dragon a czy to:

#include <stdio.h>

int main(d) {
    while(printf("Podaj liczbę: "), scanf("%d", &d), printf("%d \n", ((d && 1) || 1)), 0){}
}

z dokładnością do typu int?

0

Może spiszę podsumowanie mojego "utrudnienia".
Napisz program w języku C (nie C++) wczytujący na wejściu jedną liczbę całkowitą i wypisujący na wyjściu "1" jeśli podana przez użytkownika liczba jest parzysta bądź "0" jeśli nieparzysta.
W kodzie programu NIE mogą zostać użyte:

  • #include inny niż <stdio.h>
  • operatory arytmetyczne
  • operatory binarne
  • operator trójargumentowy - W?T:F
  • słowa kluczowe if, else
  • zmienne typu: int, float, double, register (łącznie z modyfikatorami: short, long, signed, unsigned)
  • znak ";"

Kolejne zadanie (dodatkowe utrudnienia) - program ma:

    • nić nie wyświetlać i zwracać kod zakończenia 1, jeżeli wprowadzono nie liczbę;**
    • wyświetlać jak w oryginalnym zadaniu i zwracać kod zakończenia 0, jeżeli wprowadzono liczbę **
      z tym że można dołożyć drugi #include czyli <stdlib.h>

I jeszcze trudniejsze zadanie, to samo co poprzednio, ale: dla parzystych wyświetla - "parzysta"; dla nie parzystych -"nieparzysta!!"

1

W C.

#include <stdio.h>
main(char a, char b, char c)
{
    while(c,a!=10)while(c=getchar(),(c!=10&&(1,b=c)||(1,a=10))&&0){}
    while(((b==48||b==50||b==52||b==54||b==56)&&printf("PARZYSTA")||printf("NIEPARZYSTA"))&&0){}    
}

I bezwarningowy C++

#include <cstdio>
main()
{
    while(char a=1&&a!=10) while(char c=1&&c!=10) while(char b=1&&b!=0)
    {
        while(c,a!=10)while(c=getchar(),(c!=10&&(1,b=c)||(1,a=10))&&0){}
        while(((b==48||b==50||b==52||b==54||b==56)&&printf("PARZYSTA",b=0)||printf("NIEPARZYSTA",b=0))&&0){}
    }
}

Jeszcze wersja z tym zwracaniem.

#include <stdio.h>
#include <stdlib.h>
main(a,b,c)
{
    while(c,a!=10)while(c=getchar(),(c!=10&&(1,b=c)||(1,a=10))&&0){}
    while(((b==48||b==50||b==52||b==54||b==56)&&(1,a=1)||(1,a=0))&&0){} 
    while(exit(a),0){}
}
0

Bez używania nazwy żadnego typu wbudowanego (niewbudowanego też nie). Next goal, no keyword used.

main(a,b,c){
  while(c,a!=10)
    while(c=getchar(),(c!=10&&(1,b=c)||(1,a=10))&&0){
    }
  while(((b==48||b==50||b==52||b==54||b==56)&&printf("PARZYSTA")||printf("NIEPARZYSTA"))&&0){
  }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0