Odwróć pozytywne biegi

22

Wkład

Twoje dane wejściowe to lista liczb jednocyfrowych w dowolnym rozsądnym formacie, w tym ciąg cyfr. Dane wejściowe nie będą puste.

Wydajność

Twój wynik będzie listą wejściową, ale z każdym odwróconym maksymalnym przebiegiem niezerowych cyfr.

Przykład

Rozważ dane wejściowe

95883007414830
<--->  <---->

gdzie niezerowe przebiegi zostały oznaczone strzałkami. Odwracając każdy z tych przebiegów, otrzymujemy dane wyjściowe

38859003841470

Zasady i punktacja

Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Wyzwanie to jest powiązane, ale o wiele bardziej złożone, ponieważ obejmuje dodatkowe przetwarzanie ciągów.

Przypadki testowe

4 -> 4
00 -> 00
123 -> 321
0010 -> 0010
12000345 -> 21000543
18161604 -> 61618104
95883007414830 -> 38859003841470
010230456078912 -> 010320654021987
357509902003550 -> 575309902005530
2492882377675046 -> 5767732882942064
03026302053000357099 -> 03036202035000753099

Tabela liderów

Oto fragment kodu, aby wygenerować tabelę wyników i listę zwycięzców według języka. Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka formularza

## Language, N bytes

Możesz zachować stare wyniki w nagłówku, używając tagów przekreślenia: <s>57</s>pojawi się jako 57 .

Zgarb
źródło

Odpowiedzi:

11

Pyth, 8

j0_Mcz\0

Podziel na zera, odwróć i połącz ponownie na zerach.

Pakiet testowy

FryAmTheEggman
źródło
8

IPOS , 5 bajtów

'0!r%

%dzieli ciąg wejściowy na zera, stosuje polecenie r(wstecz) do każdego podłańcucha i łączy wynik z powrotem na zerach.

Denker
źródło
7

Siatkówka , 15 bajtów

S`0
O%^$`.

¶
0

Wypróbuj online! (Nieznacznie zmodyfikowany, aby uruchomić wszystkie przypadki testowe jednocześnie).

Wyjaśnienie

S`0

Podziel dane wejściowe na 0s, to znaczy umieść każdy (możliwie pusty) ciąg niezerowych cyfr we własnej linii.

O%^$`.

Spowoduje to odwrócenie każdej linii o:

  • Stosując scenę do każdej linii indywidualnie za pomocą %.
  • Dopasowywanie każdej postaci indywidualnie ..
  • Sortowanie według wyniku podstawienia ( $) pustym łańcuchem (pusta druga linia). To znaczy, że w ogóle się nie sortuje, ponieważ wszystkie wartości sortowania są identyczne.
  • Następnie odwraca kolejność posortowanych znaków.

Wreszcie:

¶
0

Przekręć linie z powrotem na 0s.

Martin Ender
źródło
5

05AB1E , 6 bajtów

Kod:

0¡€R0ý

Wyjaśnienie:

0¡      # Split on zeros
  €R    # For each item in the array, reverse it
    0ý  # Join by zeros

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
5

Julia, 30 bajtów

s->replace(s,r"[^0]+",reverse)

Jest to anonimowa funkcja, która przyjmuje ciąg i zwraca ciąg. Aby go wywołać, przypisz go do zmiennej.

replaceFunkcja umożliwia zastąpienie mecze wyrażenia regularnego z wynikiem funkcji przyłożonego do każdego meczu. W tym przypadku możemy uzyskać niezerowe użycie [^0]+i zastąpienie tych przebiegów wynikiem reversefunkcji zastosowanej do dopasowanego tekstu.

Sprawdź wszystkie przypadki testowe online!

Alex A.
źródło
4

Siatkówka oka, 25 24

O^$#`[^0](?=(.*?0)*)
$#1

Wypróbuj online

Zapisano 1 bajt dzięki Martinowi!

Sortuj niezerowe cyfry według liczby zer następujących po tej cyfrze, w odwrotnej kolejności.

