Taśma miernicza

15

Motywacja : Czasami musisz wiedzieć, gdzie jesteś w ciągu. Chcesz być w stanie spojrzeć na dowolną część łańcucha i dokładnie wiedzieć, gdzie jesteś, o ile to możliwe.

Wyzwanie : napisz program, który wyświetli ciąg taśmy mierniczej o określonej długości. Centymetrem ciąg siebie opisuje jego długość, tak daleko jak najczęściej wzdłuż własną długość.

Zasady :

  1. Twój program musi przyjąć jeden dodatni parametr liczby całkowitej, dla całkowitej długości ciągu taśmy mierniczej
  2. Dla każdego ciągłego ciągu cyfr na wyjściu, cyfry te muszą dokładnie podawać dotychczasową długość wyjścia - włącznie !
    1. Długości są mierzone od początku ciągu do końca każdej liczby
  3. Ciąg powinien zawierać jak najwięcej liczb długości
  4. Unikaj dwuznaczności. Separatory / ograniczniki mogą być użyte, aby uniknąć zestawienia liczb, tzn. 12Mówi dwanaście, a nie jeden, dwa.
  5. Ciąg musi zawsze dokładnie podawać swoją całkowitą długość na końcu, bez końcowych separatorów
  6. Aby zachować dokładne długości, możesz potrzebować wielu separatorów, np. Oto przykładowy ciąg taśmy mierniczej o długości 4: 1--4

Przykłady nieokreślone / wyczerpujące:

  • taśma miernicza o długości 1: 1
  • taśma miernicza o długości 2: -2
  • taśma miernicza o długości 3: 1-3
  • łańcuch miara długości 4: 1--4lub -2-4(oba zgłaszają długości tak często, jak to możliwe, tj. dwa razy i kończą się prawidłową długością całkowitą)
  • taśma miernicza o długości 10: 1-3-5-7-10
  • łańcuch taśmy mierniczej o długości 11: 1-3-5-7--11lub 1-3-5--8-11lub 1-3--6-8-11lub 1--4-6-8-11lub -2-4-6-8-11(wszystkie mają możliwie jak najwięcej liczb długości i kończą się całkowitą długością łańcucha)
Tom Viner
źródło
Więc każda cyfra w ciągu nie sąsiaduje z inną cyfrą, ciąg składa się w całości z myślników -i musisz mieć tyle znaków długości, ile możesz w ciągu?
Rɪᴋᴇʀ
Czy możemy używać indeksowania opartego na 0?
Rɪᴋᴇʀ
@EasterlyIrk Reguła 3 zawiera tyle liczb, ile to możliwe, musi być dopasowana do ciągu.
Post Rock Garf Hunter
Związane z.
Martin Ender
@EasterlyIrk nie możesz mieć wszystkich myślników, ponieważ to nie spełnia motywacji i łamie zasady 3 i 5. Nie ma indeksowania. Tylko długości. Więc nie, ciąg taśmy mierniczej o długości jeden nie może być 0.
Tom Viner

Odpowiedzi:

12

Python, 50 48 47 46 bajtów

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

Wyjaśnienie

Dość proste rekurencyjne rozwiązanie lambda

Nasze podstawowe przypadki to 1 i 0, które są objęte, w "1"*xprzeciwnym razie otrzymujemy ciąg -xz `-x`i poprzedzimy wynik wywołania funkcji na len(`-x`)less.

Post Rock Garf Hunter
źródło
1
Czy możesz zaoszczędzić bajty poprzez tworzenie łańcuchów -x?
Martin Ender
@MartinEnder Ok Mam go do pracy. Dzięki za wskazówkę! Czuję się głupio, że nie zauważyłem tego wcześniej.
Post Rock Garf Hunter
5

Mathematica, 67 57 bajtów

Podziękowania dla Martina Endera za usunięcie 10 bajtów!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

Nienazwana funkcja przyjmująca nieujemną liczbę całkowitą i zwracająca ciąg znaków. Prawie oczywisty algorytm rekurencyjny: upewnij się, że łańcuch kończy się liczbą wejściową poprzedzoną znakiem a "-", a następnie ponownie wywołaj funkcję za pomocą #0.

Ale implementacja algorytmu daje golfową frajdę. ""["1"][[#]]oznacza #th argument wyrażenia ""["1"]: 0 argument jest głową, ""a pierwszy argument jest widoczny "1", co zapewnia podstawowe przypadki rekurencji. Jeśli #przekracza 1, ""["1"][[#]]generuje komunikat o błędzie i pozostaje jako funkcja nieoceniona. Ale wtedy /._@__:>jest reguła, która przyjmuje dowolną nieocenioną funkcję i przekształca ją w wyrażenie, które będzie następne, które jest rekurencyjnym wywołaniem pierwotnej funkcji.

Oryginalne zgłoszenie:

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&
Greg Martin
źródło
2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&oszczędza jeden bajt, unikając Ifi kilku bajtów, unikając IntegerStringi "-"<>.
Martin Ender
1
omg, _@__to zła magia
Greg Martin
3

JavaScript (ES6), 49 bajtów

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>

Neil
źródło
1
Myślę, że musisz to zdefiniowaćf
Tom Viner
@TomViner Zawsze to robię. (Przynajmniej miałem prawą liczbę bajtów.)
Neil
2

Pyth, 23 bajty

L?<b2*"1"b+y-bl+""_bs_b

Rażąco ukradł rekurencyjne rozwiązanie z odpowiedzi czarodzieja pszenicy . Poza tym uważam, że nie jest to właściwie gra w golfa.

Wypróbuj tutaj!

Gurupad Mamadapur
źródło
1

Perl 6 , 43 bajtów

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

Wyjaśnienie:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

Na przykład dla danych wejściowych 10 generuje sekwencję (-10, -7, -5, -3, -1), a następnie ciąg -1-3-5-7-10, a następnie ciąg końcowy 1-3-5-7-10.

Wypróbuj online .

smls
źródło