Twórz największe i najmniejsze liczby

13

Inspirowany tym postem na łamigłówkach. Spoilery dla tej układanki są poniżej.

Biorąc pod uwagę trzy dodatnie liczby całkowite jako dane wejściowe, (x, y, z)skonstruuj obejmujący zakres [x, y], połącz ze sobą ten zakres, a następnie usuń zniekoniecznie kolejne cyfry, aby uzyskać największe i najmniejsze możliwe dodatnie liczby całkowite. Zera wiodące są niedozwolone (tzn. Liczby muszą zaczynać się od [1-9]). Wypisz te dwie liczby w dowolnej kolejności.

Na przykład z posta „Zagadka” dla wprowadzenia (1, 100, 100), największa możliwa liczba to 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100,
a najmniejsza liczba 10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100,
zgodnie z poniższą logiką z odpowiedzi Jeffa zamieszczonej tam:

  • Nie możemy wpływać na długość liczby (istnieje stała liczba cyfr), więc aby zmaksymalizować wartość, bierzemy maksymalną pierwszą cyfrę, a następnie drugą cyfrę itp.
  • Usuń 84 pierwsze nie-dziewiątki (pozostało 16 cyfr do usunięcia): 999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • Największa liczba w ciągu następnych 17 cyfr to 7, więc odtąd następna cyfra w odpowiedzi może wynosić najwyżej 7 (nie możemy usunąć więcej niż 16 cyfr). Więc usuń 15 nie-7 ... (pozostała 1 cyfra do usunięcia):999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • Stąd następna cyfra może wynosić najwyżej 8, więc usuń jedną inną niż 8 ze środka: 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • Podobna logika, ale odwrócona (tzn. Chcemy, aby wiodące 1s zamiast wiodących 9s) dla najmniejszej liczby.

Oto mniejszy przykład: (1, 10, 5).

Konstruujemy zakres 12345678910i określamy, które 5cyfry możemy usunąć, pozostawiając możliwie największą liczbę. Oczywiście oznacza to, że chcemy zmaksymalizować cyfrę wiodącą, ponieważ nie możemy wpływać na długość wyjścia. Więc jeśli usuniemy 12345, zostaniemy z 678910tym i to jest największe, co możemy zrobić. Tworzenie najmniejszych jest nieco trudniejsze, ponieważ zamiast tego możemy wyciągać liczby ze środka, pozostawiając 123410możliwie najmniejsze.

Ponieważ (20, 25, 11)wynik jest raczej nudny, ponieważ 5i 1.

Wreszcie, aby wykluczyć odpowiedzi, które próbują zerować, (9, 11, 3)daje to, 91011co z kolei daje plon 91i 10jest największe i najmniejsze.

I / O i reguły

  • Jeśli jest to łatwiejsze / krótsze, możesz zakodować dwa programy / funkcje - jeden dla największego, a drugi dla najmniejszego - w takim przypadku twój wynik jest sumą obu części.
  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Można założyć, że dane wejściowe pasują do rodzimego typu liczb w twoim języku, jednak nie można założyć, że będzie to połączona liczba ani wynik.
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło
lista cyfr jest akceptowalna jako wyjście?
Rod
Przypadek testowy, który dałby fałszywe minimum przy ocenie zer z wiodącymi zerami, może być opłacalny - myślę, 9, 11, 3że tak.
Jonathan Allan
@Rod Tak, lista cyfr jest odpowiednia do wydruku.
AdmBorkBork
@Rod Nie wiem o czym mówisz, wyraźnie napisałem powyżej „wynik”. ;-)
AdmBorkBork
@JonathanAllan Dobra rozmowa. Dodany.
AdmBorkBork

Odpowiedzi:

5

Haskell , 162 bajty

l=length
((m,f)%n)s|n>=l s=[]|n>0,(p,c:r)<-span(/=m(f$take(n+1)s))s=c:((m,id)%(n-l p)$r)|1>0=s
(x#y)z=[p%z$show=<<[x..y]|p<-[(maximum,id),(minimum,filter(>'0'))]]

Wypróbuj online!

Korzysta z algorytmu opisanego przez jafe. Może być krótszy, aby użyć mniej wydajnej metody, ale pisanie tego było fajniejsze :)