Zobacz rozwiązanie Martina dla sprytnego wykorzystania trybu per-line, aby uzyskać krótszy program!

FryAmTheEggman
źródło
4

Jolf, 8 bajtów

RΜGi0λ_0

Wypróbuj tutaj!

Wyjaśnienie

RΜGi0λ_0
  Gi0     split input on zeroes
 Μ   λ_   map over reversal as a lambda
R      0  join by zeroes

Wyjaśnienie kodu wygląda trochę jak lambda, jeśli zmrużysz oczy.

Odpowiednik 8-bajtowej odpowiedzi:

RΜGi0΅O0

To samo, ale ΅Ozamiast tego używa (Mirror Mirror lambda).

Conor O'Brien
źródło
Powiedziałbym, że wygląda bardziej jak jakiś tekst w zabawnym kształcie, kiedy na niego patrzę. Może powinienem odłożyć ten teleskop.
kot
1
@ kot Nie, nie, zatrzymaj to, ale spójrz na lambda, kiedy to zrobisz.
Conor O'Brien,
3

Ruby, 29 bajtów

->x{x.gsub /[^0]*/,&:reverse}
Klamka
źródło
3

Python, 58 50 bajtów

lambda x:"0".join([n[::-1] for n in x.split("0")])

Pobiera ciąg x i dzieli na zera i odwraca każdy element w podziale, dodaje zero i zwraca ten minus ostatnie zero.

1232
źródło
1
Witamy w PPCG :) Powinieneś być w stanie to zrobić, "0".joina następnie upuścić dodatek i plasterek.
FryAmTheEggman
@FryAmTheEggman dzięki za wskazówkę
1232
Nie ma problemu :) Możesz również usunąć spację między ]i for. Możesz sprawdzić nasze wskazówki stronie więcej wskazówek, jeśli chcesz.
FryAmTheEggman
7
lambda x:"0".join(n[::-1]for n in x.split("0"))
lub
3

Mathematica, 30 bajtów

Join@@Reverse/@#~SplitBy~Sign&

np. Join@@Reverse/@#~SplitBy~Sign&[{1,2,3,0,0,5,9,0}]={3, 2, 1, 0, 0, 9, 5, 0}

feersum
źródło
2

PowerShell v2 +, 45 bajtów

($args-split0|%{-join$_[$_.length..0]})-join0

Nadużywanie niejawnego castingu, jakby nie było jutra. Prawdopodobnie nie może być znacznie krótszy, ponieważ nie ma wbudowanej funkcji cofania, która byłaby krótsza niż ta sztuczka indeksowania.

Wyjaśnienie

Przykładem tego, jak to działa - załóżmy, że 123045był to wkład $args. Po -splitON 0rurociąg będzie zawierać tablicę (123,45). Pierwsza pętla z |%{...}ma bieżący element $_równy 123, który jest następnie domyślnie rzutowany jako ciąg, a następnie odwracany za pomocą []indeksowania. To sprawia, że ('3','2','1')jest to tablica znaków. Pętla -joinumieszcza to z powrotem w łańcuch "321"i pozostawia w rurociągu. Kolejna (ostatnia) iteracja pętli odwraca wejście do "54". Więc teraz nasz rurociąg jest"321" , "54". Jest on enkapsulowany w parens, ()więc jest przekształcany w tablicę i ponownie -joinedytowany wraz z zerami, aby uzyskać wynikowy ciąg wyjściowy"321054". Pozostaje to w potoku, a dane wyjściowe do konsoli są niejawne.

Jeśli na oryginalnym wejściu znajdują się kolejne zera, tablica zostanie zapełniona elementami zerowymi, więc na wyjściu jest poprawna liczba zer. Na przykład 1230045-split0zmienia się w (123,,45)i wszystko działa jak wyżej.

AdmBorkBork
źródło
2

Współczynnik, 35 bajtów

Pokonaj Pyfona i Clojure, boja!

