Dodaj komentarze do skryptu Python i uczyń z niego dwujęzyczny „program” Python / C ++

12

Biorąc pod uwagę następujący skrypt Python 3:

def greet():
    print("Hello, world!")

greet()

Dodaj kilka wierszy do tego pliku tekstowego, aby można go było zarówno uruchomić jako program w języku Python, jak i skompilować i uruchomić jako program w języku C ++, generujący to samo wyjście Witaj, świecie! (w tym nowy wiersz na końcu):

$ python3 bilingual.py.cpp
Hello, world!
$ g++ bilingual.py.cpp && ./a.out
Hello, world!

Rozwiązanie zostanie ocenione na podstawie liczby znaków spacji w całym programie, w tym skryptu Python:

sed 's/\s//g' bilingual.py.cpp|wc -c
Leon
źródło
5
W tytule mówisz o dodawaniu komentarzy, jednak w treści mówisz, że musisz tylko wstawić kilka wierszy. Który to jest?
Ad Hoc Garf Hunter
@WheatWizard Tytuł jest wskazówką. Jeśli możesz to rozwiązać przygotowując dowolne wiersze (bez komentarzy), będę zdziwiony.
Leon
To bardzo miłe pytanie. Moją jedyną uwagą byłoby po prostu trzymanie się liczby bajtów w celu zdobywania punktów w przyszłości. Łatwiej jest sprawdzić te w różnych systemach.
Linus
@Linus Przyznaję, że wybranie wyniku w niestandardowy sposób było błędem. Nie powtórzy tego w przyszłości.
Leon
2
Tylko uwaga: podana komenda sed zlicza nowe linie, które są znakami spacji
edc65

Odpowiedzi:

10

Ocena 116

Przygotuj:

#include<cstdio>
#define print(A)main(){puts(A);}
#define greet()
#define \

Wsteczny ukośnik preprocesora \ciągnie nieprzyjemną :linię zawierającą w nieużywane makro. Wypróbuj tutaj .

Dzięki odpowiedzi edc65 na notatkę o domniemanej int w C ++ 4.
Dzięki odpowiedź PieCot jest dla sugerując <cstdio>się <stdio.h>.
Dziękujemy Leonowi za sugestię, że usunę Xoryginał #define X\.

Linus
źródło
Nie mam sed, jeśli ktoś mógłby zweryfikować mój wynik, byłbym bardzo wdzięczny.
Linus,
Usuwając wszystkie białe znaki, moja liczba (ręcznie) wynosi 110 (ale się myliłem ... to 111)
edc65
2
@Linus Dlaczego potrzebujesz X w `#define X \`?
Leon
@Leon dobry połów!
Linus,
2
Dla każdego, kto zastanawia się, czym jest C ++ 4: w tym przypadku jest to skrót od „C ++, które akceptuje gcc 4.3.2” .
nwp
11

Ocena 119

(Thx @Linus dla liczby bajtów)

(1 bajt zapisany thx @ Conor O'Brien) (1 bajt zapisany thx @PieCot)

Licząc bajty ponownie ręcznie, znalazłem 113. Może tym razem jest słuszne. Nie, nie jest

#include <cstdio>
#define def main(){0?
#define print(x) puts(x);}
#define greet()

Notatki: stdio i put są wciąż żywe i działają w C ++. Brakujący typ int jest poprawny w C ++ 4. Test

edc65
źródło
Wynik musi być obliczony na podstawie pełnego programu (w tym kodu python).
Leon
Ponieważ trójkowy warunek może mieć pustą drugą część, możesz usunąć końcowy 0wiersz 2. Test.
Conor O'Brien
OK, nie rozumiem dlaczego, ponieważ kod python będzie taki sam dla każdej odpowiedzi, ale ty jesteś szefem.
Zliczyłem
@ ConorO'Brien to naprawdę może! Nie wiedziałem! Thx
edc65,
Możesz użyć <cstdio> zamiast <stdio.h>
PieCot
7

Ocena 131 130 134

Wiersze do dodania to:

#import <iostream>
#define def int main(){0?
#define greet()
#define print(A) 0;std::cout<<A"\n";}

I wynikowy kod:

#import <iostream>
#define def int main(){0?
#define greet()
#define print(A) 0;std::cout<<A"\n";}
def greet():
    print("Hello, world!")

greet()

Testowanie

C:\Users\Conor O'Brien\Documents\Programming\golf
λ type bilingual.py.cpp

#import <iostream>
#define def int main(){0?
#define greet()
#define print(A) 0;std::cout<<A"\n";}
def greet():
    print("Hello, world!")

greet()
C:\Users\Conor O'Brien\Documents\Programming\golf
λ sed 's/\s//g' bilingual.py.cpp|wc -c
134

C:\Users\Conor O'Brien\Documents\Programming\golf
λ g++ bilingual.py.cpp 2>nul && a
Hello, world!

C:\Users\Conor O'Brien\Documents\Programming\golf
λ python bilingual.py.cpp
Hello, world!

C:\Users\Conor O'Brien\Documents\Programming\golf
λ 
Conor O'Brien
źródło
Dane wyjściowe wersji C ++ nie są identyczne z wersją Pythona - brakuje nowej linii. Dodano to wyjaśnienie do pytania.
Leon
@Leon To jest teraz naprawione.
Conor O'Brien
#importnie jest poprawny C ++
Leon
1
:
Sprytna
2
@Leon Nasze zasady dotyczące witryny mówią, że jeśli działa w jednym środowisku, jest to prawidłowe przesłanie.
Conor O'Brien
5

Ocena 136

Tylko dla akt:

#include <cstdio>
#define def class a{public
#define greet()
#define print(a) };int main(){puts(a);}

Kolejny (mniej wydajny) sposób radzenia sobie z okrężnicą.

PieCot
źródło
1
Ale cstdionależy zauważyć.
edc65,
Myślę, że wynik to 136. Nie liczysz spacji.
Linus
@Linus: Dzięki! Myślę, że masz rację. Jeśli tr -d '[:space:] ' < bilingual.py.cpp | wc -ctr -d '[:blank:] ' < bilingual.py.cpp | wc -c
użyję