%Operacja trwa 4 argumenty (a właściwie 3, ale cokolwiek): mktóra to funkcja Wybiera „optymalne” członek z listy (albo maximumczy minimumw zależności od tego, co chcemy); fktóra jest funkcją „filtrującą”; nliczba cyfr pozostałych do upuszczenia; i sciąg. Najpierw sprawdzamy, czy n jest równe liczbie cyfr pozostałych w ciągu (użyłem >=dla bezpieczeństwa), a resztę odrzucamy, sjeśli tak. W przeciwnym razie sprawdzamy, czy nadal musimy upuszczać cyfry ( n>0), a następnie używamy spando podzielenia naszego ciągu na trzy części: pcyfry do upuszczenia, coptymalnie osiągalna cyfra irpozostały ciąg. Robimy to, przekazując rozpiętość predykatu, który sprawdza równość względem naszej optymalnej cyfry. Aby znaleźć tę cyfrę, bierzemy pierwsze n+1cyfry ciągu, filtrujemy ją, a następnie przekazujemy do naszej funkcji „selektora”. Teraz uzyskujemy po prostu naszą optymalną cyfrę i powtarzamy, odejmując od p(liczba upuszczonych cyfr) od n. Zauważ, że nie przekazujemy naszej funkcji filtrowania do wywołania rekurencyjnego, a zamiast tego zastępujemy ją id. Wynika to z faktu, że filtr istnieje tylko po to, aby uniknąć wybierania minimumpoczątkowych zer w przypadku, który jest istotny tylko przy pierwszej iteracji. Po tym nie potrzebujemy już żadnego filtra.

%Jest naprawdę tylko funkcję pomocnika dla #których jest nasza funkcja „prawdziwy”, biorąc x, yoraz z. Używamy rozumienia listy tylko po to, aby uniknąć odrobiny powtórzeń, iteracji krotek naszej funkcji i przekazywania ich %wraz z złączonym łańcuchem. Ten ciąg jest tworzony za pomocą operatora magicznej monady, (=<<)który w tym kontekście działa podobnie concatMap.

użytkownik 1472751
źródło
3

Galaretka , 17 bajtów

r/VDœcL_¥¥ḷ/ƇVṢ.ị

Wypróbuj online!

Oblicza wszystkie możliwości, a następnie zachowuje największe i najmniejsze.

Lewy argument: x,ykonstruować zakres. Właściwy argument: zcyfry do usunięcia.

r/VDœcL_¥¥ḷ/ƇVṢ.ị
r/                 Inclusive range from x to y
  V                Concatenate the digits together
   D               Get the resulting digits
         ¥         Dyad:
        ¥            Dyad:
      L                Length of the list of digits in the concatenated number.
       _               Subtract the number of digits to be removed.
    œc               Combinations without replacement. (remove z digits)
            Ƈ      Keep lists of digits that:
          ḷ/       have a positive first element (no leading zeros).
             V     Combine digits into integers. (vectorizes to ldepth 1)
              Ṣ    Sort the numbers
               .ị  Indexes at value 0.5 which yields the first and last elements.
dylnan
źródło
2

Python 2 , 143 bajty

import itertools
s,e,r=input()
l=''.join(map(str,range(s,e+1)))
L=[i for i in itertools.combinations(l,len(l)-r)if'0'<i[0]]
print min(L),max(L)

Wypróbuj online!

Działa to poprzez obliczenie wszystkich kombinacji wielkości docelowej (zachowana jest kolejność elementów) i uzyskanie z niej najmniejszych / największych liczb

Pręt
źródło
Och ... Myślę, że to działa lol. Naprawdę starałem się stworzyć program, który faktycznie oblicza go deterministycznie.
Don Thousand
@RushabhMehta Obliczenia siły brutalnej są nadal deterministyczne, tylko wolniejsze.
dylnan
2

Węgiel drzewny , 56 bajtów lub 21 + 46 35 = 67 56 bajtów

≔⪫…·NNωθFN≔⌈EθΦθ⁻λνθθ

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔⪫…·NNωθ

Wprowadź xi yutwórz zakres obejmujący i połącz liczby w ciąg.

FN

Zapętlić raz dla każdej cyfry, która ma zostać usunięta

≔⌈EθΦθ⁻λνθ

Utwórz listę ciągów utworzonych przez usunięcie każdego możliwego znaku z bieżącego ciągu i weź maksimum.

θ

Wydrukuj wynik.

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌊Φ✂θκLυ¹∨κIλ⊞Oυω

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔⪫…·NNωθ

