Najmniejszy skrypt Pythona do drukowania liczb parzystych od 0 do 100

11

Pracuję nad problemem, który sobie postawiłem dla zabawy, a mianowicie stworzeniu skryptu w języku Python, który drukuje liczby parzyste od 0 do 100. Wyzwaniem jest, aby skrypt był jak najmniejszy. Oto co mam do tej pory:

for x in range(0, 101):
    if (x % 2 == 0):
        print x

Obecnie jest to 60 bajtów. Czy ktoś może wymyślić sposób, aby go zmniejszyć?


Edycja: print(*range(2,101,2),sep='\n')30 bajtów. Jakieś mniejsze?

Benedykt Lewis
źródło
4
i=2;exec"print i;i+=2;"*50
Vectorized
2
Ta wskazówka znajduje się na stronie pythonowych wskazówek golfowych codegolf.stackexchange.com/questions/54/… .
Vectorized
4
Czy to ma zaczynać się od 0czy 2? Nie pytam dużo, ale wydaje mi się, że twoje dwa przykłady robią różne rzeczy. Proszę mnie poprawić, jeśli nie.
Geobits,
20
print "0 10 100"(czy binarny jest OK?)
r3mainer
1
@squeamishossifrage nie zapomnij zagrać w golfa w kosmosie;)
isaacg

Odpowiedzi:

37

Python 2 - 12 znaków

print 8**999

Reprezentacja dziesiętna wszystkich liczb parzystych od 0 do 100 można znaleźć na wyjściu:

153778990270139647116444851659594064330089236967104214470764753645007350076834118596920008479824182447803706156756475613564110522612279602948135310258168541404369918794480627176627915013920083365328091029969610052054309789461709376676636344651086297099162082351332867728061686056465813162964114500668343488577962834185114919242101638217077550294093097112980059735456387540301162747936045475366317560310988720435512281742591085641505551107966844283901574058972330493685836063965131445246304097593431852972101058022587137885482726523043570690342524474585327775688980689010069001288756281975198668705741000141718184277589376710426738442847382969979234512669279398030637083755270090078676447687796406001053805898105262326290072552249025832780916090265261064205460488458795026145331708830141367124625271312584437671840499845750728447412590406684361326531266896486146862384988911439049971734022314877278748672

Jako bonus, podobnie jak liczby nieparzyste.

feersum
źródło
Jedyny problem: drukuje nieparzyste liczby i wiele więcej.
patrz
1
@Sieg, parzysty i nieparzysty ... w pewnym sensie uwzględniono wszystkie bazy, nie jestem pewien, jak znajdziesz w tym „dużo więcej”. ;)
paqogomez
Nie pierwszy raz mam inne zdanie niż inni użytkownicy. W każdym razie lubię twoją odpowiedź.
patrz
@ paqogomez liczby parzyste 0-100, liczby nieparzyste i wiele więcej liczb parzystych> 100
OJFord
Zbyt ciekawy, by nie zadawać głupiego pytania, dlaczego konkretnie 8 * 999?
0xc0de
31

Python 3, 22 (prawdopodobnie niedozwolone)

Jeśli wyzwaniem jest „utworzenie skryptu w języku Python, który drukuje liczby parzyste od 0 do 100”, a nie „w celu utworzenia skryptu w języku Python, który drukuje liczby parzyste od 0 do 100, oddzielone znakiem nowej linii ”, wówczas najkrótszym rozwiązaniem jest:

print(*range(0,101,2))

Pamiętaj, że w golfie kodu bardzo ważne jest, aby nie nakładać na siebie żadnych ograniczeń, których nie musisz - rób to, o co prosi problem i nie więcej.

isaacg
źródło
1
Czy druga odpowiedź OP w tekście nie sprawi, że pomyślisz, że chciałby, żeby nowy wiersz był oddzielony?
Moop
10
To całkiem możliwe i dlatego possibly not allowedjest w tytule. Z drugiej strony możliwe jest również, że przyłapał się na dopasowaniu wyników swojego początkowego programu i zapomniał o specyfikacji problemu początkowego. Ponieważ nie wiem, co się dzieje, udzieliłem tej odpowiedzi.
isaacg,
22

Python2 26

i=0;exec"print i;i+=2;"*51

niezależne odkrycie rozwiązania @ bitpwner

Sparr
źródło
Dostaję błąd SyntaxError, gdy próbuję go uruchomić. Czy górny wiersz tej odpowiedzi powinien brzmieć „Python 2, 26”?
+1, wydajesz się być 58 sekund szybciej, aby opublikować to rozwiązanie. :)
Ilmari Karonen,
19

Python 2 - 26

i=0;exec"print i;i+=2;"*51

Oparty na wskazówce na temat exec z mnożeniem łańcuchów, znalezionej w Tips for golfing in Python .

