Wcześniej było wiele wyzwań „Wykonaj __ bez _ _”, ale mam nadzieję, że jest to jedno z najtrudniejszych.
Wyzwanie
Masz napisać program, który pobiera dwie liczby naturalne (liczby całkowite> 0) ze STDIN i wypisuje sumę dwóch liczb do STDOUT. Wyzwanie polega na tym, że musisz użyć jak najmniej znaków +
i -
znaków. Nie wolno używać funkcji sumowania ani negacji.
Przykłady
wkład
123
468
wydajność
591
wkład
702
720
wydajność
1422
Tie Breaker:
Jeśli dwa programy mają taką samą liczbę +
i -
znaki, zwycięzcą jest osoba z mniej /
*
(
)
=
.
,
i 0-9
znaków.
Niedozwolone : języki, w których standardowe operatory dodawania / odejmowania oraz zwiększania / zmniejszania są symbolami innymi niż +
lub -
są niedozwolone. Oznacza to, że biały znak nie jest dozwolony.
math
code-challenge
restricted-source
PhiNotPi
źródło
źródło
+
albo-
...+
,-
a tie breaker znaków? ... czy musisz ponownie zmienić zasady :-)Odpowiedzi:
Perl (brak +/-, brak remisów, 29 znaków)
Jako bonus możesz dodać sumę kodu więcej niż dwie liczby, dodając więcej
x
s dos!!xx!
.Alternatywnie, tutaj są dwa 21-znakowe rozwiązania z odpowiednio 1 i 3 przerywaczami
Uwaga: w tych rozwiązaniach używana jest
say
funkcja dostępna od wersji Perla 5.10.0 z-E
przełącznikiem wiersza polecenia lub przyciskiemuse 5.010
. Zobacz historię edycji tej odpowiedzi dla wersji, które działają na starszych perlach.Jak działa rozwiązanie bez przerywników?
s!!xx!
jest operatorem zastępczym wyrażenia regularnego , działającym domyślnie na$_
zmiennej, która zastępuje pusty ciąg ciągiemxx
. (Zwykle/
jest używany jako ogranicznik wyrażeń regularnych w Perlu, ale tak naprawdę można użyć prawie dowolnej postaci. Wybrałem,!
ponieważ nie jest to remis.) To tylko fantazyjny sposób na przygotowanie się"xx"
do$_
- lub, ponieważ$_
zaczyna się od pustego (niezdefiniowanego, tak naprawdę), to naprawdę sposób na pisanie$_ = "xx"
bez użycia znaku równości (a także z jednym znakiem mniej).s!x!$"x<>!eg
to kolejna wymiana regexp, tym razem zastępując każdyx
z$_
wartością wyrażenia$" x <>
. (g
Przełącznik określa globalną zamianę,e
określa, że zamiana ma być oceniana jako kod Perla, a nie jako ciąg literalny.)$"
Jest specjalną zmienną, której domyślną wartością jest pojedyncza spacja; użycie go zamiast" "
oszczędza jeden znak. (Każda inna zmienna, o której wiadomo, że ma wartość jednoznakową, taką jak$&
lub$/
, działałaby tu równie dobrze, z wyjątkiem tego, że użycie$/
kosztowałoby mnie rozstrzygnięcie remisu).<>
Operator wejście liniowe , w kontekście skalarnym, odczytuje jedną linię ze standardowego wejścia i zwraca go. Poprzedniox
jest to operator powtarzania łańcucha Perla i tak naprawdę jest rdzeniem tego rozwiązania: zwraca lewy operand (pojedynczy znak spacji) powtórzony liczbę razy podaną przez jego prawy operand (wiersz, który właśnie czytamy jako dane wejściowe).y!!!c
jest po prostu niejasnym sposobem (ab) użycia operatora transliteracji do zliczenia znaków w ciągu ($_
domyślnie znowu). Mógłbym właśnie napisaćsay length
, ale zaciemniona wersja jest o jedną postać krótsza. :)źródło
code-golf
z pewnymi ograniczeniami źródłowymi?R (24 znaki)
Co to robi:
scan
odczytuje dane wejściowe ze STDIN (lub pliku)sequence
generuje sekwencje całkowite zaczynając od 1 i konkatenuje sekwencje. Na przykładsequence(c(2, 3))
wyniki w wektorze1 2 1 2 3
length
oblicza liczbę elementów w skonkatenowanym wektorzePrzykład 1:
Przykład 2:
źródło
re
Trochę kręcenie się o zwycięstwo
jako bonus skompilowany kod nie zawiera operacji dodawania (choć nie może mówić o wywołaniu readf)
źródło
Python 2, 43 bajty
źródło
print sum(input(),input())
GolfScript
Brak wyłączników +/- lub remisów:
Znacznie prostsza wersja z dwoma znakami rozstrzygającymi, wykorzystująca tę samą sztuczkę łączenia list, z której korzystają inni ludzie:
Zakładam, że GolfScript nie jest zdyskwalifikowany
)
jako operator przyrostowy, ponieważ tak naprawdę go nie używam.źródło
C (tylko wersja 32-bitowa)
Arytmetyka wskaźnika jest równie dobra.
Jak spełnia wymagania?
* Nie
+
bądź-
* No
/
,=
,.
,0
-9
* Tylko 3 pary nawiasie, co wydaje mi się minimalne (trzeba
main
,scanf
,printf
).* Jeden
*
(wymaga tego podejście wskaźnikowe).* Cztery
,
(można zapisać jeden, definiując normalne zmienne, a nieac,av
)źródło
C ++ 0 +/-, 3 remisy
źródło
Haskell, 0 + 2
Używa nie
+
lub-
znaków, a tylko dwa=
z zestawu znaków przerywacza remisu, z których jeden jest obowiązkowy do wiązaniamain
. Suma jest wykonywana przez połączenie list o odpowiednich długościach.źródło
EDYTUJ To zostało opublikowane PRZED zmianą zasad, aby zabronić
sum
...Językiem R: Brak wywołania
+
lub-
... i 9 znaków tie-breaker!Przykład:
To
[1] 579
jest odpowiedź 579 ([1]
ma na celu śledzenie, gdzie jesteś w wektorze wynikowym, ponieważ w R wszystkie wartości są wektorami - w tym przypadku o długości 1)Zauważ, że R ma
+
operatory tak jak większość języków - tak się składa, że masum
też to, co sumuje wiele wektorów.W takim przypadku
readLines
zwraca wektor ciągów o długości 2. Następnie zmuszam go do liczbowego (podwójnego) i sumuję ...Aby pokazać inne funkcje R:
źródło
colSums
zamiast tego… Może także zakazać „funkcji podobnych do negacji”, gdy jesteś przy tym ...Język R.
Nowe zasady, nowa odpowiedź, ten sam język. Brak połączeń z
+
lub-
AKTUALIZACJA Używając
scan
, spada do 11 znaków rozstrzygających (łącznie 27 znaków).Oryginał: 13 bohaterów!
Przykład:
Tym razem wynik osiąga się przez pomnożenie macierzy. Odpowiedź jest wyświetlana jako matryca 1x1.
źródło
scan()
zamiastreadlines(n=2)
Haskell, 0
+
/-
,62 tie-breakery (=
)(nie używa sztuczki konkatenacji łańcucha / listy)
źródło
JavaScript, 56
Dzięki @JiminP na końcówce ~~! Idę po najmniej bajtów, więc 1 bajtowy zapis na zachęcie p =; wciąż jest tego warte. Rozumiem twój argument o znakach rozstrzygających, ale szczerze mówiąc, nie wolałbyś najmniej bajtów :-p
Wersja, 69
Dzięki pewnym opiniom @Ilmari i @JiminP ogoliłem 13 bajtów z mojego oryginalnego rozwiązania.
Pierwotnie 82
źródło
concat
i wprowadzanie obliczeńalert
jest krótsze.i=parseInt;p=prompt;alert(Array(i(p())).concat(Array(i(p()))).length)
BTW, nie wiedziałem, żeArray(n)
zwraca tablicę o długościn
. Konsola Google Chrome dała mi[]
i pomyślałem, że nie ma nic ...p=prompt
nie jest dobrze. IparseInt(x)
jest prawie równoważne z~~x
.alert(Array(~~prompt())['concat'](Array(~~prompt()))['length'])
(12 znaków rozstrzygających) PS. Mógłbym użyć tego jako mojego wpisu, ale to po prostu daje mi poczucie kradzieży.do
źródło
APL (bez +/-, bez przerywników remisów, 8 lub 10 znaków)
Ten wpis jest podobny do innych, które łączą sekwencje wygenerowane z danych wejściowych i znajdują długość ... ale jest w APL, co może wydawać się mylące nawet w przypadku takiego małego problemu. Użyłem Dyalog APL , który oferuje bezpłatną licencję edukacyjną.
Kod:
Z prawej do lewej:
⎕
) żąda od użytkownika danych wejściowych i ocenia je.¨
) stosuje funkcję generatora indeksu (⍳
) do każdego elementu tablicy po prawej stronie./
), który składa tablicę za pomocą funkcji konkatenacji (,
). Ze względu na to wyzwanie stosuje się jednowymiarowy operator redukcji (⌿
) wraz z operatorem konkatenacji wzdłuż pierwszej osi (⍪
).⊃
) podaje nam zawartość dołączonej tablicy (torby).⍴
) podaje nam długości wymiarów tablicy. W tym przypadku mamy tablicę jednowymiarową, więc otrzymujemy liczbę elementów w tablicy, co jest naszym wynikiem.Jeśli musimy jawnie wyprowadzić wynik, możemy to zrobić w następujący sposób:
Porównywalny kod Python, z odpowiednimi symbolami APL powyżej:
Chciałbym wiedzieć, czy jest krótsza wersja możliwe w APL - inną, prostszą wersją wymyśliłem, że ma więcej wyłączników tie (choć wciąż na 8 znaków) wynosi:
⍴(⍳⎕),⍳⎕
.źródło
Nie widziałem, żeby ktoś robił to elektrotechnicznie, więc oto moje zdanie (w rubinach):
Jest to trochę brzydkie, ale wykonuje zadanie. Dwie wartości są porównywane bitowo
AND
. Jeśli nie mają one żadnych wspólnych bitów, nie ma „przeniesienia” do następnej kolumny binarnej, więc dodawanie może zostać zakończone poprzez bitoweXOR
ich wprowadzenie. Jeśli istnieje przeniesienie, musisz dodać przeniesienie do bitówXOR
. Oto mały rubinowy skrypt, za pomocą którego upewniłem się, że moja cyfrowa logika nie jest zbyt zardzewiała:Twoje zdrowie!
źródło
Seed ,
3904384611 bajtów, 0 +/-, 10 wyłączników remisowychźródło
Shell, 52
Jest to w zasadzie ta sama odpowiedź, którą podałem w przypadku innego problemu.
źródło
xargs -n1 jot | wc -l
która przyjmuje tę samą-
redukcję,awk
ale nie widzę, jak tego uniknąć wxargs
do
źródło
/*=.
, 7(
, 7)
, 7,
, 1[0-9]
DO#
Nie jest najkrótszy pod żadnym względem:
źródło
J,
157 znaków, 1 remis, niekompletny programTo jest moja próba J. To nie jest pełny program, ponieważ jeszcze nie wymyśliłem, jak go napisać. Wystarczy umieścić tę linię w skrypcie, aby uzyskać funkcję,
p
której można użyć do dodania dowolnej liczby liczb. Jest to monada i wymaga listy liczb do dodania (takich jakp 1 2 3 4
):Pomysł jest bardzo prosty. Funkcja jest napisana milczącym aka bezsensownym stylem. Oto precyzyjna definicja:
Czytaj od prawej do lewej. W wersji ukrytej
@
komponuje części funkcji. (jak ∘ w matematyce [(f∘g) (x) = f (g (x)])y
jest parametremp
.~
czyni czasownik zwrotnym. Z jakiegoś czasownikam
,m~ a
jest równaa m a
.#
(kopiowanie,a#b
): każdy elementa
jest replikowanyi
Niekiedy, gdyi
jest elementem w tej samej podziałki, dla bieżącego elementua
zb
. W ten sposób#~
replikuje elementn
n
razy.#
(count,#b
): Zlicza liczbę elementów wb
.Wniosek: J jest niesamowity i mniej czytelny niż Perl (co czyni go jeszcze bardziej niesamowitym)
Edycje
#
zamiasti.
. Tak! Mniej znaków niż skrypt golfowy.Więcej programu
Ten pyta o dane wejściowe, ale wciąż nie jest to pełny program: (13 znaków, 3 przerywacze)
źródło
JavaScript (17 znaków rozstrzygających)
: P („Obfuscated”, aby zmniejszyć liczbę znaków rozstrzygających. Wewnętrznie, to jest
b=prompt(a=prompt(y=function(a){c=new Uint8Array(a);for(i in c)if(i==~~i)x.push(1)},x=[]));y(a);y(b);alert(x.length);
.)źródło
DO#,
Program działa na 1 linii; rozdzielone na wiele linii, aby uniknąć przewijania w poziomie.
źródło
Clojure (44 znaki)
Edycja: naprawiono, aby drukować na STDOUT zamiast tylko zwracania sumy.
źródło
Scala
Kod:
źródło
K, 11
Ta sama sztuczka konkatenacji jak rozwiązanie R. Czytanie od prawej do lewej: Zliczyć dwie zmienne wejściowe, połączyć, a następnie policzyć.
źródło
PowerShell ,
2742 bajtów, 0+-
,41 wtórnyDzięki mazzy za uratowanie
+
ai 4 pomocnikówWypróbuj online! lub ładny stolik za dodatkowe 3 bajty
-Lub- dodając cztery pomocnicze, aby zapisać 19 bajtów:
3223 bajty,10+-
,125 sekundników-9 bajtów dzięki mazzy
Wypróbuj online!
Dla każdego argumentu
n
wypychamy elementy tablicy (składające się,[n]
ale nie jest to ważne) do potoku, które są pogrupowane według parens, a następnie zliczone.źródło
|fl
do ładnego formatu Wypróbuj online!Keg (SBCS na wiki Keg)
Zasadniczo port odpowiedzi R.
Wyjaśnienie
źródło
05AB1E , 2
4bajty, 0+
/-
Wypróbuj online!
Przepraszam, jeśli źle zrozumiałem to wyzwanie, ale byłem zaskoczony, że nie było odpowiedzi 05AB1E. Najkrótsza odpowiedź w tym języku, którą mogłem wymyślić, która nie używa + ani wbudowanej funkcji sumowania.
Wyjaśnienie:
-2 bajty dzięki Grimy.
źródło
Python 3
Bez polegania na ukrytych podsumowaniach w innych funkcjach.
Wypróbuj online!
źródło
re
tym razem przy użyciu długości tablic
źródło