Ters pozitif koşular


22

Giriş

Girişiniz, bir rakam dizesi dahil olmak üzere herhangi bir makul biçimde tek basamaklı numaraların bir listesidir. Giriş boş olmayacak.

Çıktı

Çıktınız giriş listesi olacaktır, ancak her sıfır olmayan basamak hanesi çevrimi ters çevrilir.

Örnek

Girişi düşünün

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

Sıfır olmayan koşuların oklarla işaretlendiği yer. Bu çalışmaların her birini tersine çevirerek çıktısını elde ediyoruz

38859003841470

Kurallar ve puanlama

Tam bir program veya bir fonksiyon yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklar izin verilmez.

Bu zorluk ilişkilidir, ancak daha fazla karmaşıktır, çünkü ek string işlemi içermektedir.

Test durumları

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

Liderler Sıralaması

İşte bir lider panosu oluşturmak ve dile göre kazananların listesini oluşturmak için bir Stack Snippet. Cevabınızın göründüğünden emin olmak için, formun bir başlığı ile başlayın.

## Language, N bytes

Üstü çizili etiketleri kullanarak başlıktaki eski puanları koruyabilirsiniz: 57<s>57</s> olarak görünecektir .

Yanıtlar:



8

IPOS , 5 bayt

'0!r%

%giriş dizesini sıfırlar, böler r( komutu ) her alt dizgiye uygular ve sonucu sıfırlar.


7

Retina , 15 bayt

S`0
O%^$`.

¶
0

Çevrimiçi deneyin! (Tüm test durumlarını bir kerede çalıştırmak için hafifçe değiştirilmiş.)

açıklama

S`0

Girdiyi 0s etrafında bölüp, sıfır olmayan hanelerin her birini (muhtemelen boş) kendi satırına koyun.

O%^$`.

Bu, her satırı tersine çevirir:

  • Sahneyi ayrı ayrı her satıra uygulamak %.
  • Her bir karakteri ayrı ayrı eşleştirmek ..
  • $Boş dize (boş ikinci satır) ile ikame ( ) sonucu sıralama . Yani, tüm sıralama değerleri aynı olduğundan, sıralama yapmaz.
  • Sonra sıralanan karakterlerin sırasını tersine çevirir.

En sonunda:

¶
0

Satır beslemelerini tekrar 0s konumuna çevirin .


5

05AB1E , 6 bayt

Kod:

0¡€R0ý

Açıklama:

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

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .


5

Julia, 30 bayt

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

Bu, bir dizgeyi kabul eden ve bir dize döndüren adsız bir işlevdir. Aramak için değişkene atayın.

replaceFonksiyon Eşleşmelere uygulanan bir fonksiyonun sonucu düzenli bir ifadenin eşleri değiştirmek yeteneği sağlar. Bu durumda , eşleştirilmemiş metne uygulanan fonksiyonun [^0]+sonucuyla bu çalıştırmaları kullanarak sıfır olmayanları alabilir ve değiştirebiliriz reverse.

Tüm test durumlarını çevrimiçi olarak doğrulayın!


4

Retina, 25 24

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

Çevrimiçi deneyin

Martin sayesinde 1 bayt kaydedildi!

Sıfır olmayan rakamları, tersi sırayla basamağı takip eden sıfır sayısına göre sıralayın.

Daha kısa bir program için satır başına modun akıllıca kullanılması için Martin'in çözümüne bakın !


4

Jolf, 8 bayt

RΜGi0λ_0

Burada dene!

açıklama

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

Kod açıklama, eğer kısırsanız bir lambda gibi görünür.

Eşdeğer 8 baytlık bir cevap:

RΜGi0΅O0

Aynı şey, ancak bunun ΅Oyerine (dize ayna lambda) kullanır.


Şaşırdığımda, komik bir şekilde biraz metin gibi göründüğünü söyleyebilirim. Belki bu teleskopu uzaklaştırmalıyım.
kedi

1
@ cat Hayır, hayır, devam et, ama bunu yaparken lamdaya bak.
Conor O'Brien,


3

Python, 58 50 bayt

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

Bir x dizgesini alır ve sıfırları böler ve bölmedeki her elemanı tersine çevirir ve bir sıfır ekler ve bu eksi son sıfırı döndürür.


