Hadi bir merdiven inşa edelim


19

Yeni başlayanlar için yeterli (yarı) kolay zorluğumuz yok. Gittikçe daha kolay olanlar zaten alındı. Bu yüzden yeni başlayanlar tarafından elde edilebilecek bir şey bulmaya çalıştım, ancak bu bir kopya değil.

Giriş:

İşletim sisteminizin yeni satırıyla (yani \r\n) ayrılmış tek bir dize
veya birden çok dizeye sahip bir dizi.

Çıktı - Merdivenler :

Alfabetik olmayan ve sayısal olmayan tüm sembolleri kaldırın. Yani geriye kalan tek şey [A-Za-z0-9]. Ve sonra 'bir merdiven inşa et'; temelde uzunlukları en küçük en üstte ve en geniş altta olacak şekilde sipariş edin.

Zorluk kuralları:

  1. İki dize eşit uzunlukta olduğunda, bunları büyük bir dize olarak birleştiririz (sıra önemli değildir, bu nedenle hangisini tercih ederseniz edin, ilkinden sonuncuya veya sondan ilke olabilir).
  2. Yukarıdaki kural, birleştirilen dizeler tekrar eşit uzunlukta olduğunda yığınlanabilir (bkz. Test örneği 2).

Genel kurallar:

  • Giriş STDIN'dir ve yalnızca ASCII karakterleri içerir. Ve çıktı STDOUT.
  • Çıkış durumu giriş ile aynı olmalıdır.
  • Her gönderim yalnızca bir yöntem / işlev değil, derleyebilen ve çalıştırabilen tam bir program olmalıdır. EDIT: Oldukça yeniyim, bu yüzden tam bir programı kendim tercih etsem de, belki de varsayılanı bundan sonra kullanmak daha iyidir . Zaten tam bir program yayınlayan herkes için üzgünüm. Düzenlemek için çekinmeyin, bir dahaki sefere yazının ortasında meydan okumayı değiştirmemeye çalışacağım.
  • Bu , bu yüzden bayttaki en kısa cevap kazanır. Muhtemelen bir yıl sonra en kısa cevabı kabul ediyorum.
    Kod-golf cevaplarının, C # ve benzerleri gibi kodsuz golf dillerini yayınlamaktan vazgeçmesine izin vermeyin! Herhangi bir programlama dili için en kısa cevabı bulmaya çalışın.
  • Bu sorudan daha yeni dilleri kullanmaktan çekinmeyin.

Test senaryoları:

Giriş 1:

This is a sample text,
that you will have to use to build stairs.
The wood may be of excellent quality,
or pretty crappy almost falling apart and filled with termites.
Bla bla bla - some more text
Ok, that will do

Çıkış 1:

Okthatwilldo
Thisisasampletext
Blablablasomemoretext
Thewoodmaybeofexcellentquality
thatyouwillhavetousetobuildstairs
orprettycrappyalmostfallingapartandfilledwithtermites

Giriş 2:

A
small
one
that
contains
equal
length
strings
for
the
special
rule

Çıkış 2:

A                   Or alternatively:       A
length                                      length
oneforthe                                   theforone
smallequal                                  equalsmall
stringsspecial                              specialstrings
thatrulecontains                            containsrulethat

Adım 2'de açıklanmıştır:

Uzunlukta ilk sipariş:

A
one
for
the
that
rule
small
equal
length
strings
special
contains

İlk birleştirme:

A
oneforthe
thatrule
smallequal
length
stringsspecial
contains

Uzunluk ikinci sipariş:

A
length
thatrule
contains
oneforthe
smallequal
stringsspecial

İkinci birleşme:

A
length
thatrulecontains
oneforthe
smallequal
stringsspecial

Uzunluk üçüncü sipariş:

A
length
oneforthe
smallequal
stringsspecial
thatrulecontains

Giriş 3:

Test,
test.
This
is
a
test.

Çıkış 3:

a                   Or alternatively:       a
is                                          is
TesttestThistest                            testThistestTest

Giriş 4:

a
bc
d!
123

Çıkış 4:

123     Or alternatively:    123
adbc                         dabc