Wprowadź xi yutwórz zakres obejmujący i połącz liczby w ciąg.

F⊕N⊞υω

Wprowadź zi zwiększ to. Następnie tworzę listę o tej długości: muszę mieć możliwość zwiększania wartości zw następującym filtrze, ale tylko polecenia mogą zwiększać zmienne; istnieje luka, która PushOperatorzwiększa długość listy.

 θ                      String of digits
Φ                       Filter over characters
         κ              Current index
          Lυ            Length of list i.e. current `z` value
            ¹           Literal 1
       ✂θ               Slice string of digits
      Φ                 Filter over characters
              κ         Outer index
               Iλ       Cast inner character to number
             ∨          Logical OR
     ⌊                  Minimum
   ⁼ι                   Equals the outer character
  ∧              ⊞Oυω   And also push to list i.e. increment `z`
                        Implicitly print

Filtruj według potrzebnych znaków, sprawdzając, czy nie ma niższych znaków w regionie do krojenia. Region zaczyna się od pierwszych z+1znaków (ponieważ w zrazie potrzeby możliwe jest odcięcie pierwszego ) i przyrostu punktu końcowego dla każdego przechowywanego znaku. Uważa się, aby nie wybrać zero dla pierwszego znaku.

Szybszy algorytm ma 30 bajtów, gdy jest używany do obliczenia największej możliwej liczby:

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌈✂θκLυ¹⊞Oυω

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Od tego czasu udało mi się połączyć powyższe dwa w drugie rozwiązanie 56-bajtowe, które generuje oba wyniki:

≔⪫…·NNωθF⊕N⊞υω≔⮌υη⟦Φθ∧⁼ι⌈✂θκLυ¹⊞OυωΦθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔⪫…·NNωθ

Wygeneruj początkowy ciąg.

F⊕N⊞υω

Reprezentuje z+1długość listy.

≔⮌υη

Odwróć listę, klonując ją i zapisz wynik.

Wydrukuj dwa wyniki na osobnych wierszach. (Innym sposobem na to jest rozdzielenie wyników dosłownie \r).

Φθ∧⁼ι⌈✂θκLυ¹⊞Oυω

Wygeneruj największą możliwą liczbę.

Φθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

Wygeneruj najmniejszą możliwą liczbę za pomocą sklonowanej listy, aby śledzić z.

Neil
źródło
1

Galaretka ,  19  18 bajtów

rDẎœcL_⁵Ɗ$ị@Ƈ1ḌṢ.ị

Wypróbuj online!

Bardzo nieefektywny, zdecydowanie nie ma sensu, 1, 100, 100ponieważ(19292)=305812874887035355118559193163641366325011573739619723360

Jonathan Allan
źródło
1

05AB1E , 16 bajtów

ŸSDg³-.Æʒ¬Ā}{Ć`‚

Wypróbuj online!

Pełny program, odczytuje dane wejściowe w następującej kolejności: y, x, z . Wyświetla listę dwóch list znaków.

Wyjaśnienie

ŸSDg³-.Æʒ¬Ā}{Ć`‚    Full program. Inputs: y, x, z.
Ÿ                   Inclusive binary range from x to y. Push [x ... y].
 S                  Dump the digits separately in a list.
  Dg                Duplicate, and use the second copy to get its length.
    ³-              Subtract z from the length.
      .Æ            Retrieve all combinations of length - z elements from the digits.
        ʒ  }        Keep only those that...
         ¬Ā         Don't start with a 0 (head, then Python-style boolean).
            {       Sort the remaining elements.
             Ć      Enclose. Pushes list + list[0] (appends its tail to itself)
              `     Dump all elements separately on the stack.
               ,    Pair, to get the last two, min and max (after enclosing)
Pan Xcoder
źródło
Och, Ć`‚to całkiem sprytna, ładna odpowiedź!
Kevin Cruijssen
0

Matlab, 95 bajtów

function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

Wypróbuj online!

Zwraca macierz 1x2 z min i max.

Jak to działa

% Full code
function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

% The function
function[m]=f(s,e,c),                                                                       end

                     % Creates the range in a single string
                     a=sprintf('%d',s:e);

                                                   % Gets all the combinations
                                                   combnk(a,length(a)-c)

                                         % Converts the string combinations to integers
                                         x=str2num(                     );

                                                                          % Finds min and max
                                                                          m=[min(x),max(x)];
DimChtz
źródło