Wyzwanie
Napisz najkrótszy możliwy fragment kodu, tak że gdy jego N kopii zostanie połączonych razem, liczba znaków wyjściowych to N 2 . N będzie dodatnią liczbą całkowitą.
Na przykład, jeśli fragment kodu byłby soln();
, wtedy uruchomienie soln();
wypisuje dokładnie 1 znak, a uruchomienie soln();soln();
wypisuje dokładnie 4 znaki, a uruchomienie soln();soln();soln();
wypisuje dokładnie 9 znaków itp.
Dowolne znaki mogą znajdować się na wyjściu, o ile całkowita liczba znaków jest poprawna. Aby uniknąć pomyłek między systemami operacyjnymi, \r\n
znaki nowej linii są liczone jako jeden znak.
Programy nie mogą odczytywać własnego źródła, rozmiaru pliku ani wykorzystywać innych takich luk. Traktuj to jak surowe wyzwanie quine .
Dane wyjściowe mogą przejść do standardowego lub pliku lub podobnej alternatywy. Brak danych wejściowych.
Komentarze w kodzie są w porządku, podobnie jak zamykanie w trakcie wykonywania.
W programie mogą znajdować się dowolne znaki. Najkrótsze przesłanie w bajtach wygrywa.
źródło
Odpowiedzi:
TECO, 4 bajty
V
wypisuje zawartość bieżącego wiersza w buforze tekstowym.1\
wstawia ciąg reprezentujący liczbę 1 w bieżącej pozycji.Tak więc podczas N iteracji programu, pierwsza
V
wyśle N - 1 kopii znaku1
, następnie doda kolejną1
do tekstu, a następnie wyśle Ns1
.źródło
Brainfuck,
1716 bajtówMożesz to przetestować tutaj . Po prostu skorzystaj z faktu, że .
n2+2n+1=(n+1)2
źródło
Brainfuck, 11
Zobaczyłem pierwszą odpowiedź Brainfuck i pomyślałem, że to zdecydowanie za długo :)
Wynik może być łatwiejszy do zauważenia, jeśli zamienisz plus na znacznie więcej plusów.
Podczas N-tej iteracji każda pętla wyprowadza N-1 kopii znaku o wartości ASCII 1, a następnie jeszcze jedną za pomocą
+.
.źródło
Python 2, 22
Wyświetla pusty ciąg, potem dwa
x
, potemx
cztery i tak dalej. Z nowym wierszem po każdym łańcuchu pojawia sięn*n
znak.Jedna kopia:
"\n"
(1 znak)Dwie kopie:
"\nxx\n"
(4 znaki)Trzy kopie:
"\nxx\nxxxx\n"
(9 znaków)Aby powstrzymać
a
inicjalizację zmiennej początkowej przed każdym uruchomieniem, kończę kod za pomocą;a
, który sam w sobie jest łagodny, ale w połączeniu z następną pętlą tworzy kozła ofiarnego,aa
który ma zostać przypisany. Ta sztuczka nie jest moja; Widziałem to w poprzedniej odpowiedzi. Byłbym wdzięczny, gdyby ktoś mógł mnie skierować, abym mógł wyrazić uznanie.źródło
,
poprint a
powinno działać.print a
wypisuje nowy wiersz po każdym wydruku.CJam, 6 bajtów
Wykorzystuje fakt, że .
n2 + n + (n+1) = (n+1)2
źródło
:L..1+
to ten sam pomysł w GolfScript...n+
w GolfScript, ale ta irytująca nowa linia ... :(:L
takiej potrzeby, ponieważ nie jest używana./// , 21 bajtów
Jestem pewien, że istnieje bardzo krótki i pokręcony sposób rozwiązania tego problemu w ///, ale nie mogłem znaleźć niczego poza „bezpośrednim” sposobem:
Jest to oparte na podejściu drukowania kolejnych liczb nieparzystych. Fragment składa się z
1
drukowanego na początku fragmentu i dwóch zamienników, które dodają dwa kolejne1
s do pierwszej części każdej kolejnej kopii fragmentu. Przejdźmy przez to doN = 3
. W grupach po 3 lub więcej wierszy należy czytać: 1. bieżący kod, 2. przetworzony token (y), 3. (i następujące) komentarz do tego, co robi powyższy token.Co ciekawe, działa równie dobrze, jeśli przejdziemy
1
do końca:źródło
> <> , 14 bajtów
Wykorzystuje pomysł „suma kolejnych nieparzystych liczb całkowitych, zaczynając od 1”. Zaczyna się od 1 i za każdym razem mnoży ją przez 100, stopniowo zwiększając długość wyjścia o 2.
Na przykład dodanie 5 kopii daje
Przetestowałem, przesyłając dane wyjściowe do pliku i nie widziałem końcowego nowego wiersza.
Awaria
źródło
CJam,
109 bajtówWypisuje N 2 spacji gdzie
N
jest liczba kopii kodu.Rozszerzenie kodu :
Wypróbuj online tutaj
źródło
Python 2, 20 bajtów
źródło
Java - 91 bajtów
To rozwiązanie jest równoważne temu drugiemu w Pythonie. Na pewno nie wygra, ale było fajnie :)
źródło
Perl, 14 bajtów
Należy to uruchomić za pomocą
-l
przełącznika poleceń Perla , co powodujeprint
dodanie nowych linii.Wyświetla zmienną domyślną
$_
, a następnie zastępuje dwa znaki podkreślenia przez podstawienie.Przykład:
źródło
say
?-E
zamiast tego potrzebujesz .Brainfuck, 10 znaków
Oba poprzednie rozwiązania brainfuck były waaay zbyt długi (16 do 11 znaków), więc tutaj jest krótszy:
W
n
-tym bloku wypisuje2*n-1
znaki (z kodowymi punktami od2*n-1
do1
)źródło
Preludium ,
1812 bajtówTo drukuje N. 2 kart. Zakłada on zgodny ze standardami interpreter, który drukuje znaki zamiast cyfr, więc jeśli używasz interpretera Python , musisz ustawić
NUMERIC_OUTPUT
naFalse
.Chodzi o to, aby po prostu użyć górnej części stosu (która początkowo wynosi 0) jako
2(N-1)
i wydrukować2N-1
zakładki, a następnie zwiększyć górę stosu o 2. Dlatego każde powtórzenie drukuje kolejną nieparzystą liczbę zakładek.źródło
Java - 59/44 (w zależności od wymagań)
Najwyraźniej wolno nam zakładać, że kod działa w klasie.
Jeśli może wejść do głównej metody:
źródło
C, 87 bajtów
Używa to dwóch magicznych makr.
__COUNTER__
to makro, które rozwija się0
przy pierwszym użyciu,1
drugim itd. Jest to rozszerzenie kompilatora, ale jest dostępne zarówno w gcc, clang, jak i Visual Studio.__FILE__
to nazwa pliku źródłowego. Dołączenie pliku w C / C ++ jest dosłownie tym samym, co wklejenie go bezpośrednio do kodu źródłowego, więc korzystanie z niego było trochę trudne.W dalszym ciągu byłoby możliwe zastosowanie tej techniki
__COUNTER__
. W takim przypadku do#if
instrukcji__LINE__
można użyć standardowego zabezpieczenia przed dwukrotnym użyciem kodu i zliczenia potrzebnej liczby znaków.źródło
Dyalog APL,
2019 bajtówRozwiązanie oparte na matrycy.
Wypróbuj tutaj . Zwraca ciąg powtórzeń z . Wyjaśnienie przez wybuch dla :
N2
a
N = 2
źródło
STATA 20
Kończy się nowy wiersz, aby upewnić się, że instrukcja display (di) działa. Najpierw wyświetl aktualną liczbę w $ a newlines (i jeden dodatkowy z domyślnego wyświetlania). Następnie dodaj 2 do $ a.
Wykorzystuje podejście do liczb parzystych (tzn. Podejście do liczb nieparzystych minus 1) za każdym razem z dodatkową nową linią.
źródło
T-SQL 117
Zwróć uwagę na spację końcową, aby za każdym razem poprawnie sprawdzać warunek if.
Wykorzystuje podejście do liczb nieparzystych. Nie jestem pewien, czy na wybranych instrukcjach jest nowy wiersz.
Nie jestem pewien, czy istnieje krótszy sposób na utworzenie tabeli, jeśli ona nie istnieje.
źródło
PostScript, 35 znaków
Każde przejście „przecieka” jedną rzecz na stosie, więc
count
za każdym razem wzrasta o 1. Następnie po prostu używa sumy sztuczki z liczbami nieparzystymi.Dane wyjściowe bajtów są,
\000
ponieważ jest to wartość początkowa ciągów.źródło
Haskell, 72
Wyjaśnienie
Operator wprowadzania
$
działa tak, jakbyś umieszczał otaczające nawiasy wokół reszty wiersza (są wyjątki, ale w tym przypadku działa).aputStr
to funkcja, która pobiera ciąg znaków w formacie „abc ...”, gdzie „abc” jest pierwiastkiem kwadratowym długości ciągu, łącznie z abc. Przetwarza ciąg jako liczbę całkowitą i zwraca ciąg rozpoczynający się od abc + 1 i mający kwadratową długość. Z powodu$
operatora będzie to wywoływane rekurencyjnie na „1” N razy.źródło
Pyth, 8 bajtów
Polega to na tym, że N 2 jest równe sumie
N
liczb nieparzystych. Teraz Pyth auto drukuje nową linię, więc muszę po prostu wydrukowaćZ * 2
znaki w każdym kodzie gdzieZ
idzie od0
celuN - 1
.Rozszerzenie kodu :
Wypróbuj online tutaj
źródło
Golflua, 23 bajty
wyprowadza kombinację znaków
&
i\n
.Równoważny kod Lua
Za każdym razem, gdy fragment kodu jest uruchamiany, generuje o 2 znaki wyjściowe więcej niż ostatnim razem, zaczynając od 1 znaku.
print
Funkcja dodaje do nowej linii, to zainicjować X 0 zamiast 1.źródło
ActionScript - 27/26 bajtów
lub
Jak to działa:
Po prostu komentuje pierwszą linię. Uwaga:
trace
dodaje nowy wiersz. A może wszystkie używane przeze mnie IDE robią to automatycznie.źródło
GML, 27
źródło