1
containsçıkış 2'de olması gerekmiyorthatrule
Keatinge

2
İstediğinizin tam tersini aldınız, bunu yapmak oldukça zor.
Bálint

"Bu sorudan daha yeni dilleri kullanmaktan çekinmeyin" - Yani, eğer bir dil yaratırsam, bu zorluğu 0 bayt olarak çözmek için, bu teknik olarak yasal, değil mi?
Bálint

Kum havuzundaki bu meydan okuma mıydı?
Bálint

1
@nimi Ben şahsen tam bir programı tercih ediyorum, ama gerçekten ısrar ediyorsanız şimdi kaldırabilirim ve herkes varsayılanı kullanabilir .. Oldukça yeniyim, belki de bundan sonra varsayılanı kullanmak daha iyidir. Zaten tam bir program yayınlayan herkes için üzgünüm. Düzenlemek için çekinmeyin, bir dahaki sefere kuralların ortasında meydan okuma şansını denememeye çalışacağım.
Kevin Cruijssen

Yanıtlar:


4

Kabuk , 11 bayt

ωȯmΣġLÖLmf□

Çevrimiçi deneyin!

Kabuğu bu meydan okumadan daha genç (resmi olarak hiçbir fark yaratmıyor, ama yine de).

açıklama

ωȯmΣġLÖLmf□  Implicit input (list of strings), say ["a","bc","d!","123"]
        mf□  Keep only alphanumeric chars of each: ["a","bc","d","123"]
ωȯ           Repeat until fixed point is reached:
      ÖL       Sort by length: ["a","d","bc","123"]
    ġL         Group by length: [["a","d"],["bc"],["123"]]
  mΣ           Concatenate each group: ["ad","bc","123"]
             Final result ["123","adbc"], print implicitly separated by newlines.

"Her birinin yalnızca alfasayısal karakterlerini sakla" olduğunda mf□kıskanmanız gerekir. "Uzunluğa göre grupla" olduğunda ġL, şaşıracaksınız.
Outgolfer Erik

Cevabınızı şimdi kabul ettim. Yeni meta, meydan okumadan daha yeni dillerin kullanılabileceğidir (ve bunu gönderdiğimde meydan okumamda da bahsetmiştim). Daha önce söylediğim gibi, güzel cevap!
Kevin Cruijssen

4

Python 3, 264 Bayt

Kod golf de iyi değilim, bu en iyi Python 3 cevap olmayacağından eminim. Bu, her uzunluk için tüm kelimeleri içeren özyineleme ve sıralı bir dikte kullanır.

from collections import*
def f(i):
 d = defaultdict(list)
 for l in i: x = "".join(c for c in l if c.isalnum());d[len(x)].append(x)
 n = (sorted(["".join(d[z]) for z in d.keys()], key=len))
 if n == i:return "\n".join(n)
 return f(n)
print(f(eval(input())))

Örneğin, stdin'den bir liste olarak girdi alır, bu listeyle test edin:

['A', 'small', 'one', 'that', 'contains', 'equal', 'length', 'strings', 'for', 'the', 'special', 'rule']

Çıktı olacak:

A
length
oneforthe
smallequal
stringsspecial
thatrulecontains

1
Mükemmel cevap! Golf hakkında birkaç ipucu: 1) = işaretler veya == işaretler etrafında boşluklara ihtiyacınız yoktur. 2) Python, "," return "\ n" ") için" import * "(ör.") İle yaptığınız gibi başka bir değişken adı olamayacağını biliyorsa anahtar kelimeleri algılayabilir. 3) (Pozitif değil) sıralı () parantez gerekmez eminim. Mutlu kodlama!
Mavi

bölüm filter(str.isalnum, l)yerine kullanabilirsiniz"".join
njzk2


3

Oracle SQL 11.2, 346 bayt

Giriş dizesindeki çizgiler '¤' ile ayrılır. Bu şekilde girdi olarak kullanılacak bir tablo oluşturmak gerekmez.