Vectorized
źródło
Powinien zawierać 0, patrz rozwiązanie Sparra.
isaacg,
Dostaję błąd SyntaxError, gdy próbuję go uruchomić. Czy górny wiersz tej odpowiedzi powinien brzmieć „Python 2 - 26”?
13

Python 2, 26 (prawdopodobnie niedozwolone)

i=102
while i:i-=2;print i

Nie było ściśle określone, w jakiej kolejności mają być drukowane liczby.

Wrzlprmft
źródło
9

Python 2, 28

for i in range(51):print 2*i
fsfd1100
źródło
9

Python 2 - 20 (prawdopodobnie niedozwolone)

Jest to specyficzne dla Pythona 2 i prawdopodobnie oszustwo, ponieważ drukuje listę, ale ponieważ wszystkie liczby kończą się na ekranie:

print range(0,101,2)
hacatu
źródło
7

Python 2 w * NIX, 24

os.system('seq 0 2 100')

Jeśli musisz dodać

import os

Zatem łączna liczba to 33 znaki.

Ken A.
źródło
Sprytny - w niektórych przypadkach może być lepszy. Czy jest to specyficzne dla systemu operacyjnego?
isaacg,
4
@isaacg Bardzo, jak os.systemnazywa program systemowy.
patrz
3
Jeśli to dozwolone, to os.system('a')dlatego, że a
akurat
5
@OllieFord seq jest częścią GNU Coreutils. Nie masz tyle siły przebicia.
Sparr
4

Python 3, 29

*a,=map(print,range(0,101,2))

Jeśli korzystasz z języka Python 2 i zdarzyło Ci się już zaimportować funkcję drukowania, nie musisz przekształcać obiektu iteratora w listę, który ma 25 znaków:

map(print,range(0,101,2))

Nie wiem jednak, czy to całkiem uczciwe.

Oto kolejny zabawny pomysł, który działa w Pythonie 2 lub 3. To trochę dłużej.

def p(i):
    if i+2:p(i-2);print i
p(100)
IanH
źródło
1
Wersję Python 3 można skrócić do *a,=map(print,range(0,101,2))korzystania z rozszerzonego rozpakowywania iteracyjnego .
trzęsienie ziemi
@flornquake Dzięki, zaktualizowałem to.
IanH
3

Python 2 - 24

0;exec"_+=2;print _;"*50

(w oparciu o rozwiązanie Bitpwner i Sparr)

W powłoce „_” zawiera wartość wcześniej ocenionego wyrażenia

le_vine
źródło
Należy zauważyć, że działa to tylko, jeśli wklei się w trybie interaktywnym niektórych interpreterów Pythona (np. Nie działa w IPython), a nie jako skrypt.
Wrzlprmft,
masz rację, zapomniałem o tym wspomnieć. (btw działa w standardowej konsoli Pythona)
le_vine
1
-1 - Pytanie wyraźnie wspomina o skrypcie python , co oznacza, że ​​kod powinien zostać zapisany w pliku i wykonany. W przeciwnym razie lepszym rozwiązaniem byłoby po prostu: range(0,102,2)ponieważ wyświetliby wszystkie liczby parzyste (plus przecinki i dwa nawiasy) na ekranie.
Bakuriu
1

Zrozumienie listy Python - 39

Wykorzystuje to rozumienie listy, jedną sztuczką, aby ją skrócić, jest pomnożenie indeksu przez 2 zamiast przejścia od 0 do 100 i if x % 2sprawdzenie końca nawet.

print'\n'.join(`2*x`for x in range(51))

Używając mapy i sugestii @ isaacg, uzyskuje się te same 39 znaków:

print'\n'.join(map(str,range(0,101,2)))

Edycja: Po rozdzieleniu wartości znakiem nowej linii nie jest to wcale najkrótsza.

Ed Griebel
źródło
1
To nie odpowiada na pytanie - mówi OP prints the even numbers from 0 to 100, a nie tylko je generuje. Ponadto, jeśli chcesz tylko listę, range(0,101,2)jest krótsza.
isaacg,
1
@isaacg Zaktualizowano, aby odpowiedzieć na pytanie, teraz znacznie dłużej, potrzeba osadzenia każdej wartości w str () dla złączenia zabija go.
Ed Griebel,
@Wrzlprmft Dzięki za sugestię, nie wiedziałem, że mogę to zrobić! Zmieniono kod, aby odzwierciedlić tę nową wiedzę.
Ed Griebel,
1

Python 2 - 20 (wątpliwy)

Jeśli rozwiązanie rozdzielone spacjami isaacg jest w porządku, to prawdopodobnie normalne formatowanie listy również:

print range(0,101,2)

W celu dalszego przekręcania zasad zastosuj sugestię SirBraneDamuj z komentarzy:

print range(101)

a ty masz 16 lat. A co, jeśli oddzielą je dodatkowe śmieci?

użytkownik30687
źródło