[ "0"split [ reverse ] map "0"join ]

Ta anonimowa funkcja jest dosłownym tłumaczeniem tej odpowiedzi w języku Python .

To bardzo proste, wystarczy podzielić ciąg na zera, odwrócić każdy element wynikowej tablicy i połączyć wszystkie elementy (w tym ciągi zerowej długości) "0".

Oto przykład jego działania we wszystkich przypadkach testowych:

IN: scratchpad auto-use {
        "4"
        "00"
        "123"
        "0010"
        "12000345"
        "18161604"
        "95883007414830"
        "010230456078912"
        "357509902003550"
        "2492882377675046"
        "03026302053000357099"
        }
        [ 
          "0" split [ reverse ] map "0" join
        ]
        map .

{
    "4"
    "00"
    "321"
    "0010"
    "21000543"
    "61618104"
    "38859003841470"
    "010320654021987"
    "575309902005530"
    "5767732882942064"
    "03036202035000753099"
}

"00120"-> { "" "" "12" "" }-> { "" "" "21" "" }->"00210"

kot
źródło
2

Haskell, 45 bajtów

r%(0:t)=r++0:[]%t
r%(h:t)=(h:r)%t
r%_=r
([]%)

Rekurencyjnie gromadzi odwróconą rporcję do tej pory , przygotowując ją po 0osiągnięciu a. Gdy pozostały ciąg jest pusty, również się rozładowuje r.

Pierwsze dwa powtarzają jakiś kod, ale nie znalazłem krótszego sposobu na ich połączenie (45 i 47 bajtów):

r%(h:t)|h<1=r++h:[]%t|1>0=(h:r)%t
r%_=r
([]%)

r%l|0:t<-l=r++0:[]%t|h:t<-l=(h:r)%t
r%_=r
([]%)
xnor
źródło
Myślę, że potrzebujesz jeszcze jednej pary nawiasów w linii nr 2:r%(h:t)=(h:r)%t
nimi,
1

Pyke, 8 bajtów

\0cm_\0J

Wyjaśnienie:

\0c      -   input().split("0")
   m_    -  map(reversed, ^)
     \0J - "0".join(^)

Wypróbuj tutaj!

niebieski
źródło
1

JavaScript (ES6), 50 49 bajtów

Wersja łańcuchowa:

s=>s.replace(/[^0]+/g,r=>[...r].reverse().join``)

Zapisano bajt dzięki @Kevin Lau!

Wersja tablicy (60 bajtów):

a=>a.map((n,i)=>n?a[z-i+[...a,0].indexOf(0,i)]:(z=i,0),z=-1)
użytkownik 81655
źródło
1

J, 20 18 bajtów

0}:@;@(<@|.;.1)@,]

Dzięki Zgarbowi za pomoc w tym! Bierze listę rozdzieloną spacjami jako właściwy argument.

-2 bajty dzięki Zgarb!

Conor O'Brien
źródło
1

Clojure / ClojureScript, 44 znaki

#(flatten(map reverse(partition-by pos? %)))

Takie samo rozwiązanie jak inne, tylko bardziej szczegółowe dzięki długim nazwom funkcji. Z tego powodu nie zamierzałem tego opublikować, ale bije inne odpowiedzi, więc dlaczego nie?

Działa na dowolnym typie sekwencji. W ClojureScript działa to również na ciągi, ponieważ ciągi są przetwarzalne jako listy znaków, które są tak naprawdę ciągami o długości 1, które zmuszają do liczb np pos?.

MattPutnam
źródło
1

Haskell, 46 bajtów

import Data.Lists
(reverse=<<).split(oneOf"0")

Przykład użycia: (reverse=<<).split(oneOf"0") $ "0123004500678090"-> "0321005400876090".

Niestety splitfunkcja wymaga kosztownego importu. Podziel listę wejściową przy każdym 0, np. split(oneOf"0") "0120030"-> ["","0","12","0","","0","3","0",""], odwróć każdą porcję i konkatenuj w pojedynczy ciąg.

