Musisz wziąć 2 ciągi wejściowe i wyprowadzić sumę tych dwóch ciągów bez konwertowania ich na int lub przy użyciu dowolnego typu danych liczbowych.
dawny.
string one = "123";
string two = "456";
string sum = "579";
Załóżmy, że łańcuchy nie będą dłuższe niż 10 cyfr.
To jest kod golfowy i wygrywa najkrótsza odpowiedź w postaci. Edycja odpowiedzi w C # rozśmieszy mnie :).
Edycja: Konwersja na int może być zdefiniowana jako cokolwiek tego rodzaju
Int.TryParse
, (int)
, Convert.ToInt
Etc
code-golf
string
arithmetic
CSharper
źródło
źródło
Odpowiedzi:
80836 Montaż (
5753 bajtów)Dodaje to cyfra po cyfrze, od prawej do lewej, bez konwersji cyfr ascii
'0'-'9'
na liczby całkowite0-9
i przenoszenia w razie potrzeby. Kod bajtowy jest kodem funkcji, która może być wywołana w C (patrz poniżej).Powyższy kod bajtowy został napisany ręcznie z następującego zestawu (skomentowano w stylu NASM):
Aby wypróbować to w C (gcc, Linux, procesor Intel):
źródło
Ruby,
10971Serowy. Jeśli nie możesz zabrać Mahometa w góry ...
Algorytm:
Dziennik zmian
71 krótszy jako tablica.
85 usunął deklarację metody i skonsolidował wywołania do
n.to_s
92 zastosował kilka wskazówek
101 save char
102 użyj x do zwiększania
109 wstępne zatwierdzenie
źródło
succ
lubprev
.... ale to nie jest nawet fajna gra w golfa.sed, 359 bajtów (bez fantazyjnego formatowania)
Nadal nie jestem pewien, czy jest to duplikat Add bez dodawania (czy którykolwiek z 4 podstawowych operatorów arytmetycznych) . W międzyczasie pozwól mi przesłać moją odpowiedź na to pytanie. Nie wygra w golfa, ale jest to początek i myślę, że łatwo spełnia specyfikację:
Dane wejściowe są pobierane ze STDIN w postaci „x y”. To jest najpierw przekształcane na „x: 0 :: y:”. Następnie zwiększamy wszystkie liczby występujące po znakach „:”, aż otrzymamy „x: x: :( x + y):”. Potem w końcu wracamy (x + y).
Wynik
Zauważ, że działa to tylko dla liczb naturalnych. Jednak (przynajmniej teoretycznie) działa dla dowolnie dużych liczb całkowitych. Ponieważ wykonujemy operacje przyrostowe x na y, kolejność może mieć duży wpływ na szybkość: x <y będzie szybsze niż x> y.
źródło
y
jest konwertowany nay+1
użycie tylko wyrażenia regularnego? i brak rzeczywistego dodatku? Miły!Rubin -
485432265Wydaje się to bardziej w duchu tego, czego szukałeś w pytaniu.
Zasadniczo rozwiązuje problem, w jaki sposób człowiek zapisałby się na papierze - „zapamiętując” wszystkie wyniki dodawania pojedynczych cyfr, dodając każdą kolumnę i rozumiejąc, jak „nieść jedną” w razie potrzeby.
Wykorzystuje to również jeden „numeryczny typ danych” (zmienna i), co jest zabronione przez pytanie, ale służy tylko do indeksowania ciągów. Spróbuję go usunąć i zmodyfikować swoją odpowiedź.
Nieco golfisty:
EDYCJA: Wykorzystałem kilka pomysłów z komentarzy, aby wygenerować „zapamiętaną” tabelę mapowania zamiast po prostu ją zakodować na stałe.
źródło
[?1..?9].zip([?1..?9]).map{|x,y| Regex.new(x+y)}.map{/*something based on the order of results*/}
product
jest lepszy niżzip
/#{x+y}/
jest krótszy niżRegexp.new(x+y)
. ;)i=-1;(s=(?0..?9).to_a).product(s).map{|x,y|i+=1;/#{x+y}/=>(?0..'18').each_cons(10).to_a[i/10][i%10]}
daje ci tablicę wyrażeń regularnych.i
) ... musi być inny sposób na obejście tego ... może po prostu użyćeach_cons(10)
jako licznika inext
przez zestaw?CJam,
95 92 80 72 7044 znakówco przekłada się na
To zdecydowanie można dużo zagrać w golfa. Naprawdę nie wiem, czy moje podejście jest optymalne, czy jeszcze nie.
AKTUALIZACJA - wstaw tworzenie macierzy sum, aby zapisać bajty. Z tego powodu program działa teraz 10 razy wolniej, ale wciąż jest to stały czas dla dowolnego rodzaju danych wejściowych.
Wypróbuj online tutaj
Czyta wiersz zawierający dwie liczby ze STDIN jako ciąg znaków i wyprowadza jako tablicę znaków, która sama jest ciągiem znaków.
Na przykład:
Dane wyjściowe zawierają poprzedzające
0
. Daj mi znać, jeśli to jest problem.źródło
C # -
128108104Dzięki Compass, BMac i Shawn za sugestie ulepszeń.
Najpierw spróbuj w Code Golf, a używanie C # wydaje się być utrudnieniem tutaj ...
Korzystając z tej opcji
.Compute()
, możesz użyć wartości ciągów i zsumować je bezpośrednio. Jako bonus działa to dla innych operatorów oprócz „+”.Gra w golfa:
Nie golfowany:
Dzwonienie
t("123","456");
daje 579.źródło
System.Console.WriteLine(new System.Data.DataTable()...
Console.Write
zapisanie 4 bajtówGNU sed, 266 bajtów
Stosuje inne podejście niż rozwiązanie DigitalTrauma. W rezultacie ten działa jeszcze gorzej, używając O (m + n) . Konwertuj oba operandy na jednoargumentowe, konkatenuj, konwertuj z powrotem na dziesiętne (wszystkie przy użyciu wyrażenia regularnego oczywiście - sed nie ma pojęcia liczby całkowitej).
Jako bonus, ten program sumuje wszystkie naturalne liczby całkowite podane na stdin (w pierwszym wierszu), co oznacza, że nie możesz podać nic, jednej liczby lub dziesięciu liczb i zrobi to dobrze.
Idea tego kodu jest niejasno zainspirowana przez moje stare zgłoszenie PPCG, choć nie pamiętam, na jakie pytanie jest odpowiedź.
Oto „ładny” wydrukowany dla Twojej „wygody” pożyczenie innego pomysłu od DigitalTrauma. :RE
(Aby uzyskać wersję 266 bajtów, usuń końcowe średniki, wiodące białe znaki i końcowy komentarz, najlepiej używając sed.)
Pożyczanie niektórych testów od DigitalTrauma:
Poprawiłem trochę naprawdę duże testy ze względu na straszną (nie) efektywność przestrzeni. Ze względu na użycie
q
tylko pierwszej linii jest przetwarzana, stądwhile
pętla w teście.źródło
Java 6 (181 znaków)
Nie do pokonania przez upośledzenie znane jako C # , Java w całej okazałości. Tyle kotłów! Użycie polega na dostarczeniu argumentów oddzielonych spacją, tj
123 456
Nie golfowany:
Korzystając z silnika JavaScript dostępnego w
javax
, możemy sprawić, że inny język wykona za nas pracę i technicznie postępuje zgodnie z zasadami nieużywania żadnych typów liczbowych w języku ojczystym lub konwersji.Uzasadnienie użycia
eval
Nie przekonwertowaliśmy wartości na int, aby JavaScript mógł zostać sprawdzony. Stworzyliśmy Łańcuch,
"123+456"
który nie jest liczbą. Silnik JS przetwarza formułę i ocenia Ciąg jako literały liczbowe, które nie są liczbowymi typami danych. Tandetna logika Java! Nawiasem mówiąc, działa to również dladouble
matematyki.źródło
dc -e"$1 $2+p"
technicznie rzecz biorąc, nie użyłem typu natywnego w bashie, to tylko przekazanie ciągu do szczegółów implementacjiAPL (61)
Myślę, że jest to zgodne z zasadami.
Jest to funkcja, która pobiera dwa argumenty ciągu i zwraca ciąg:
Jest także dość szybki, dodaje do siebie liczbę utworzoną przez 999999
9
s.Znajduje indeks każdego znaku w
⎕D
(który jest ciągiem „0123456789”), następnie dokonuje dodania do szkoły dla każdego indeksu osobno, przenosząc w razie potrzeby, a następnie wyszukuje wynikowe cyfry⎕D
. (Myślę, że⎕D
wyszukiwanie jest zgodne z regułami, po prostu działa'x'-48
).Wyjaśnienie:
⎕D∘⍳¨⍺⍵
: wyszukaj indeksy⎕D
dla każdego znaku w obu ciągach.¯1+
: odejmij1
od każdego, ponieważ tablice domyślnie są oparte na 1.⌽↑⌽¨
: odwróć oba, zamień w macierz (wypełniając puste kwadraty zerami), a następnie odwróć macierz.+⌿
: zsumuj kolumny macierzy{
...}
: przenieść:∨/T←9<Z←0,⍵
: dodaj dodatkowy0
przed listą. Dowiedz się, które „cyfry” są wyższe niż 9, i zapisz toT
. Jeśli jakieś cyfry były większe niż 10:Z-10×T
: odejmij10
od każdej pozycji wyższej niż 10,T←(1⌽T)+
: dodaj1
do każdej pozycji obok każdej pozycji, która była wyższa niż 10, i zapiszT
.T↓⍨~×⊃T
: jeśliT
zaczyna się od zera, usuń go,∇
: zastosuj funkcję carry do wyniku.⋄⍵
: w przeciwnym razie zwróć wartość bez zmian1+
: dodaj po jednym do każdej pozycji (ponieważ tablica jest indeksowana 1)⎕D[
...]
: użyj wyniku jako wskaźników do⎕D
.źródło
Perl -
136119115 bajtówUczę się Perla, to wydawało się dobrą praktyką. Wskazówki są mile widziane!
Tandetna odpowiedź, aby to usunąć:
Rzeczywista odpowiedź:
Nieskompresowane:
źródło
($x,$y)=@ARGV
używanie”say
zamiast „print
odetnie” kilka znaków.say
jest rzeczą Perl 6 (lub możesz jej użyć w Perlu 5 z tymi instrukcjami, ale byłoby to zbyt długo). Zamiast tegosay
użyjwarn
do golenia postaci. To wyświetli STDERR zamiast STDOUT, ale nie jest to sprzeczne z zasadami tego. :-)Java 7, wynik = 252
Do dodawania nie używa liczb całkowitych, długich, bajtów, skrótów, podwójnych, pływaków ani żadnych wbudowanych funkcji bibliotecznych. Zawiń ciało klasy i zadzwoń
t(String1,String2)
. Proszę wpisać ciągi zerowe, aby miały jednakową długość.t("123","234")
zwraca"0357"
.Gra w golfa:
Golfowy Rozszerzony z klasą:
Częściowo rozbudowany golf:
100% rozszerzony:
źródło
char
jest liczbowym typem danych ._.\u0030
na ciąg, otrzymuję"0"
nie"48"
.Java - 257 znaków
jak wszyscy wiedzą, java nie ma lepszego języka do gry w golfa niż java
to jest rozwiązanie nierozwiązane
źródło
Haskell -
9894 bajtówźródło
JavaScript (ES6),
55 6659 ** To czyni kilka założeń:
Dane wejściowe są zdefiniowane w zmiennych aib, np .:zmieniono na uzyskiwanie danych wejściowych z monitu (+11).var a='123',b=321';
źródło
Python 2.7,
196137 znakówwersja 2 (krótsza przez zainicjowanie słownika kodem):
Poprzednia wersja 1 (196 znaków):
na przykład
Klucze słownika to ciągi, wartości słownika zawierają tylko stałe liczbowe w celu skrócenia kodu, a obliczenia wykonuje się przez połączenie dwóch ciągów i uzyskanie wynikowej długości, więc mam nadzieję, że liczy się to jako „nie przekształcanie ich w wartości int”.
Wersja z kodem do drukarek w małych pytaniach
Uwaga:
Typ z jest niestandardowym typem, który definiuję jako: zdecydowanie nie jest typem liczbowym według jakiejkolwiek definicji używanej przez pytającego, ale zachowuje się wystarczająco blisko typu numerycznego, aby był użyteczny w ograniczonych okolicznościach . Zachowania typu z są tylko częściowo zaimplementowane w tym przykładzie kodu, a jeśli interpreter CPython używa „int” do implementacji z , jest to jedynie szczegół implementacji i nie jest związany z danym problemem.
źródło