Bu sayfa numaralarını yoğunlaştırın!


35

Feragatname: Bir süredir eğlence amaçlı bu sitede bulunduğum süre zarfında, bu benim ilk sorum, bu yüzden lütfen küçük hataları affedin.

Arka fon

Bize ödev verirken öğretmenim gerçekten can sıkıcı ve bireysel olarak yapmamız gereken bütün sorunları yazıyor . Bu nedenle, hangi sorunları yapmam gerektiğini kopyalamam sonsuza dek sürüyor . Hayatımı kolaylaştıracağını düşündüm, ona sorun listesini daha az yer kaplayacak bir program gönderirdim.

Bir sayfa veya sorun numarası listesi yazarken, bir aralığı belirtmek için bir çizgi kullanırız. Örneğin, 19-21olur 19, 20, 21. Arada bir boşluk varsa, iki virgülle ayrılmış aralık kullanılır: 19-21, 27-31olur 19, 20, 21, 27, 28, 29, 30, 31.
Tam şimdi, muhtemelen şöyle düşünüyorsunuz: "Bu oldukça önemsiz görünüyor". Aslında, bu zaten burada ve burada cevaplandı .

Ancak, bir yakalama var. Ardışık basamak sayıları olan bir aralığımız varsa, tekrarlanan sayılar bırakılabilir. Örneğin: 15, 16, 17olur 15-7ve 107, 108, 109olur 107-9. Bir bonus için, son ardışık eşit basamak 1 büyükse ve üst sınırın son basamağı alt seviyeye eşit ya da ondan küçükse, aşağıdakiler atlanabilir: . 109-113olur 109-3bir alt son basamak 10s yer artırılması da anlaşılacağı gibi,.

Meydan okuma

Programınız girdi yoluyla bir tamsayı listesi almalıdır (diliniz veya işleviniz için standart olan ne). Bu listenin virgülle ayrılmış, boşlukla ayrılmış mı yoksa gerçek bir liste / dizi mi olduğuna karar verebilirsiniz.

Bu gösterimi kullanarak bu listeyi temsil etmek için en kısa yoldan çıkın (önce aralık sayısına, ardından aralıklara dahil edilen karakterlerin toplamına göre sıralanır). Her kesikli aralık aynı satırda olmalıdır, ancak aralıklar virgül veya yeni satırlarla ayrılabilir (izleyen yeni satırlara veya virgüllere izin verilir). Bu aralıklar sıralı olmalıdır.

Okulumuzda Wi-Fi korkunç olduğu için, dosyayı göndermek için dosyayı mümkün olduğunca küçük hale getirmeliyim. En kısa kod (bayt cinsinden) kazanır.

Bonuslar

Öğretmenim özensiz, bu yüzden ona yardım edebilecek birkaç şey var. Birden fazla bonus çarpma işlemiyle toplanır, örneğin% -10 bonus (x% 90) ve% -25 (x% 75) bonus =% 90 *% 75 = x% 67.5 (% -32.5 bonus).

  • Bazen onları yanlış sıraya koyuyor (matematik öğretmeni değil). Programınız en küçükten büyüğe sıralanmayan tamsayıları kabul edebiliyorsa% -20 bonus alın.
  • Kitabımız garip ve her bölüm -10'da saymaya başlıyor. Programınız negatif sayıları kabul edebiliyorsa% -25 al.
  • O 10'un yerini artan bir alt son rakamdan, örneğin ikramiye kabul ederse 25-32etmek azaltarak 25-2, bir -50% bonus alır.

Test Kılıfları

In:  1, 2, 3, 4, 5
Out: 1-5

In:  3, 4, 5, 9, 10, 11, 12
Out: 3-5, 9-12

In:  149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
Out: 149-60

In: 1 2 3 4
Out: 1-4


For bonuses:

In: 109, 110, 111, 112, 113
Out: 109-3

In:  19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
Out: 19-9