nimi
źródło
1

F #, 103 bajtów

let f x=x="";x.Split '0'|>Array.map(fun s->System.String(s|>Seq.toArray|>Array.rev))|>String.concat "0"
David Conrad
źródło
1

Java, 179 bajtów (z importem)

import java.util.*;static void r(String s){StringJoiner x= new StringJoiner("0");for(String a:s.split("0",s.length())){x.add(new StringBuilder(a).reverse());}System.out.print(x);}

Pobiera ciąg znaków i dzieli znaki na zero, a następnie dodaje je z powrotem, wywołując metodę add w klasie StringJoiner.

1232
źródło
1

Oracle SQL 11.2, 131 123 bajtów

Nadużywanie funkcji XML.

SELECT LISTAGG(REVERSE(COLUMN_VALUE||''))WITHIN GROUP(ORDER BY rownum)FROM XMLTABLE(('"'||REPLACE(:1,'0','","0","')||'"'));
Jeto
źródło
1

Perl, 22 bajty

W tym +1 dla -popcji:

s/[^0]+/reverse$&/eg

Jest to dość trywialna zmiana - przepraszam, że jestem tak nudna. Zauważ, że jeśli twoje wejście jest zakończone znakiem nowej linii (np. Używając perl -pe 's/[^0]+/reverse$&/eg' <<<21000543Bash), złapie nową linię cyframi - użyj echo -nlub, printfaby tego uniknąć. Alternatywnie, za koszt jednego dodatkowego bajtu, zmień klasę znaków na [1-9]i możesz podać wiele danych wejściowych, po jednym w wierszu.

Toby Speight
źródło
1

C, 105 bajtów

#define x(o)for(p=s;*s&&'0'o*s;++s);for(r=s;r-->p;putchar(*r));
f(s,p,r)char*s,*p,*r;{x(^)x(==)*s&&f(s);}

Wywołaj fz listą cyfr jako ciąg zakończony znakiem NUL, a wydrukuje poprawne wyjście.

Nie golfił i wyjaśnił:

f(s,p,r)
char*s,*p,*r; // K&R style to avoid repeating `char`
{

    // x(^)x(==) expands to...

    // Find the next zero digit
    for(p = s; *s && '0' ^ *s; ++s)
        ;

    // Print that run backwards
    for(r = s; r-- > p; putchar(*r))
        ;

    // Find the next non-zero digit
    for(p = s; *s && '0' == *s; ++s)
        ;

    // Print that run backwards (no difference, it's all zeros)
    for(r = s; r-- > p; putchar(*r))
        ;

    // If there's more string, recurse
    *s && f(s);
}

Zobacz na żywo na Coliru

Quentin
źródło
0

Perl 5, 52 bajty

Podprogram:

{$_=pop;y/0/ /;map$i.=reverse,split/\b/;$i=~y/ /0/r}
msh210
źródło
-anie działa (przynajmniej w Strawberry), gdy łańcuch wejściowy kończy się na 0, ponieważ split/\b/zawiera $/z 0.
msh210
0

Właściwie 22 bajty

k"a%sa"%'0@s♂R'0j#pXdX

W rzeczywistości zauważyłem, że w poleceniu podziału występuje błąd - nie zachowuje on pustych podziałów. Aby obejść ten problem, otaczam ciąg wejściowy as przed wykonaniem podziału, odwrócenia i łączenia, a następnie usuwam as na końcu. Dane wejściowe są traktowane jako ciąg, dane wyjściowe to lista ciągów jednoznakowych.

Wypróbuj online

Wyjaśnienie:

k"a%sa"%'0@s♂R'0j#pXdX
k"a%sa"%                surround input with "a" characters
        '0@s            split on 0
            ♂R          reverse each piece
              '0j       join on 0
                 #pXdX  listify, remove first and last element (the "a"s)
Mego
źródło
0

C #, 131 bajtów ##

błędne rozwiązanie!