1
PPCG'ye Hoş Geldiniz :) Yapma "0".joinve eklemeyi ve dilimi bırakabilmelisiniz.
FryAmTheEggman

@FryAmTheEggman bahşiş için teşekkürler
1232

Hiç sorun değil :) Ayrıca ]ve arasındaki boşluğu kaldırabilirsiniz for. İsterseniz daha fazla işaretçi için ipuçları sayfamızı inceleyebilirsiniz.
FryAmTheEggman

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

3

Mathematica, 30 bayt

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

örneğin Join@@Reverse/@#~SplitBy~Sign&[{1,2,3,0,0,5,9,0}]={3, 2, 1, 0, 0, 9, 5, 0}


2

PowerShell v2 +, 45 bayt

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

Örtük oyuncuları kötüye kullanmak yarın yokmuş gibi. Muhtemelen çok daha kısa sürede elde edemezsiniz, çünkü bu indeksleme numarasından daha kısa tersi için yerleşik bir yer yoktur.

açıklama

Bunun nasıl çalıştığına dair bir örnek - varsayalım 123045giriş oldu $args. Sonra -splittarihinde adlı 0boru hattı bir dizi içerecektir (123,45). İlk döngü |%{...}, geçerli öğeye $_eşittir 123; bu, daha sonra bir dizge olarak dolaylı olarak dökülür, daha sonra []dizinlemeyle ters çevrilir . Bu ('3','2','1')bir karakter dizisi yapar. Döngü -join, bir dizgeye geri döner "321"ve onu boru hattında bırakır. Bir sonraki (son) döngü yinelemesi girişi tersine çevirir "54". Yani şimdi bizim boru hattı "321", "54". Bu parens içinde kapsüllenir, ()bu yüzden bir diziye dönüştürülür -joinve sonuçta elde edilen çıktı dizesini üretmek için sıfırlarla birlikte yeniden düzenlenir."321054". Boru hattında bırakılan ve konsola giden çıktılar gizlidir.

Orijinal girişte müteakip sıfırlar varsa, dizi boş öğelerle doldurulur, bu nedenle çıktıda doğru sayıda sıfır vardır. Örneğin, 1230045-split0dönüşür (123,,45)ve işler yukarıdaki gibi devam eder.



2

Faktör, 35 bayt

Pyfon ve Clojure'u dövmek, booyah!

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

Bu isimsiz işlev, bu Python cevabının gerçek bir çevirisidir .

Oldukça basit, sadece dizgeyi sıfıra böl, sonuçtaki dizinin her elemanını ters çevir ve tüm öğeleri (sıfır uzunluklu dizeler dahil) ile birleştir "0".

İşte tüm test durumlarında çalışan bir örnek:

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"


2

Haskell, 45 bayt

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

Tersine çevrilen röbekleri tekrar tekrar biriktirerek a'ya 0ulaşıldığında hazırlar . Kalan dize boşaldığında boşalır r.

İlk ikisi bazı kodları tekrar eder, ancak bunları birleştirmek için daha kısa bir yol bulamadım (45 ve 47 bayt):

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
([]%)

Sana hat # 2'de parantez biri daha çifti gerek:r%(h:t)=(h:r)%t
nimi

1

Pyke, 8 bayt

\0cm_\0J

Açıklama:

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

Burada dene!


1

JavaScript (ES6), 50 49 bayt

Dize sürümü:

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

@Kevin Lau!

Dizi sürümü (60 bayt):

a=>a.map((n,i)=>n?a[z-i+[...a,0].indexOf(0,i)]:(z=i,0),z=-1)

1

J, 20 18 bayt

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

Bu konuda yardımcı olduğunuz için Zgarb'a teşekkürler! Boşluk içeren bir listeyi doğru bir argüman olarak alır.

Zgarb sayesinde -2 bayt!


1

Clojure / ClojureScript, 44 karakter

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

Diğerleri ile aynı çözüm, uzun işlev adları sayesinde sadece daha ayrıntılı. Bu yüzden göndermeyecekti, ama başka cevapları da aştı, neden olmasın?

Herhangi bir sıra türünde çalışır. ClojureScript'te bu, karakter dizileri gibi işlenebildiği için karakter dizileri olarak işlenebildiğinden karakter dizileri üzerinde de çalışır pos?.


1

Haskell, 46 bayt

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

Kullanım örneği: (reverse=<<).split(oneOf"0") $ "0123004500678090"-> "0321005400876090".