In: -3, -2, -1, 0, 1, 2
Out: -3-2

In: -3, -2, -1
Out: -3--1

19 Aralık 2015 Cumartesi günü bir cevap kabul edilecektir.

GLHF!


Üçüncü test durumundaki çıktı neden olmasın 1-4 9-2?
Alex A.

(A) 'nın yaptığı ve (b)' nin% 50 bonus almadığı bir program için çıktı ne olmalıdır 149 150 151 152 153 154 155 156 157 178 159 160?
lirtosiast

3
Bunun gibi başka bir soru olduğuna yemin edebilirdim, ancak bulamıyorum ...
mbomb007

5
Bence bu , herkesin düşündüğü ilgili soru. Bu olsa da sıraları listeler haline getirir.
Dennis,

1
Başka bir şey - metni ise aralığın bitiş sayfası için sondan bir önceki basamak kesim olması gerektiğini söylüyor alt başlangıç sayfasının daha ancak test durumu diyor 19-9için 19,20,...,29değil, 19-29metin anlaşılacağı gibi. Peki hangisi doğru?
zocky

Yanıtlar:


5

LabVIEW, 97 * 0.8 * 0.75 * 0.5 = 29.1 LabVIEW İlkelleri

Bu, başarılı elemts 1 ayrı ise yukarı doğru sayarak çalışır ve sonra sayı ve sayı sayım modulosu 10'dan bir dize oluşturur ve bazı çarpma negatiflerinin bir kaltak olmasına neden olur.

GIF giriş 8,9,10,11ve çıkışlarını gösterir 8-1. Giriş için -5,-4,-3,1,3,4,5 -5--3,1,3-5çıkıyor.


1
Gerçekten, her bir döngü için dönerken / while döngüsü / 1 / ilkel olan her neyse, adil değil çünkü JS gibi dillerde, 1 bayttan daha fazla
sayılırlar

@ ev3commander serin bir animasyonlu diyagramla gelirse her şeyin adil olmasını sağlar!
Cyoce

bu yüzden ilkellerde bayt değil. Ayrıca, çok fazla kablolama yapıldığından, döngüler tam olarak en az 2 veya 3 ve ayrıca her vardiya kayıt + başlatma için başka 3'tür.
Eumel

1
standart golf kurallarına göre bunu yapabilirsiniz, sadece sıkıcı
Eumel

2
@ ev3commander Aslında, eğer dil zorlukten daha yeni ise, rekabetçi nedenlerle kullanmanıza izin verilmez.
Adnan

14

C ++ 11, 451 * 80% * 75% * 50% = 135.3 bayt

@ Kirbyfan64sos sayesinde 9 bayt kaydedildi.

@JosephMalle ve @cat sayesinde 19 bayt kaydedildi.

@ Pinkfloydx33 sayesinde 11 bayt kurtardı.

#include<vector>
#include<cmath>
#include<algorithm>
#include<string>
#define T string
#define P append
using namespace std;T f(vector<int>v){sort(v.begin(),v.end());T r=to_T(v[0]);int b=1;int m=v[0];for(int i=1;i<=v.size();i++){if(i!=v.size()&&v[i]==v[i-1]+1){if(!b){m=v[i-1];}b=1;}else{if(b){T s=to_T(v[i-1]);r.P("-").P(s.substr(s.size()-(v[i-1]-m==1?1:log10(v[i-1]-m)),s.size()));}if(i!=v.size()){r.P(", ").P(to_T(v[i]));}b=0;}}return r;}

Bu, tüm bonuslar için uygun.

Örnek parametre testi ve sonucu:

In:  [1, 2, 3, 4, 5]
Out: 1-5

In:  [3, 4, 5, 9, 10, 11, 12]
Out: 3-5, 9-12

In:  [149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160]
Out: 149-60

In:  [1, 2, 3, 4]
Out: 1-4