string j(string i){foreach(var s in i.Split('0'))if(s!="")i=i.Replace(s,new string(s.ToCharArray().Reverse().ToArray()));return i;}

bez golfa:

string j(string input)
    {

        string[] a = input.Split('0');

        foreach (string s in a)
        {
            if (s!="")
            input=input.Replace(s, new string(s.ToCharArray().Reverse().ToArray()));
        }

        return input;
    }
downrep_nation
źródło
1
Wierzę, że ta metoda ma błąd, gdy jeden ciąg do odwrócenia jest podzbiorem innego. Jeśli otrzyma dane wejściowe 01201230, zwróci to 02102130. Wynika to z faktu, że metoda String.Replace zastępuje wszystkie wystąpienia pierwszego ciągu drugim. Ten błąd zostałby również spowodowany, jeśli jeden wzór pojawi się po odwróceniu ( 0120210powróci 0120120).
Xynariz,
Nawet o tym nie myślałem ...
downrep_nation
0

C #, 133 bajty


Grał w golfa

String m(String s){for(int i=0,p=i;i<s.Length;i++){if(s[i]=='0'){p=i+1;}else{s=s.Insert(p,s[i].ToString()).Remove(i+1,1);}}return s;}

Nie golfił

String m( String s ) {
    // i = Index on the String
    // p = Pointer of the last '0' found
    for (int i = 0, p = i; i < s.Length; i++) {
        if (s[ i ] == '0') {
            // Move the 'p' pointer to the index after this '0'
            p = i + 1;
        } else {
            // Insert the Char at the Index location to the Pointer location 
            //    and remove the one at the Index Location + 1,
            //    since the String was incremented by one char due to the 'Insert()'.
            s = s.Insert( p, s[ i ].ToString() )
                 .Remove( i + 1, 1 );
        }
    }

    return s;
}

Pełny kod

using System;
using System.Collections.Generic;

namespace Namespace {
    class Program {
        static void Main( String[] args ) {
            List<String> ls = new List<String>() {
                "4",
                "00",
                "123",
                "0010",
                "12000345",
                "18161604",
                "95883007414830",
                "010230456078912",
                "357509902003550",
                "2492882377675046",
                "03026302053000357099"
            };

            foreach (String s in ls) {
                String f = m( s );

                Console.WriteLine( String.Format( "{0,30}", s.Replace( "0", "0 " ) ) );
                Console.WriteLine( String.Format( "{0,30}", f.Replace( "0", "0 " ) ) );
                Console.WriteLine( "" );
            }

            Console.ReadLine();
        }

        static String m( String s ) {
            for (Int32 i = 0, p = i; i < s.Length; i++) {
                if (s[ i ] == '0') {
                    p = i + 1;
                } else {
                    s = s.Insert( p, s[ i ].ToString() ).Remove( i + 1, 1 );
                }
            }

            return s;
        }
    }
}
auhmaan
źródło
Właśnie zauważyłem teraz, że @downrep_nation opublikował już tutaj rozwiązanie dla C #, które bije mój kod o 2 bajty ... (Może być więcej ....)
auhmaan 27.04.2016
0

Java, 126

a->{String r="",t[]=a.split("0");for(String s:t){r+=new StringBuilder(s).reverse()+"0";}return r.substring(0, r.length()-1);}
Mam nadzieję, że jest pomocna
źródło
Jeśli deklarujesz szmienną z przodu za pomocą ri t[], czy możesz pominąć deklarację typu sw pętli for?
Cyoce
Nie, sprawdziłem to, ulepszone pętle wymagają nowo zadeklarowanej zmiennej.
Mam nadzieję, że będzie
hę To jest dziwne. No cóż
Cyoce,
0

Clojure, 37 bajtów

#(mapcat reverse(partition-by #{0}%))

Używa #{0}zamiast pos?(oszczędza 1 bajt łącząc się z %) i używa mapcatzamiast (flatten(map. Nadal dłużej niż czynnik .

NikoNyrh
źródło