This is a sample textthat you will have to use to build stairsThe wood may be of excellent qualityor pretty crappy almost falling apart and filled with termitesBla bla bla - some more text¤Ok, that will do
A¤small¤one¤that¤contains¤equal¤length¤strings¤for¤the¤special¤rule
TesttestThis¤is¤a¤test         

Sorgu :

WITH v AS(SELECT REGEXP_REPLACE(COLUMN_VALUE,'[^a-zA-Z0-9]')s FROM XMLTABLE(('"'||REPLACE(:1,'¤','","')||'"'))),r(s,i,l)AS(SELECT s,1,1 FROM v UNION ALL SELECT LISTAGG(s)WITHIN GROUP(ORDER BY s)OVER(PARTITION BY LENGTH(s)),ROW_NUMBER()OVER(PARTITION BY LENGTH(s)ORDER BY s),l+1 FROM r WHERE l<LENGTH(:1)AND i=1)SELECT s FROM r WHERE l=LENGTH(:1);  

Un-golfed

WITH v AS
( 
  -- Splits on ¤ and keeps only alphanum characters 
  SELECT REGEXP_REPLACE(COLUMN_VALUE,'[^a-zA-Z0-9]')s FROM XMLTABLE(('"'||REPLACE(:1,'¤','","')||'"'))
)
-- Recursive view 
-- s : string
-- i : index of the string in case of duplicates
-- l : exit condition
,r(s,i,l)AS
(
  -- Start with every element of the input
  SELECT s,1,1 FROM v
  UNION ALL
  SELECT -- Concatenate elements of the same lengths
         LISTAGG(s)WITHIN GROUP(ORDER BY s)OVER(PARTITION BY LENGTH(s))
         -- Index of elements of the same length (listagg with over generates duplicates)
        ,ROW_NUMBER()OVER(PARTITION BY LENGTH(s) ORDER BY s)
        -- exit condition
        ,l+1 FROM r WHERE l<LENGTH(:1) AND i=1
)
-- Keep only the elements from the last iteration (automaticaly sorted on my system)
SELECT s FROM r WHERE l=LENGTH(:1)  


@FliiFe, ',' ve '' işaretlerini kaldırmaz. son test davasında
Jeto

