Friedman ilość jest dodatnią liczbą całkowitą, która jest równa nietrywialną ekspresji, który wykorzystuje własne cyfry w połączeniu z operacjami +, -, * / ^ w nawias i konkatenacji.
Liczba Nicea Friedmana jest dodatnią liczbą całkowitą równą nietrywialnemu wyrażeniu, która używa własnych cyfr w połączeniu z tymi samymi operacjami, z cyframi w ich oryginalnej kolejności.
Bardzo ładny numer Friedmana (VNFN), który tutaj wymyślam, to ładny numer Friedmana, który można zapisać bez mniej ładnych (moim zdaniem) części takiego wyrażenia. Nawiasy, konkatenacja i jednoargumentacja są niedozwolone.
W przypadku tego wyzwania istnieją trzy możliwe sposoby napisania wyrażenia bez nawiasów.
Prefiks: Jest to równoważne lewostronnemu skojarzeniu. Ten typ wyrażenia jest zapisywany wszystkimi operatorami po lewej stronie cyfr. Każdy operator stosuje się do następujących dwóch wyrażeń. Na przykład:
*+*1234 = *(+(*(1,2),3),4) = (((1*2)+3)*4) = 20
VNFN, który można zapisać w ten sposób, to 343:
^+343 = ^(+(3,4),3) = ((3+4)^3) = 343
Postfiks: Jest to równoważne z prawym skojarzeniem. To jest tak jak zapis przedrostka, z tą różnicą, że operacja przebiega po prawej stronie cyfr. Każdy operator stosuje się do dwóch poprzednich wyrażeń. Na przykład:
1234*+* = (1,(2,(3,4)*)+)* = (1*(2+(3*4))) = 14
VNFN, który można zapisać w ten sposób, to 15655:
15655^+** = (1,(5,(6,(5,5)^)+)*)* = (1*(5*(6+(5^5)))) = 15655
Infix: Notacja Infix używa standardowej kolejności operacji dla pięciu operacji. Na potrzeby wyzwania kolejność operacji zostanie zdefiniowana w następujący sposób: ^
Najpierw nawiasuj , a następnie skojarz . Następnie nawiasuj *
i /
jednocześnie odejdź asocjacyjnie. Wreszcie nawiasuj +
i -
jednocześnie odejdź asocjacyjnie.
1-2-3 = (1-2)-3 = -4
2/3*2 = (2/3)*2 = 4/3
2^2^3 = 2^(2^3) = 256
1^2*3+4 = (1^2)*3+4 = 7
VNFN, który można zapisać w ten sposób, to 11664:
1*1*6^6/4 = (((1*1)*(6^6))/4) = 11664
Wyzwanie: Biorąc pod uwagę dodatnią liczbę całkowitą, jeśli można ją wyrazić jako nietrywialne wyrażenie własnych cyfr w notacji przedrostka, infiksu lub postfiksu, wypisz to wyrażenie. Jeśli nie, nie wysyłaj nic.
Wyjaśnienia: Jeśli możliwe są wielokrotne reprezentacje, możesz wyprowadzić dowolny niepusty ich podzbiór. Na przykład 736 to VNFN:
+^736 = 736
7+3^6 = 736
+^736
, 7+3^6
Albo w obu przypadkach wszystkie są dopuszczalne wyjścia.
Wyrażenie „trywialne” oznacza takie, które nie korzysta z żadnych operatorów. Dotyczy to tylko cyfr jednocyfrowych i oznacza, że cyfry jednocyfrowe nie mogą być numerami VNFN. Jest to odziedziczone po definicji liczby Friedmana.
Odpowiedzi powinny zacząć się w ciągu kilku sekund lub minut na danych wejściowych poniżej miliona.
IO: Standardowe zasady IO. Pełny program, funkcja, czasownik lub podobne. STDIN, wiersz poleceń, argument funkcji lub podobny. Do wyprowadzania „Nic”, pusty ciąg, pusta linia null
lub temu podobne, i pusta kolekcja są w porządku. Dane wyjściowe mogą być ciągiem ograniczonym znakiem, który nie może być w reprezentacji, lub może być zbiorem ciągów.
Przykłady:
127
None
343
^+343
736
736^+
7+3^6
2502
None
15655
15655^+**
11664
1*1*6^6/4
1^1*6^6/4
5
None
Punktacja: To jest golf golfowy. Wygrywa najmniej bajtów.
Ponadto, jeśli znajdziesz, podaj w odpowiedzi nowy numer Very Nice Friedman.
źródło
*(+(*(1,2),3,4)
brakuje jednego bliskiego miąższu, po,3
Parentheses, concatenation and unary negation are disallowed.
Odpowiedzi:
Perl,
345334318293263245 BZadzwoń z
perl -M5.10.0 scratch.pl 736
Wyniki
Pierwsze kilka wyników, które znalazłem, to:
Wyjaśnienie
Całkowicie nie golfisty
Starałem się powtarzać jak najwięcej, aby ułatwić późniejszą grę w golfa.
Jak to gra w golfa
$_=q! ... !;eval
Daje to coś takiego, z którego można usunąć podział linii dla wyniku:
źródło
}glob
i zapisać niektóre bajty.s!B!}glob!g;BBB
-> 15B;}glob}glob}glob
-> 15B :)Tylko Ruby 2.1.5 -
213220238 + 9 = 247Nie jestem pewien, jak Ruby pokonuje Perla, ale proszę bardzo ...
Uruchom to z flagą -rtimeout (i albo -W0, albo wyślij swój stderr gdzie indziej).
Aby to nieco bardziej wytrzymałe, wymienić
send([].methods[81],z-1)
zrepeated_permutation(z-1)
i zdobyć dodatkową postać (tak, 248 ).Zasadniczo, przejrzyj wszystkie permutacje operatorów i wypróbuj infix, postfix i prefiks w tej kolejności. W
d
metodzie wykorzystujeeval
się do drugiego parametru do wykonywania obliczeń, chwytając żadnych wyjątków DivideByZero lub przelewowy.Musisz jednak wysłać stderr do / dev / null, w przeciwnym razie
eval
czasami wydrukuje ostrzeżenia, takie jak(eval):1: warning: in a**b, b may be too big
.Podczas gdy wymyśliłem takie niepoznanie, znalazłem sposób na uratowanie trzech postaci!
Niegolfowane (nieaktualne, ale podobne zasady):
Dziennik zmian
247 sprawiło, że działało to w przypadku większych liczb zamiast przekroczenia limitu czasu.
220 zgolił trzy znaki, zadeklarując tablice paren, i naprawił błąd, w którym liczby jednocyfrowe były uważane za VNFN
213 początkowe zatwierdzenie
źródło
a.zip(b,c)
zwraca tablicę tablic jak[ [a[0],b[0],c[0]],[a[1],b[1],c[1]], etc.]
i['hi', 'there']*''
po prostu łączy reprezentację ciągu wartości tablic.[a,b]*3
daje[a,b,a,b,a,b]
MATLAB (435 b)
spróbuj tutaj
http://octave-online.net/
źródło
Python 2, 303 bajty
Wypróbuj online
Wyjście Infix będzie zawierać
**
zamiast^
. Jeśli nie jest to dozwolone,.replace('**','^')
wystąpi i doda kolejne 18 bajtówWyjaśnienie:
źródło