Było kilka wyzwań związanych z podwojeniem kodu źródłowego: tu i tutaj . Zadanie, które tu mamy, jest nieco trudniejsze, ale powinno być wykonalne w prawie każdym języku.
W tym wyzwaniu przyjmiesz dowolną liczbę całkowitą dodatnią. Twój program musi podwoić liczbę całkowitą dwukrotnie . Kiedy kod źródłowy zostanie podwojony, przyjmie dodatnią liczbę całkowitą i wyśle go do kwadratu .
Jak podwoić swój kod źródłowy? Cóż, możesz mieć to na swój sposób . Oznacza to, że możesz podzielić swój kod źródłowy na ciągi bajtów lub znaków (lub tokenów w tokenizowanych językach) o dowolnej żądanej długości i powtarzać każdą porcję dwa razy z rzędu.
W przypadku programu początkowego ABCDEFGHIJKL
(długość 12) wszystkie możliwe programy podwojone:
Chunk length | Doubled source code
-------------+-------------------------
1 | AABBCCDDEEFFGGHHIIJJKKLL
2 | ABABCDCDEFEFGHGHIJIJKLKL
3 | ABCABCDEFDEFGHIGHIJKLJKL
4 | ABCDABCDEFGHEFGHIJKLIJKL
6 | ABCDEFABCDEFGHIJKLGHIJKL
12 | ABCDEFGHIJKLABCDEFGHIJKL
Zauważ, że oznacza to, że programy liczb pierwszych można podwoić tylko na dwa sposoby: podwoić każdą postać lub cały program powtórzyć dwukrotnie.
Zasady:
- Kod musi być pełnym programem lub funkcją.
- Standardowe luki są zabronione.
- Standardowe metody we / wy są dozwolone.
- Wszystkie znaki / bajty, w tym białe znaki i znaki nowej linii, są liczone w długości kodu i przyczyniają się do fragmentów.
- Państwo może zakładać, że wejście i jej kwadrat może być reprezentowany przez typ int / całkowitej Twojego języka.
- Nie możesz zakładać końcowego znaku nowej linii lub innego znaku.
- Podaj wielkość porcji w nagłówku po liczbie bajtów.
- To jest golf golfowy , więc krótsze programy są lepsze! Jeśli dwa programy mają tę samą długość, wygrywa ten, który używa mniejszej długości porcji. (Jeśli masz dłuższy program, który używa mniejszej długości fragmentu, również warto go opublikować!)
- Jeśli twój program wymaga drugiego wejścia / linii, możesz nie przyjmować żadnych założeń co do jego wartości. W szczególności twój program powinien działać, jeśli drugie wejście jest puste, takie samo jak pierwsze lub inna liczba całkowita. Jeśli twój program nie wymaga drugiego wejścia / linii, możesz zignorować to ograniczenie.
źródło
.0
na końcu)?5 -> 10
:; podwójny Kod:5 -> 25 25
.Odpowiedzi:
Perl 5 , 8 bajtów (wielkość porcji 4)
Wypróbuj online lub wypróbuj wersję podwójną .
Unary
~
jest bitową negacją, więc dwukrotne zastosowanie jest noop. W ten sposób program podstawowy po prostu się mnoży$_
(niejawna zmienna wejścia-wyjścia) przez 2.Binary
~~
to smartmatch, który zwraca wartość logiczną.~~+2~~+2
parsuje jako(~~+2) ~~ (+2)
. Ponieważ 2 równa się 2, daje to wartość true (1). Zatem podwójny program najpierw mnoży się$_
przez 1, a następnie mnoży$_
się sam.źródło
05AB1E , 4 bajty (wielkość porcji 2 lub 4)
Wypróbuj online lub podwojony jako pojedynczy 4-bajtowy fragment lub podwojony jako dwa 2-bajtowe fragmenty .
źródło
Python 3 , 26 bajtów (wielkość porcji 13)
Wypróbuj online!
Podwojony:
To rozwiązanie zapewnia @Grimy.
Python 3 ,
323028 bajtów (wielkość porcji161514)Wypróbuj online!
-4 bajty dzięki @negativeSeven
Podwojony:
Wypróbuj online!
Funkcja wykorzystuje unikalną regułę dla tego wyzwania.
źródło
Befunge-98 (FBBI) , 8 bajtów (długość fragmentu 2)
Wypróbuj online!
Wypróbuj online! (podwojony)
Z wyłączeniem przepływu sterowania, pierwszy program wykonuje
&:+q
(wejście, zduplikowanie góry stosu, dodanie, wyjście z kodem powrotu), a drugi wykonuje&:*+q
(wejście, zduplikowanie góry stosu, pomnożenie, dodanie (suma z niejawną wartością 0), wyjście ze znakiem powrotu kod)źródło
Sześciokąt , 14 bajtów (wielkość porcji 14)
Rozszerzony:
Wypróbuj online!
Podwojony
Rozszerzony:
Wypróbuj podwojony online!
Sześciokąty znajdują się w nieco dziwnej pozycji w tym wyzwaniu, ponieważ faktyczne wykonanie zadania nie jest znacznie trudniejsze niż po prostu możliwość napisania dwóch pojedynczych programów. Gra w golfa okazała się jednak dość trudna.
To rozwiązanie jest trywialną ideą w najkrótszej formie, jaką mogłem zmieścić, ale podejrzewam, że istnieją krótsze, mądrzejsze odpowiedzi. Ta wersja bardzo naiwnie ustawia dwie wartości na wejściu i sumuje je lub mnoży, w zależności od tego, czy źródło zostanie podwojone. Jedynym ponownym użyciem kodu jest
"+
co sprawia, że kopiowanie kodu podwójnego programu jest wystarczająco krótkie, aby zmieściło się w nieużywanej przestrzeni z oryginalnego programu.Podejrzewam, że użycie instrukcji zmiany adresu IP
[]
ułatwi izolację części, ale naprawdę idealne rozwiązanie wykorzysta wiele kodu między nimi. Zrobiłem program pomocniczy do podwójnego heksagonalnego kodu źródłowego. Zauważ, że usuwa końcowe brakujące operacje, więc jeśli chcesz mieć zastępczy brak operacji na końcu, po prostu wpisz inną postać i zmień ją później. Może obsługiwać różne wielkości porcji, chociaż nie napisałem jeszcze kodu, aby wyprowadzać każdy możliwy program (Hexagony wydaje się nadawać do korzystania z pełnego rozmiaru porcji).źródło
Sześciokąt , 12 bajtów (wielkość porcji 4)
Wypróbuj online!
Sformatowany:
I podwojony , a następnie sformatowany:
Zasadniczo ustawia to pierwszą krawędź na wejściu, a następnie drugą krawędź na jedną
2
lub kopię danych wejściowych, a następnie mnoży te dwie krawędzie na trzeciej krawędzi, drukuje to i kończy. Lista wykonanych instrukcji jest tylkoi
Jedyną różnicą jest
+
nadpisanie2
drugiego programu.źródło
JavaScript (ES6),
2422 bajtówMimo niezwykłego formatu jest to definicja funkcji anonimowej, którą można wywołać bezpośrednio lub przypisać do zmiennej.
Wypróbuj online!
Wypróbuj online dwukrotnie!
W jaki sposób?
Zastosowanie jedności
+
do funkcji jest interpretowane jako próba wymuszenia jej na liczbie i daje NaN . Dlatego+(g=x=>x*x)
w obu wersjach wiodącym jest fałsz.Z drugiej strony zastosowanie binarnego
+
między 2 funkcjami daje ciąg znaków. Dlatego(x=>x*2)+(g=x=>x*x)
jest prawdą w wersji podwójnej.źródło
Perl 6 , 8 bajtów (wielkość porcji 1)
Wypróbuj online! Spróbuj dwukrotnie!
Cokolwiek / HyperWhthing lambda, która pobiera liczbę i zwraca liczbę dla pierwszego programu oraz listę singletonów dla drugiego programu. Zasadniczo zachowuje to tę samą logikę, z tym wyjątkiem, że operator mnożenia (
*
) jest zastępowany przez wykładniczy (**
).Cokolwiek dosłowne (myląco również reprezentowane przez a
*
) jest podwojone do HyperWhthing (**
), który jest w zasadzie taki sam, z wyjątkiem tego, że mapuje listy. Spacja jest potrzebna do oddzielenia literału „cokolwiek” od mnożenia i jest ignorowana, gdy zostanie podwojona. Zamiast po prostu2
(do którego byśmy się podwoili22
) używamy listy zawierającej dwa elementy, której wynikiem jest 2 w kontekście numerycznym).<>
Może być podwojona do listy z interpolacją, a dwa elementy wewnątrz są podwojone, ale żadna z tych zmian długość listy.źródło
Runiczne Zaklęcia , 9 bajtów (rozmiar 3)
Wypróbuj online!
Spróbuj dwukrotnie!
3?
Pomija następne 3 instrukcji, w wyniku (wykonany)i3?...:+@
. Po podwojeniu powoduje wykonanie,i3?...:*@
gdzie.
reprezentuje 3 instrukcje NOP.@
to „wydrukuj cały stos i zakończ”.źródło
C # (Visual C # Interactive Compiler) / JavaScript, 22 bajty, wielkość porcji 11
Wypróbuj online!
źródło
=
TO-
. Niezła odpowiedź!Brain-Flak ,
4830 bajtów (wielkość porcji 10)Wypróbuj online! Spróbuj dwukrotnie!
Zasadniczo zajmuje to trzy kroki, a następnie po dwukrotnym wykonaniu tych kroków dwukrotnie. Program początkowy to:
W przypadku wejścia
n
do niewątpliwego programu powoduje to:W przypadku programu podwójnego:
źródło
Brain-Flak , 76 bajtów, 76 bajtów
Wypróbuj online!
Podwójny (z nową linią dla przejrzystości)
Wypróbuj online!
Oto wersja, która wykorzystuje bardziej złożoną procedurę dublowania. Robi 5 kawałków o rozmiarze 15. Kod ma tutaj 46 bajtów, jednak ze względu na wymagane wypełnienie jest znacznie dłuższy.
10590 bajtów, 15 bajtówWypróbuj online!
Podwójny (z nowymi liniami dla przejrzystości)
Wypróbuj online!
źródło
Cubix ,
1814 bajtów (długość porcji97)Zwróć uwagę na spację końcową. Wypróbuj online!
Podwojony:
Znów jest jedna spacja. Wypróbuj online!
Wyjaśnienie
Główną ideą jest to, że podwojenie kodu powoduje, że kostka staje się większa, więc wskaźnik instrukcji zaczyna się od innego symbolu. Ponieważ programu dodatkowego nie można umieścić na kostce o długości boku 1, długość boku będzie wynosić 2. Dodatkowo, podwójny kod musi znajdować się na kostce o długości boku 3, więc podwójny kod musi mieć co najmniej 25 bajtów . Oznacza to, że kod musi mieć co najmniej 13 bajtów. W związku z tym można zapisać maksymalnie 1 bajt.
Teraz do faktycznego kodu. Pierwszą obserwacją jest to, że górna ściana (tzn. Pierwsze 4 znaki) nie są używane przez program dodatkowy. Ponadto, jeśli sprawimy, że piąty znak będzie odzwierciedlał adres IP wokół sześcianu, możemy zwolnić jeszcze 2 znaki. Użyjemy tych znaków, aby umieścić program do kwadratu.
źródło
Mornington Crescent , 656 bajtów (rozmiar 328)
Żeby dodać wagę teorii, że można to rozwiązać w prawie każdym języku ...
(Ostatni znak nowej linii jest ważny)
Wypróbuj pojedynczą wersję! ... lub ... Wypróbuj wersję podwójną!
Było to szczególnie trudne wyzwanie w Mornington Crescent, ponieważ program musi mieć tak sztywną strukturę. Ważne jest również obserwowanie, gdzie miałoby miejsce podwojenie, ponieważ teleportacja między stacjami jest nielegalna w Londynie.
Teoria jest tutaj prosta: w wersji pojedynczej „Bounds Green” jest wypełniony losowym ciągiem znaków, ale w wersji podwójnej jest wypełniony kwadratowym wejściem. Po zakończeniu porcji obie wersje podwoją „wejście”, ale w podwójnej wersji kodu dane wejściowe zostały zastąpione przez 0.
Ten wynik jest przenoszony z powrotem do Bounds Green, który dwukrotnie wykonuje operację max (), zanim przejdzie do wyniku. W wersji pojedynczej pozostawia to podwojenie niezmienione (int i łańcuch są właśnie przełączane tam iz powrotem), ale w wersji podwójnej zastępuje 0 z kwadratem wyniku zapisanym już w Bounds Green.
Jeśli moje wyjaśnienie nie było wystarczająco dobre, proponuję odwiedzić Londyn i sam wypróbować dwie trasy.
źródło
JavaScript (Node.js) ,
1512 bajtów (wielkość porcji: 6)Wypróbuj online!
Pojedyncza skrzynka:
Podwójna skrzynka:
Wydaje się działać również w C # i Java, jeśli zmieniasz
=>
na->
?źródło
R ,
423528 bajtów (wielkość porcji 4)Teraz z mniejszą porcją i bez błędu. Mam też dłuższe rozwiązanie z rozmiarem 3; patrz poniżej.
Nie sądzę, że można napisać odpowiedź R z porcją wielkości 1 lub 2; Z radością dam nagrodę każdemu, kto udowodni, że się mylę.
Wypróbuj online!
Dotyczy
#
komentarzy w R. Trzecia linia to tylko spacje, tworząc fragment nowej linii + 2 spacje + nowa linia, tak że poprzednia i następna część nie może mieć nowej linii.Podwojony staje się:
Wypróbuj online!
Jedna wersja obliczan2)× 4 = 2 n ; oblicza się podwójna wersjan2)× n2)× 4 = n2) .
Oto nieco dłuższe rozwiązanie, ale z rozmiarem 3:
R , 39 bajtów (wielkość porcji 3)
Wypróbuj online!
Podwojony:
Wypróbuj online!
Zauważ, że Giuseppe ma inną odpowiedź R, z jednym kawałkiem 30 bajtów.
źródło
R ,
5930 bajtów (wielkość porcji5930)Wypróbuj online!
Podziękowania dla Robina Rydera za inspirację; zwiększa za
F
każdym razem, a funkcjaf
wybiera odpowiednie wyjście.Nie jest to szczególnie interesujące, ale niewątpliwie wymyśli się coś sprytnego, manipulującego rozmiarem.Zgodnie z oczekiwaniami, Robin Ryder wymyślił to, co jest zarówno krótsze, jak i ma porządną manipulację kawałkami.źródło
PowerShell , 22 bajty (wielkość porcji 11)
Wypróbuj online .
Podwojony:
To rozwiązanie jest oparte na rozwiązaniu @ ShieruAsakoto .
@Grimy rozwiązanie, które zostało przekonwertowane na PowerShell, 26 bajtów (wielkość porcji 13)
Wypróbuj online .
Podwojony:
źródło
Perl 5 (
-p
),2215 bajtów-7 bajtów dzięki Grimy
TIO
źródło
$_*=/@F/?2:$_/4;
Węgiel drzewny , 13 bajtów
Try it online! Explanation: The predefined empty list is falsey so the input is multiplied by 2. When doubled the second pass sees the empty string has been pushed to the list so it multiplies the input by itself instead. Try it online! In verbose syntax this corresponds to
Multiprint(Cast(Times(Cast(q), Ternary(u, Cast(q), 2)))); Push(u, w);
.źródło
Python 3,
5653 bytesMy python skills kinda suck, so can definitely be golfed.. Based on the Python answer in the "I double the source, you double the output!" challenge.
Chunk length 53.
Try it online or try it online doubled.
źródło
Java 8, 62 bytes
Chunk length 62.
Try it online or try it online doubled.
Explanation:
In Java, the available comments are
// comment
and/* comment */
. Which are combined here to overwrite certain parts. See how these comments work thanks to the Java highlighting:The doubled program created a custom
Byte
class and its valueSIZE=9
, which overwrites the defaultjava.lang.Byte
class and its valueSIZE=8
.źródło
Japt,
75 bytesTry it | Doubled
²
pushes 2 to the array of inputsN
thenj
removes & returns the element at indexJ=-1
(i.e., the newly inserted2
) and multiplies the input by that.When doubled it results in
J
being multiplied by2
, so the element at index-2
(i.e., the input) is returned byj
and used as the multiplier.źródło
Jelly,
86 bytes (chunk length 3)Try it online!
Doubled
źródło
Nice solution: Lua, 66 bytes (chunk size 66 bytes)
Try it online! (double it yourself, it is not so hard)
Oh yeah, pretty sure that there is shorter solution to this, but it's the best I was able to came up with this way. Take input as first argument.
Brief explanation: whole business with
a
is quite obvious for everyone, while the second part withx
is more interesting. Basically, I create a table (or update existing one on second pass) with finalizer (__gc
metamethod) which gets called when program exits.Lame solution: Lua, 60 bytes (chunk size 30 bytes)
Try it online! or Try it doubled!
Smaller and with better chunking, but ultimately boring and lame without any clever tricks. I'm pretty sure no comments are required to this one.
źródło
J,
15109 bytesTry it online!
Doubled version: Try it online!
f : g
creates a verb that executesf
when called with one argument, andg
when called with 2 arguments. So ours executes double+:
with the original source and*-:
when the source is doubled.This works because a train of two verbs in J becomes a hook, and thus
f f
is executed asy f (f y)
where y is the original input. Additionally,*-:
is itself a "dyadic hook" which works by multiplying*
the left arg by half-:
the right arg. The left arg will be the original input, and the right arg will be the input doubled, so this will produce the square of the original input.original answer
J, 15 bytes
Try it online!
Doubled version: Try it online!
In the single version, we have a single verb which uses Agenda
@.
to do the if... then logic: If the argument is equal to itself=~
, then take the argument and double it(+:@[)
.However, when we double the code, we get a J hook. Call the verb
f
and the inputy
. Then the hookf f
executes like this:Which means that now the original input is the left arg, and the right arg is the doubled input. Since these will not be equal,
=~
will return false this time, and now we'll execute the other fork of the Agenda, ie,*:@]
, which means "square the right arg." And since~
reverses the inputs of a dyadic verb, the right arg will be the original input.źródło
Python 3, 60 bytes
Chunk size 6.
Not a great solution, but it works. This is such a unique challenge, it really makes you think from a different perspective.
Try it online!
Doubled:
Try it online!
źródło
Cascade, 13 bytes (chunk size 13)
Try it online!
Try it doubled!
This was quite difficult. The basic gist of this is to print the input multiplied by
2
for the first program, and replace the2
by a copy of the input for the second.Explanation:
The executed part of the first program looks like
The doubled program basically adds the first
]
to the end of the last line, so the program wraps around to that instead of the&
. This turns it intoźródło
Zsh, 30 bytes (chunk size 10)
Try it online! Try it doubled!
Abuses the fact that
$var
in$[$var]
gets expanded first, then evaluated in the arithmetic context.If anyone wants a crack at lowering this, here's the closest to a
24/8
solution I've gotten (outputsx^2+2
when doubled)źródło