Garip ... Ama yine de yerini alabilir 0-9ile \d. Belki normal ifade kuralları sql'de python / php / javascript'ten farklıdır? (js
lookbehinds

2

Haskell, 129 bayt

import Data.List
import Data.Char
l=length
print.(foldl(const.map concat.groupBy((.l).(==).l).sortOn l)=<<(filter isAlphaNum<$>))

Bir dizi diziyi kabul eder ve yazdırır. Sonuç işlevden döndürülebilirse (stdout'a yazdırmanın aksine), print.6 baytı atlayabilir ve kaydedebilirsiniz.

Nasıl çalışır (not, xtabii ki yukarıdaki pointfree sürümünde görünmeyen giriş parametresi için kullanın ):

 (    )=<<(     )          -- (f =<< g) x is f (g x) x, so we fold over x with a
                           -- starting value of:
     filter isAlphaNum<$>x -- keep only alphanumeric chars in every line of x

                           -- during folding, I ignore the the elements of x.
                           -- However folding stops the repeatedly applied function
                           -- after (length x) steps, which is enough for combining
                           -- lines of equal length

 const                     -- ignore elements from x, deal only with start value
                sortOn l   -- sort lines from shortest to longest
      groupBy((.l).(==).l) -- group lines of equal length
    map concat             -- concatenate each group      

print                      -- print result after (length x) iterations

2

Python 3, 184180 bayt

def f(x):l=len;m=filter;y=sorted([''.join(m(str.isalnum,i))for i in x],key=l);*z,=m(l,[''.join(i for i in y if-~j==l(i))for j in range(l(y[-1]))]);y==z and+print(*z,sep='\n')or f(z)

Bir dizge listesi olarak girdiyi argüman olarak alan ve sonucu STDOUT'a bastıran bir işlev. Yürütme, hata yazdırılmadan önce + işlecinin kullanılması nedeniyle bir hata oluşturur, ancak çıktı yazdırılmadan önce değil.

Nasıl çalışır

def f(x):                              Function with input of list of strings
l=len;m=filter                         Redefine much-used functions: len gives the length
                                       of an object and filter chooses those items from an
                                       iterable for which a function is true
[''.join(m(str.isalnum,i))for i in x]  Strip to leave only alphanumeric characters...
y=sorted(...,key=l)                    ...and sort by length, into y
''.join(i for i in y if-~j==l(i))      Concatenate equal length strings...
[...for j in range(l(y[-1]))]          ...for all possible string lengths...
*z,=(m(l,...))                         ...and remove empty strings by filtering by length
                                       (the empty string has length 0, and is thus false),
                                       into z
y==z and+print(*z,sep='\n')...         If no change after concatenation, no more equal
                                       length strings exist, so print result to STDOUT...
...or f(z)                             ...else pass new list to function

Ideone üzerinde deneyin


2

J , 48 bayt

[:(/:#&>)[:(#&>,&.>//.])^:_(#~e.&AlphaNum_j_)&.>

Çevrimiçi deneyin!

ungolfed

[: (/: #&>) [: (#&> ,&.>//. ])^:_ (#~e.&AlphaNum_j_)&.>

açıklama

  • (#~e.&AlphaNum_j_)&.> alfasayısal olmayanları kaldır
  • (#&> ,&.>//. ]) aynı uzunluktaki öğeleri birleştir
  • ^:_ değişmeyi bırakana kadar birleştirmeye devam et
  • (/: #&>) uzunluğa göre sırala

1

JavaScript 198 188 186 179 bayt

Bu benim en uzun ikinci golf javascript programım

s=>s.replace(/[^\w]|_/g,``,l=0).split(/\s/g).sort(g=(a,b)=>a[m=`length`]-b[m]).reduce((a,b,c)=>a+(a.split(/\s/g)[c-1][m]<b[m]?`
`:` `)+b).replace(/ /g,``).split`
`.sort(g).join`
`

Muhtemelen daha fazla golf yapılabilir


Ne kullanıyorsunuz tiçin değişken?
gcampbell

Tamam böylece y = "split" ilan ederek golf yapabilirsiniz ve daha sonra kullanmak yerine .split()kullanabilirsiniz[y]()
Bald Bantha

@gcampbell Bu testten kalan bir şeydi
Bálint

@BaldBantha Ben bunu kısaltacağını sanmıyorum
Bálint

@BaldBantha Uzun boylu olsa da yaptım
Bálint


1

Jöle , 17 bayt

f€ØWṖ¤L€Ġị⁸Ẏ€µÐLY

Çevrimiçi deneyin!

Neden Ẏf¥€ØWṖ¤L€ĠịµÐLYişe yaramadığından emin değilim ...

Açıklama:

f€ØWṖ¤L€Ġị⁸Ẏ€µÐLY Full program
             µÐL  Execute the following until we get a result a second time
     ¤              The following as a nilad
  ØW                  [A-Za-z0-9_]
    Ṗ                 Remove last element (_)
f€                  Filter the left argument (current result) with the above nilad
       €            Left map
      L               Length
        Ġ           Group indices of same values, sort values
          ⁸         Left argument
         ị          Index on ^^ and ^
            €       Left map
           Ẏ          Concatenate elements
                Y Join on newlines (full program will display correctly)

1

Pyth, 22 bayt

jlDusM.glkG@Ls++GrG1UT

Burada deneyin.

Açıklama:

jlDusM.glkG@Ls++GrG1UT
j                      join on newlines
 lD                     sort by length
   u                     run until duplicate result, return result (argument G, iteration number H)
    sM                    map concatenate elements
      .g                   group elements by function (argument k)
        l                   length
         k                   k
          G                 G
           @L             left map filter on presence (extra argument first)
             s             concatenate elements
              +             concatenate two items
               +             concatenate two items
                G             G (default = lowercase alphabet)
                 r 1          to uppercase
                  G            G
                    U        unary range [0..n)
                     T        T (default = 10)

1

Pyth, 39 bayt

Golf oynamaya geri dön!

Program var:

=Qm:d"[\W_]"kQKYLmsd.glkolNb;WnKQ=KQ=yQ;jQ

=Qm:d"[\W_]"kQLmsd.glkolNb;WnYQ=YQ=yQ;j

Burada test edin!

açıklamalar

=Qm:d"[\W_]"kQLmsd.glkolNb;WnYQ=YQ=yQ;j       (Implicit) Assign evaluated imput to Q (In this case, an array)
=Q                                            Reassign a value to Q
  m          Q                                map a function over Q
   :d"[\W_]"k                                 Replace any special character with an empty string
              L           ;                   Declare a function y(b)
                      olNb                      Sort b by length
                  .glk                          Group strings of same length in arrays
               msd                              Concat each inner array
                           WnYQ      ;        While Y != Q (previous array is not equal to current array)
                               =YQ              Assign the current array to Y (Y=Q)
                                  =yQ           Assign y(Q) to Q (Q=yQ). Here, the assigned variable name is implicit
                                      j       Display the resulting array

RLm
Kullanmaya

1

Java 8, 268 bayt

Değişken bir kabul eden bir boşluk lambda List<String>(yani,add ve removeörneğin; ArrayList). Çıktı, standart satıra göre yazdırılır, yeni satırla sınırlandırılır ve sondaki yeni satırla yazdırılır. Şuraya yayınla Consumer<List<String>>.

l->{int i=0,z;while(i<l.size())l.set(i,l.get(i++).replaceAll("\\W| ",""));while(l.size()>0){l.sort((s,t)->s.length()-t.length());String s=l.remove(0);for(i=0,z=s.length();l.size()>0&&l.get(0).length()==z;i++)s+=l.remove(0);if(i<1)System.out.println(s);else l.add(s);}}

Çevrimiçi Deneyin

Bu beklediğimden çok daha uzun oldu. Kevin'in gözlemlediği gibi, ilk bakışta göründüğünden daha karmaşık.

Ungolfed lambda

l -> {
    int i = 0, z;
    while (i < l.size())
        l.set(i, l.get(i++).replaceAll("\\W| ", ""));
    while (l.size() > 0) {
        l.sort((s, t) -> s.length() - t.length());
        String s = l.remove(0);
        for (
            i = 0, z = s.length();
            l.size() > 0 && l.get(0).length() == z;
            i++
        )
            s += l.remove(0);
        if (i < 1)
            System.out.println(s);
        else
            l.add(s);
    }
}

İlk olarak, girdiyi harf ve rakamlara indiriyorum. Daha sonra girdileri gruplar halinde girdiler. Bir sonraki uzunluğa ulaşılıncaya kadar listedeki ilk öğeye eklerim, giderken kaldırırım. Yalnızca ilk öğe kullanılmışsa, bu uzunluktaki tek dize olacaktır, bu yüzden yazdırılır. Aksi takdirde, birleştirilen dize başka bir yineleme için listeye eklenir. Kullanmadan önce listeyi her yinelemeye göre sıralıyorum.

Ara dizeleri takip etmek için öncelik kuyruğunu kullanan hoş bir çözümle başladım. Ne yazık ki, java.util.PriorityQueue<String>oldukça uzun (ve ham türü kullanmak daha uzundu), bu yüzden gitmek zorunda kaldı.


1

Japt v2.0a1-h , 11 bayt

Dizgiler dizisi olarak girdi ve çıktı.

£=mk\W üÊmq

Dene

£=mk\L üÊmq
                :Implicit input of string array U
£               :Map
  m             :  Map U
   k            :    Remove
    \W          :    /[^A-Z0-9]/gi
       ü        :  Sort & partition by
        Ê       :    Length
         m      :  Map
          q     :    Join
 =              :  Reassign to U for next iteration
                :Implicit output of last element

O zamanlar için test senaryoları eklemeyi unuttuğum halde (şimdi bir tane ekleyeceğim), rakamlar da dizelerde tutulmalıdır (bunun [a-zA-Z0-9]yerine [a-zA-Z]).
Kevin Cruijssen

@KevinCruijssen, sabit
Shaggy

1

JavaScript, 119 bayt

Bunun çok daha kısa olması gerektiğini hissediyorum ...

Çıktıda önde gelen 2 yeni satır içerir.

f=s=>s==(s.replace(/[^\w\n]|_/g,t=``).split`
`.sort((x,y)=>x[l=`length`]-y[l]).map(x=>t+=s==(s=x[l])?x:`
`+x),t)?t:f(t)

Çevrimiçi deneyin


Negatif bir karakter yelpazesi damla böylece, küresel bayrağını varsaymak gibi görünüyor g118 için
Jan


Sonra yine, tekrarlama olmalıdır global bayrağını bırakın
Jan

@Jan, bu başarısız olur, örneğin, tio.run/##TY3NDoIwEITvfQtuuxHqnWTxQQDdikUxtSV0ozXx3fEn/…
Shaggy


1

Pyth, 21 bayt

jusM.glkG:R"[^\w\d]"k

Girdi, dizelerin listesidir. Burada çevrimiçi deneyin veya tüm test senaryolarını burada doğrulayın .

jusM.glkG:R"[^\w\d]"kQ   Implicit: Q=eval(input()), k=""
                         Trailing Q inferred
          R          Q   For each string in Q...
         : "[^\w\d]"     ... replace non-alphanumerics...
                    k    ... with k (empty string)
 u                       Repeat the following until a fixed point occurs, current as G:
    .g  G                  Group the elements of G...
      lk                   ... by length
                             Groups ordered by the result of the inner function, i.e. length
                             This means that, in the final iteration, this acts as a sort by length
  sM                       Concatenate each group back into a string
j                        Join the resulting list on newlines, implicit print

0

05AB1E , 16 bayt

εžKÃ}»Δ¶¡é.γg}J»

Dizelerin bir listesi olarak girin.

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Dizeleri bir listesi ile de işe εžKÃ}Δé.γg}J}»yarar 14 bayt olabilirdi Δ..

Açıklama:

ε   }            # Map the (implicit) input-list of strings:
 žjà             #  Leave only the letters and digits of each string
                 #   i.e. ["a","bc","d!","123"] → ["a","bc","d","123"]
     »           # Join the list by newlines to a single string
                 #  i.e. ["a","bc","d","123"] → "a\nbc\nd\n123"
      Δ          # Loop until the string no longer changes:
       ¶¡        #  Split by newlines
                 #   i.e. "a\nbc\nd\n123" → ["a","bc","d","123"]
          }    #  Group the strings by:
           g     #   Their length
                 #    i.e. ["a","bc","d","123"] → [["a,"d"],["bc"],["123"]]
             J   #  Join each group-list to a single string
                 #   i.e. [["a,"d"],["bc"],["123"]] → ["ad","bc","123"]
              »  #  Join this list by newlines again
                 #   i.e. ["ad","bc","123"] → "ad\nbc\n123"
                 # (and the result is output implicitly after the loop)
                 #  i.e. "123\nadbc"

-1

Powershell, Windows 10, 63 bayt

Yani girdi ...

$n = @"
This is a sample text,
that you will have to use to build stairs.
The wood may be of excellent quality,
or pretty crappy almost falling apart and filled with termites.
Bla bla bla - some more text
Ok, that will do
"@

ve kod ...

((($n -Split '\n').Replace(" ","")) -Replace '[\W]','')|Sort *h

Giriş / çıkış 1'i kapsar, 2 ve 3 üzerinde çalışır ...


PPCG'ye Hoşgeldiniz! Genellikle bir değişken ayarlayarak girişe izin vermeyiz. Bir bağımsız değişken alan bir işlev oluşturmanız veya STDIN, bir komut satırı argümanı veya benzerlerinden girdi almanız gerekir.
Stephen

1
PPCG'ye Hoşgeldiniz! @StepHen'ın söylediklerine ek olarak, mevcut durum özel durum için başarısız oluyor. Her şeyi bir araya getirir ve bir kez sıralar, ancak eşit boyutlu çizgileri birleştirip tekrar sıralamaz. (Bkz. Test örneği 2.)
Kevin Cruijssen
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.