Wyzwanie
Biorąc dodatnią liczbę całkowitą N
, która jest 28 lub powyżej, wyjście lista numerów podsumowujących na N
który wykorzystuje każdą cyfrę 1
przez 7
dokładnie jeden raz. Możesz podać jako program lub funkcję.
Cyfry mogą pojawiać się same lub być połączone, o ile użyjesz każdego z nich bez powtórzeń. Na przykład [12, 34, 56, 7]
jest poprawny, jak jest [1, 27, 6, 4, 35]
i [1234, 567]
, ale nie [123, 34567]
lub [3, 2, 1476]
. Kolejność wyświetlania liczb nie ma znaczenia.
Jeśli N
nie można tego zrobić za pomocą 1-7, zwróć lub wyślij nic.
Inne informacje
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach do czwartku 15 października.
Zadawaj pytania w komentarzach.
Wszystko, czego nie wymienię w wyzwaniu, zależy od ciebie.
Standardowe luki są niedozwolone.
Przykłady
Mogą one usunąć wszelkie nieporozumienia:
Wkład
28
Wydajność
[1, 2, 3, 4, 5, 6, 7]
Wkład
100
Wydajność
[56, 7, 4, 31, 2]
Wkład
1234567
Wydajność
[1234567]
Wkład
29
Wydajność
Nic, 29 jest nieważne.
Wkład
1891
Wydajność
[1234, 657]
Wkład
370
Wydajność
[15, 342, 7, 6]
W razie potrzeby zrobię więcej.
Oto tablica wszystkich możliwych liczb utworzonych za pomocą tych siedmiu liczb, dzięki uprzejmości FryAmTheEggman.
29
?(N/A)
jako danych wyjściowych.[1234566, 1]
nie jest prawidłowym wyjściem, ponieważ 6 jest powtarzane. Nie można powtarzać liczb na wyjściu.1, ..,, 7
tak, że istnieje co najmniej tyle1
„S,10
” s, przynajmniej aż10
„S,100
”, s, i tak dalej.Odpowiedzi:
Pyth,
1814 bajtówDzięki @isaacg za grę w golfa na 2 bajtach i torowanie drogi dla 2 kolejnych.
Kod ulegnie awarii, jeśli nie wygeneruje żadnego wyniku, co nie spowoduje wygenerowania żadnego wyniku.
Będzie to działać dla małych wejść, jeśli jesteś wystarczająco cierpliwy, a dla większych, jeśli masz wystarczająco dużo czasu i pamięci.
Aby sprawdzić, czy kod działa zgodnie z przeznaczeniem, można zastąpić
7
z3
do sumy cyfr od 1 do 3 . Kliknij tutaj, aby uzyskać zestaw testowy.Przykład działa
Jak to działa
źródło
r\1\8
.@ .. 0
Jest również taki sam jakh
.h
, ale nie miałem pojęcia, że możesz użyćS
tego w ten sposób. (Odnośnik char w tłumaczu online nie wspomina o tym.)jkS7
Wydaje się być jeszcze krótszy, ponieważ już go nie potrzebujęs
.Python 3, 109
Funkcja, która pobiera liczbę i generuje krotkę w podobny sposób
123,4567,
. Tak, to jest prawidłowa krotka.Chodzi o to, aby wygenerować wszystkie możliwe ciągi jak
43,126,7,5,
które mają cyfry1
poprzez7
oddzielone przecinkami, bez dwóch kolejnych przecinkami. Oceń to wyrażenie jako krotkę, a jego suma będzie równan
, wydrukuj je i zakończ z błędem.Aby zbudować wszystkie takie ciągi, śledzimy zestaw
s
znaków, które mają być użyte, i próbujemy dodać każdy z nich przecinkiem, co powoduje, że cyfra kończy wpis, lub bez, w którym to przypadku przyszłe cyfry zostaną połączone.Zwarcie służy do sprawdzenia, czy
s
jest pusta, ponieważ lista-comp jest pusta, i żen==sum(eval(l))
w takim przypadku możemy wydrukowaćl
i zakończyć się błędem biorąc~
zNone
zwrócony przez drukowanie (dzięki SP3000 do tego.).Wierzę, że w Pythonie 3.5 dwa znaki można zapisać, pisząc
s={*'1234567'}
(dzięki Sp3000).Jest kilka drobnych niedogodności, które pochłaniają znaki. Jednym z nich jest to, że w przypadku
l
wyglądu1234567
bez przecinków jest on analizowany jako pojedynczy numer, a wywołaniesum
powoduje błąd. Jest to obsługiwane przez hack rozpoczynanial
od elementu0
i usuwania go podczas drukowania. To kosztuje 6 znaków.Iterowanie
c
po przecinku i pustym łańcuchu jest denerwująco trudnefor c in(',','')
, ponieważ Python 3 nie pozwala na to, aby ta krotka była naga. Chciałbym, aby istniał jakiś znak,?
który jest ignorowany w liczbach, aby zrobić',?'
o 4 znaki mniej, ale wydaje się, że nie ma takiego znaku.Stara metoda:
Python 2, 117
Definiuje funkcję, która pobiera liczbę i drukuje listę.
Chodzi o to, aby użyć rekurencji do wypróbowania każdej gałęzi. Ścieżki zmiennych są
n
potrzebna kwotas
pozostałych do użycial
wykonanych do tej pory liczbp
Kiedy
n==0
is
jest pusty, wydrukujl
i zakończ przez pomyłkę.Jeśli bieżąca częściowo uformowana liczba
p
jest różna od zera, spróbuj dodać ją do listy i usunąć z pozostałej sumy.Dla każdej cyfry, z
x
której możemy korzystaćs
, spróbuj dodać jąp
i usunąćs
.źródło
Pyth, 23
Naiwna brutalna siła, zbyt wolna w sieci, zajmuje około minuty na moim komputerze. Używa wspólnego wzorca „pytaj na zawsze aż do wyjątku” golfów pyth, gdzie dostęp do wynikowej filtrowanej listy kombinacji powoduje błąd dla liczb niemożliwych, takich jak
29
.Dane wyjściowe takie jak lista pythonowa, np
Oto pasta wszystkich 10136 liczb, które można wykonać w ten sposób.
źródło
Python 2.7,
178172169 bajtówZauważ, że ostatnie trzy wiersze powinny być wcięte tabulatorami, ale nie mogę wymyślić, jak to zrobić w tym edytorze.
Edycja: Spłaszczono jedną warstwę zagnieżdżenia za pomocą Sp3000
źródło
JavaScript (ES6), 165
196Edytuj Skrócono trochę. Może być krótszy
eval
, ale podoba mi się to, że jest szybkiBrutalna siła, wstydliwie dłuższa niż wersja Pith, ale szybsza. Przetestuj poniższy fragment kodu w przeglądarce zgodnej z EcmaScript 6.
źródło
Python 2,
270268 bajtówNadal pracuję nad golfem.
Zapętla się, dopóki nie zostanie znalezione dopasowanie.
źródło
import as
jest rzadko konieczne - możesz to zrobićfrom itertools import*;P=permutations
map(str,i)
niż rozumienie listy, i możesz skonstruować listę r bezpośrednio, zamiast spłaszczać listę zagnieżdżoną:r=[int(''.join(map(str,i)))for j in x for i in P(x,j)]
i podobne dla t.`n`
zamiaststr(n)
, ponieważn
nigdy nie będzie powyżej maksymalnej liczby całkowitej.Haskell (145 bajtów)
Wykorzystuje rekurencję.
Niegolfowane (337 bajtów):
źródło
Scala, 195 bajtów
To nie jest najbardziej wydajne i zajęło ponad 15 minut, aby uzyskać wynik dla 29, ale działa
Oto niektóre dane wyjściowe
źródło
Rubinowy, 105 bajtów
Brutalna siła! Sprawdza każdy podzbiór długości od 0 do 7 liczb całkowitych od 1 do 7654321 i sprawdza, czy którykolwiek z nich spełnia nasze kryteria. Prawdopodobnie nie chcesz czekać, aż to się skończy.
Aby uruchomić i zweryfikować algorytm, możesz zawęzić obszar wyszukiwania, zastępując
7654321
największą liczbą, o której wiesz, że będzie w odpowiedzi. Na przykład 56 dla n = 100 lub 1234 dla n = 1891. Oto okres próbny tego drugiego:źródło