Ne yazık ki, splitfonksiyon pahalı ithalat gerektirir. Girdi listesini her birinde bölün 0, örneğin split(oneOf"0") "0120030"-> ["","0","12","0","","0","3","0",""], her öbeyi ters çevirin ve tek bir dize haline getirin.


1

F #, 103 bayt

let f x=x="";x.Split '0'|>Array.map(fun s->System.String(s|>Seq.toArray|>Array.rev))|>String.concat "0"

1

Java, 179 bayt (içe aktarmalı)

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);}

Bir dizge girişini alır ve karakterleri sıfıra böler, ardından StringJoiner sınıfındaki add yöntemini çağırarak yeniden ekler.


1

Oracle SQL 11.2, 131 123 bayt

XML işlevlerinin kötüye kullanılması.

SELECT LISTAGG(REVERSE(COLUMN_VALUE||''))WITHIN GROUP(ORDER BY rownum)FROM XMLTABLE(('"'||REPLACE(:1,'0','","0","')||'"'));

1

Perl, 22 bayt

-pSeçenek için +1 dahil :

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

Bu oldukça önemsiz bir oyuncu değişikliği - çok sıkıcı olduğum için üzgünüm. Girişiniz yeni satır sonlandırılmışsa (örneğin perl -pe 's/[^0]+/reverse$&/eg' <<<21000543Bash'de kullanılırsa), yeni satırı rakamlarla yakalayacağını unutmayın - kullanın echo -nveya bundan printfkaçının. Alternatif olarak, bir ek bayt maliyeti için karakter sınıfını değiştirin ve [1-9]her satıra bir tane olmak üzere birçok girdi sağlayabilirsiniz.


1

C, 105 bayt

#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);}

Aramak fSonlandırılmış bir dize olarak rakamların listesini ve doğru çıktıyı yazdıracaktır.

Ungolfed ve açıkladı:

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);
}

Coliru'da canlı görün


0

Perl 5, 52 bayt

Bir alt yordam:

{$_=pop;y/0/ /;map$i.=reverse,split/\b/;$i=~y/ /0/r}

-ane zaman girdi dizesi biter içinde (en azından Strawberry) çalışmaz 0, çünkü split/\b/içermektedir $/ile 0.
msh210

0

Aslında, 22 bayt

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

Bu aslında split komutunda bir hata olduğunu fark etmemi sağladı - boş bölmeleri korumaz. Geçici bir çözüm olarak, abölmeyi, tersini ve birleştirmeyi yapmadan önce giriş dizesini s ile çevreliyim , ardından asonunda s'yi çıkarın . Giriş bir dizge olarak alınır, çıktı bir tek karakterli dizelerin listesidir.

Çevrimiçi deneyin

Açıklama:

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)

0

C #, 131 bayt ##

çözüm hatalı!

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;}

ungolfed:

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;
    }

1
Tersine çevrilecek bir dize diğerinin bir alt kümesi olduğunda, bu yöntemin bir hatası olduğuna inanıyorum. Girdi verilirse 01201230, bu geri dönecekti 02102130. Bunun nedeni, String.Replace yönteminin, ilk dizenin tüm oluşumlarını ikinciyle değiştirmesidir. Bu hata aynı zamanda, ters çevrildiğinde bir desen ortaya çıktığında ( 0120210geri döndüğünde 0120120) ortaya çıkar.
Xynariz

Bunu bile düşünmedim ..
downrep_nation

0

C #, 133 bayt


golfed

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;}

Ungolfed

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;
}

Tam 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;
        }
    }
}

Şimdi fark ettim ki @ downrep_nation zaten C # için kodumu 2 byte yenen bir çözüm yollamış ... (daha fazla olabilir ...)
auhmaan

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);}

Eğer bildirirseniz sile ön değişken rve t[]sen türü beyanı atlayabilirsiniz, sdöngü içinde?
Cyoce

Hayır, kontrol ettim, döngüler için geliştirilmiş yeni bir değişkene ihtiyacım var.
Umarım yardımcı olabilir

ha. Bu tuhaf. Oh iyi
Cyoce

0

Clojure, 37 bayt

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

#{0}Bunun yerine kullanır pos?(ile bir araya getirerek 1 bayt kaydedin %) ve mapcatyerine kullanın (flatten(map. Daha Yine uzun Factor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.