In:  [109, 110, 111, 112, 113]
Out: 109-3

In:  [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
Out: 19-9

Neden intyerine kullanmıyorsun unsigned int? 9 bayt kaydeder.
kirbyfan64sos

@ kirbyfan64sos Teşekkürler, farketmedim.
TheCoffeeCup

+1 her zaman C ++ 'u görmek ister. Bunu test edemiyorum, ancak iostream'e ihtiyacın olduğunu sanmıyorum
sudo rm -rf slash

Senin de iostream'e ihtiyacın olduğunu sanmıyorum ama gccverdi:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
kedi

@cat C ++ 11 standardını destekleyecek kadar güncellendiğinden emin olun. 4.3-ish ile iyi olmalı -std=c++11; > = 5.0 varsayılan olarak açıktır (aslında -std=gnu11, ancak yeterince yakın).
Mego

8

Ruby, 120 118 * 0.8 * 0.75 * 0.5 = 35.4 bayt

Komut satırı argümanlarını girdi olarak alır (virgül olur); Standart çıktıya satır başına bir aralık yazdırır.

c=(b=(a=$*.map(&:to_i).sort).map &:succ)-a
puts (a-b).map{|m|(m<n=c.shift-1)?"#{m}-#{m<0?n:n%10**"#{n-m-1}".size}":m}

Boşluk ile / yorumlar:

c=(
  b=(
    # a is the sorted input
    a=$*.map(&:to_i).sort
  # b is the set of successors of elements of a
  ).map &:succ
# c=b-a is the set of not-quite-least upper bounds of our ranges
)-a

# a-b is the set of greatest lower bounds of our ranges
puts (a-b).map {|m|
  # for each range [m,n], if there are multiple elements
  (m < n = c.shift-1) ?
    # yield the range, abbreviating n appropriately if positive
    "#{m}-#{m<0 ? n : n % 10 ** "#{n-m-1}".size}" :
    # in the one-element case, just yield that
    m
}

Test durumları

$ ruby homework.rb 1, 2, 3, 4, 5
1-5

$ ruby homework.rb 3, 4, 5, 9, 10, 11, 12
3-5
9-2

$ ruby homework.rb 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
149-60

$ ruby homework.rb 1 2 3 4
1-4

$ ruby homework.rb 109, 110, 111, 112, 113
109-3

$ ruby homework.rb 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
19-9

Test durumları tarafından kapsanmayan özellikler

Sırasız girdi ve tek elemanlı aralıklar:

$ ruby homework.rb 2 17 19 22 0 1 8 20 18
0-2
8
17-0
22

Negatif aralıklar (bunlarla daha büyük sayıların kısaltılması mümkün değildir):

$ ruby homework.rb -17 -18 -19 -20 -21
-21--17

Rasgele sayı hanelerinin kısaltması (buradaki girdi için kullanılan normal bash genişletmesi):

$ ruby homework.rb {1234567..1235467} 2345999 2346000 2346001
1234567-467
2345999-1

0((n=c.shift-1)>m)m<n=c.shift-1
33'te

5

Javascript ES6, 229 *% 80 *% 75 *% 50 = 68,7 bayt

Test girişi

Aşağıdaki test verilerini kullanıyorum:

var A1=[
  5,6,7,            // => 5-7     # (a) group pages 
  2,3,              // => 2-3,5-7 # (b) must be properly sorted
  -9,-8,-7,         // => -10--8  # (c) allow negative numbers
  29,30,31,32,      // => 29-2    # (d) lower last digit implies increasing the 10s place
  9,10,11,12,       // => 9-11    # NOT 9-2
  36,37,38,39,40,41,42,43,44,45,46,47, 
                    // => 36-47   # NOT 36-7
  99,100,101,102,   // => 99-102  # NOT 99-2
  109,110,111,112,  // => 109-2   # NOT 109-12
],
// more tests, not specified in the question
A2=[
  120,124,       // => 120,124 # (e) handle single pages
],
A3=[
  135,136,135    // => 135-6   # (f) handle duplicates
];

Temel: 229 bayt

Bu sürüm, (a) sorusunun gereksinimlerini tüm bonuslarla (c, d, e) karşılar ancak tek sayfalarda asılı kalır. Ayrıca yinelenenleri de işleyebilir (f). -10.000'e kadar olan negatif sayfaları yönetir ve bu da (büyük) hız kaybıyla kolayca artırılabilir.

F=(a)=>{var R=[],i=NaN,l,u;a.map(x=>R[1e4+x]=x);R.concat('').map(x=>(i!=i&&(l=x,u=l-1),i=0,u=(x+="")-u-1?l=console.log(l+'-'+(u>0?(l.length-u.length||(z=>{for(;l[i]==u[i];i++);})(),u.length-i-2||u-l>9||i++,u.slice(i)):u))||x:x))}
F(A1.concat(A3)) --> -9--7 2-3 5-7 9-12 29-2 36-47 99-102 109-2 135-136

(Yukarıdaki çıktı, kısaltma için gerçek yeni satırlar yerine boşlukları gösterir)

Tek sayfalar: 233 bayt

Bu biraz daha uzun versiyon ayrıca (e) 'yi karşılar ve tekil sayfaları eşit alt ve üst sınırlara sahip bir aralık olarak görüntüler

G=(a)=>{var R=[],i=NaN,l,u;a.map(x=>R[1e4+x]=x);R.concat('').map(x=>(i!=i&&(l=x,u=l-1),i=0,u=(x+="")-u-1?l=console.log(l+'-'+(u-l&u>0?(l.length-u.length||(z=>{for(;l[i]==u[i];i++);})(),u.length-i-2||u-l>9||i++,u.slice(i)):u))||x:x))}
G(A1.concat(A2,A3)) --> -9--7 2-3 5-7 9-12 29-2 36-47 99-102 109-2 120-120 124-124

@Cyoce - ES6 etkin bir javascript motoru mu kullanıyorsunuz?
zocky

Oh, hmm, bir hatam var, aslında 36-47 doğru şekilde işlemiyor. Uygun prosedür nedir? Silip düzeltip düzeltmem mi veya sadece düzeltmeyi denemem mi (şu anda zamanım olmayabilir) veya ne?
zocky

Hmm, sadece Chrome'umda çalışıyor. Ne verir?
zocky

Ve zocky, yapabildiğin zaman tamir et. Düzeltilinceye kadar geçerli sayılmaz ve o zamana kadar kabul edilemez (sizinkilerin en az bayt olduğu varsayılarak).
Cyoce


3

GAP , 355 Bayt * 0.8 * 0.75 * 0.5 = 106.5

Bu, tüm bonusları karşılar. Her şeyin iyi çalışmasını sağlamak bana neredeyse 100 ekstra bayta mal oldu. Bu işlev, yalnızca boşluk bir kez bir yerden taşmadığında baştaki sayıları atlar. Örnek için 9 10 11çıkışlar 9-1ancak 9 10 11 12 .. 20 21çıkışlar 9-21.

GAP biraz daha az ayrıntılı olsaydı, bu kadar kısa sürebilirdim (tam sözdizimini takip etmeseydim de birçok baytı kurtarmış olabilirdim.) Muhtemelen yarın biraz daha golf oynamayı deneyeceğim. Test durumları için aşağıya bakın.

g:=function(l)local n;if not l=[] then Sort(l);n:=1;while not l=[] do;if not IsSubset(l,[l[1]..l[1]+n]) then if not n=1 then if n-1>10-l[1] mod 10 and n-1<11 then Print(l[1],"-",(l[1]+n-1) mod 10);else Print(l[1],"-",l[1]+n-1);fi;else Print(l[1]);fi;Print(", ");SubtractSet(l,[l[1]..l[1]+n-1]);g(l);fi;n:=n+1;od;fi;Print("\b\b  ");end; 

ungolfed:

g:=function(l)
    local n;
    if not l=[] then
        Sort(l);
        n:=1;
        while not l=[] do;
            if not IsSubset(l,[l[1]..l[1]+n]) then
                if not n=1 then
                    if n-1>10-l[1] mod 10 and n-1<11 then
                        Print(l[1],"-",(l[1]+n-1) mod 10);
                    else
                        Print(l[1],"-",l[1]+n-1);
                    fi;
                else
                    Print(l[1]);
                fi;
                Print(", ");
                SubtractSet(l,[l[1]..l[1]+n-1]);
                g(l);
            fi;
            n:=n+1;
        od; 
    fi;
    Print("\b\b  ");
end;

GAP sözdiziminde, [a..b]eşdeğerdir [a,a+1,...,b]. Bu test durumlarının bu programın tüm gereklilikleri karşıladığını gösterdiğine inanıyorum. Bir sorun varsa, bana bildirin.

gap> h([1..5]);
1-5  
gap> h([3,4,5,9,10,11,12]);
3-5, 9-2  
gap> h([149..160]);
149-160  
gap> h([109..113]);
109-3  
gap> h([19..29]);
19-9  

gap> h([-1,-2,-3,-7,-20000,9,10,110101,110102]);
-20000, -7, -3--1, 9-10, 110101-110102  

gap> h([10101,10102,10103,10,11,12,13,14,15,16,234,999,1000,1001,1002]);
10-16, 234, 999-2, 10101-10103  

3

Lua, 322 * 80% * 75% * 50% = 96,6 Bayt

Sonunda 3 mücadeleyle, 100 baytın altındaki skorlar: D

golfed

function f(l)table.sort(l)l[#l+1]=-13 a=l[1]t,s=a,"" for _,v in next,l do if v-t>1 or t-v>1 then s,p,r=s..a.."-",""..t,""..a r:gsub("%d",function(c)p=r:find(c)~=r:len()and p:gsub("^(-?)"..c,"%1")or p r=r:gsub("^"..c,"")end)p=t-a<10 and t%10<a%10 and p:gsub("^(%d)","")or p s,a,t=s..p..",",v,v else t=v end end return s end

Ungolfed

function f(l)
    table.sort(l)
    l[#l+1]=-13 
    a=l[1] 
    t,s=a,"" 
    for _,v in next,l 
    do
        if v-t>1 or t-v>1
        then
            s,p,r=s..a.."-",""..t,""..a
            r:gsub("%d",function(c)
                p=r:find(c)~=#r and p:gsub("^(-?)"..c,"%1")or p
                r=r:gsub("^"..c,"")
            end)
            p=t-a<10 and t%10<a%10 and p:gsub("^(%d)","")or p
            s=s..p..","
            a,t=v,v
        else
            t=v
        end
    end
return s
end

Lua'yı çevrimiçi olarak test edebilirsiniz, test senaryolarına karşı nasıl bir performans gösterdiğini görmek için, kopyalamayı yapıştırın, ardından aşağıdaki kodu uygulayın:

a={1,2,3,4,5}
b={3,4,5,9,10,11,12,13,14,15,16,17,18,19,20,21}
c={149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160}
d={-7,8,5,-6,-5,6,7}
print(f(a))
print(f(b))
print(f(c))
print(f(d))

{9..21} girildiyse başarısız görünüyor. 9-1 çıkışları.
Liam

@ICanHazHats Sabit, gösterdiğiniz için teşekkürler :)
Katenkyo

2

Java, 252 * 80% * 75% * 50% = 75,6 bayt

Bir yönteme gitmeye karar verdim (Java'da daha küçük), işte golf versiyonu:

golfed

int p,c,s;String m(int[]a){p=s=c=0;c--;String o="";Arrays.sort(a);for(int n:a){if(s==0)o+=s=n;else if(n-p==1)c++;else{o+=t()+", "+(s=n);c=-1;}p=n;}return o+t();}String t(){return c>=0?"-"+(""+p).substring((""+Math.abs(p)).length()-(""+c).length()):"";}

Ve işte okunabilir sürüm:

int p, c, s;

String m(int[] a) {
    p = s = c = 0;
    c--;
    String o = "";
    Arrays.sort(a);
    for (int n : a) {
        if (s == 0)
            o += s = n;
        else if (n - p == 1)
            c++;
        else {
            o += t() + ", " + (s = n);
            c = -1;
        }
        p = n;
    }
    return o + t();
}

String t() {
    return c >= 0 ? "-" + ("" + p).substring(("" + Math.abs(p)).length() - ("" + c).length()) : "";
}

Test edildiğinde bunlar:

import java.util.Arrays;
public class A {
    public static void main(String...s) {
        A a = new A();
        System.out.println(a.m(new int[] {1, 2, 3, 4, 5}));
        System.out.println(a.m(new int[] {3, 4, 5, 9, 10, 11, 12}));
        System.out.println(a.m(new int[] {149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160}));
        System.out.println(a.m(new int[] {109, 110, 111, 112, 113}));
        System.out.println(a.m(new int[] {19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}));
        System.out.println(a.m(new int[] {1,10,11,16}));
        System.out.println(a.m(new int[] {-3,-2,-1,0,1,2,3}));
        System.out.println(a.m(new int[] {-3,-2,-1}));
    }

    int p,c,s;String m(int[]a){p=s=c=0;c--;String o="";Arrays.sort(a);for(int n:a){if(s==0)o+=s=n;else if(n-p==1)c++;else{o+=t()+", "+(s=n);c=-1;}p=n;}return o+t();}String t(){return c>=0?"-"+(""+p).substring((""+Math.abs(p)).length()-(""+c).length()):"";}
}

Çıktı:

1-5
3-5, 9-2
149-60
109-3
19-9
1, 10-1, 16
-3-3
-3--1

Güncelleştirme:

Artık negatif sayıları da kaldırabilir ve bonusa ekleyebilir.


Java uzmanı değilim ama değiştirerek kısaltabilir p=s=c=0;c--;misiniz p=s=0;c=-1;?
23

Java uzmanı değilim, ancak c> = 0 değerini değiştirerek kısaltabilir misiniz? "bla": "" c <0 döndürmek için? "": "bla"?
Stephan Schinkel

c=~(p=s=0)stil puanları için bile yapabilirsin .
23

2

Japt, 127 bayt *% 80 *% 75 *% 50 = 38,1

Vay, bu tüm bonusları dahil etmek için büyük bir zorluktu. Muhtemelen daha kısa yapılabilir.

D=[]N=Nn-;DpNr@Y-1¥Xg1 ?[Xg Y]:DpX ©[YY]}D;Ds1 £[BC]=Xms;B¥C?B:B+'-+CsBg ¦'-©Cl ¥Bl ©C¬r@B¯Z ¥C¯Z ªC-B§ApCl -Z ©ÂBsX <ÂCsX ?Z:X

Çevrimiçi deneyin!

Nasıl çalışır

Açıklama çok kaba; aklınıza gelebilecek soruları sormakta tereddüt etmeyin.

/*    Setting up basic variables    */
                      // Implicit: A = 10, N = list of input numbers.
D=[],N=Nn-;           // D = empty array, N = N sorted by subtraction.

/*    Finding ranges of page numbers    */    
Dp                    // Push into D the result of
NrXYZ{                // reducing each previous value X and item Y in N by this function,
}[];                  // starting with an empty array:
 Y-1==Xg1 ?           //  If Y is 1 more than the second item of X,
 [Xg Y]:              //   return [X[0], Y].
 DpX &&[YY]           //  Otherwise, push X into D and return [Y, Y].

/*    Formatting result    */
Ds1 mXYZ{             // Take the first item off of D and map each item X by this function:
 [BC]=Xms;            //  Set B and C to the first to items in X as strings.
 B==C?B               //  If B is the same as C, return B.
 :B+'-+Cs             //  Otherwise, return B + a hyphen + C.slice(
  Bg !='-&&           //   If B[0] is not a hyphen (B is not negative), AND
  Cl ==Bl &&          //   B and C are the same length,

  /*    Cutting off unnecessary digits    */
  Cq r                //    then C split into digits, reduced with
  rXYZ{               //    each previous value X, item Y, and index Z mapped by this function:
   Bs0,Z ==Cs0,Z ||   //     If B.slice(0,Z) equals C.slice(0,Z), OR
   C-B<=ApCl -Z       //     C - B <= 10 to the power of (C.length - Z);
   &&~~BsX <~~CsX     //     AND B.slice(X) is a smaller number than C.slice(X),
   ?Z:X               //     then Z; otherwise, X.
                      //   Otherwise, 0.

1

R, 167 bayt x% 80 x% 75 x% 50 -> 50,1

s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];z=tail(x,1);r=c(r,paste0(x[1],"-",ifelse(z-x[1]<=10,z%%10,z%%100)))};cat(r,sep=", ")

Yeni çizgilerle girintili:

s=sort(scan(se=","))
r=c()
while(length(s)){
w=s==1:length(s)+s[1]-1
x=s[w]
s=s[!w]
z=tail(x,1)
r=c(r, paste0(x[1],"-", ifelse(z-x[1]<=10, 
                               z%%10,
                               z%%100)))}
cat(r,sep=", ")

Test durumları:

> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 3, 4, 5, 9, 10, 11, 12
8: 
Read 7 items
3-5, 9-2
> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
13: 
Read 12 items
149-60

% -50 bonus için çalışıyor:

> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
12: 
Read 11 items
19-9
> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 109, 110, 111, 112, 113
6: 
Read 5 items
109-3

Sıralanmamış girişi kabul eder:

> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 114, 109, 110, 111, 112, 113
7: 
Read 6 items
109-4

Negatif sayıları kabul eder:

> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: -1,0,1,2
4: 
Read 3 items
-1-2

0

sh, 135 * .8 * .75 * .5 = 40.5

tr , \\n|sort -n|awk -vORS="" '$1-o>1||!c{print p c$1;s=$1}{o=$1;c=", ";p=""}o>s{p="-"substr(o,length(o)-length(o-s-1)+1)}END{print p}'

kabuk betiği

tr , \\n|           # comma separated -> newline separated
sort -n|            # sort
awk -vORS=""        # suppress automatic newlines in output

awk betiği

# on step > 1 or first run, end the current sequence and start a new one.
# on first run, p and c are empty strings.
$1-o>1||!c
    {print p c$1;s=$1}

# old = current, c = ", " except for first run, clear end string.
    {o=$1;c=", ";p=""}

# if the sequence is not a single number, its end is denoted by "-o".
# print only the last n digits of o.
o>s
    {p="-"substr(o,length(o)-length(o-s-1)+1)}

# end the current sequence without starting a new one.
END
    {print p}'

burada sakım dizisinin başlangıç ve oönceki giriş değerdir.


Hoşuma gitti, ancak şu anda% -25 bonus alamıyor. substr () eksi işaretlerini ve anlamlı basamakları keser.
ezrast,

: @ezrast Bu aslında -50% ikramiye açısından doğru bir davranıştır -31, -30, -29, -28gelen 10'un yerine artışlar -3için -2ve dolayısıyla yoğunlaşır edilecektir -31-8. Ayrıca onun yarattığı belirsizliği de görüyorum, ancak bunun için istendi.
Rainer P.
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.