Mari kita membangun Tangga


19

Kami tidak memiliki cukup (semi-) tantangan mudah untuk pemula. Semakin banyak yang mudah sudah diambil. Jadi saya mencoba menemukan sesuatu yang mungkin dapat dicapai oleh pemula, tetapi itu bukan duplikat.

Memasukkan:

Satu string terpisah dengan OS baris baru Anda (yaitu \r\n),
atau array dengan beberapa string.

Output - Tangga :

Hapus semua simbol non-alfabet dan non-numerik. Jadi yang tersisa hanyalah[A-Za-z0-9] . Dan kemudian 'membangun tangga'; pada dasarnya memesannya panjang dengan yang terkecil di atas dan terluas di bagian bawah.

Aturan tantangan:

  1. Ketika dua string memiliki panjang yang sama, kami menggabungkannya dengan satu sama lain sebagai satu string besar (urutannya tidak masalah, jadi itu bisa dari pertama hingga terakhir atau terakhir ke pertama, yang mana dari dua yang Anda inginkan).
  2. Aturan di atas dapat ditumpuk ketika string yang digabungkan memiliki panjang yang sama lagi (lihat uji kasus 2).

Aturan umum:

  • Inputnya adalah STDIN dan hanya berisi karakter ASCII. Dan outputnya adalah STDOUT.
  • Kasing keluaran harus sama dengan input.
  • Setiap pengiriman harus merupakan program lengkap yang dapat dikompilasi dan dijalankan, jadi bukan hanya metode / fungsi. EDIT: Saya agak baru, jadi mungkin memang lebih baik menggunakan default mulai sekarang, meskipun saya lebih suka program lengkap sendiri. Maaf untuk semua orang yang telah memposting program lengkap. Jangan ragu untuk mengedit, dan saya akan mencoba untuk tidak mengubah pos pertengahan tantangan lain kali.
  • Ini adalah , jadi jawaban tersingkat dalam byte menang. Saya mungkin menerima jawaban terpendek dalam satu tahun dari sekarang.
    Jangan biarkan jawaban kode-golf mencegah Anda memposting bahasa non-codegolf golf seperti C # dan sejenisnya! Cobalah untuk memberikan jawaban terpendek untuk bahasa pemrograman apa pun.
  • Jangan ragu untuk menggunakan bahasa yang lebih baru dari pertanyaan ini.

Kasus uji:

Input 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

Output 1:

Okthatwilldo
Thisisasampletext
Blablablasomemoretext
Thewoodmaybeofexcellentquality
thatyouwillhavetousetobuildstairs
orprettycrappyalmostfallingapartandfilledwithtermites

Input 2:

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

Output 2:

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

Langkah-langkah yang dijelaskan tentang 2:

Urutan pertama panjang:

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

Penggabungan pertama:

A
oneforthe
thatrule
smallequal
length
stringsspecial
contains

Urutan kedua panjang:

A
length
thatrule
contains
oneforthe
smallequal
stringsspecial

Penggabungan kedua:

A
length
thatrulecontains
oneforthe
smallequal
stringsspecial

Urutan ketiga panjang:

A
length
oneforthe
smallequal
stringsspecial
thatrulecontains

Input 3:

Test,
test.
This
is
a
test.

Output 3:

a                   Or alternatively:       a
is                                          is
TesttestThistest                            testThistestTest

Input 4:

a
bc
d!
123

Keluaran 4:

123     Or alternatively:    123
adbc                         dabc

1
containstidak seharusnya dalam output 2. Ini akan bergabung denganthatrule
Keatinge

2
Anda benar-benar mendapatkan kebalikan dari apa yang Anda inginkan, cukup sulit untuk melakukan ini.
Bálint

"Jangan ragu untuk menggunakan bahasa yang lebih baru daripada pertanyaan ini" - Jadi, jika saya membuat bahasa, hanya untuk menyelesaikan tantangan ini dalam 0 byte, itu secara teknis legal, bukan?
Bálint

Apakah ini tantangan di kotak pasir?
Bálint

1
@nimi Saya pribadi memang lebih suka program lengkap, tetapi jika Anda benar-benar bersikeras saya dapat menghapusnya sekarang dan semua orang dapat menggunakan default .. Saya agak baru, jadi mungkin memang lebih baik menggunakan default mulai sekarang. Maaf untuk semua orang yang telah memposting program lengkap. Jangan ragu untuk mengedit, dan saya akan mencoba untuk tidak kebetulan aturan pertengahan tantangan waktu berikutnya.
Kevin Cruijssen

Jawaban:


4

Sekam , 11 byte

ωȯmΣġLÖLmf□

Cobalah online!

Kulit lebih muda dari tantangan ini (yang tidak membuat perbedaan secara resmi, tapi tetap saja).

Penjelasan

ωȯ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.

Ketika "simpan hanya karakter alfanumerik masing-masing" mf□, Anda harus cemburu. Ketika "kelompok panjang" adalah ġL, Anda harus kagum.
Erik the Outgolfer

Saya sudah menerima jawaban Anda sekarang. Meta baru adalah bahwa bahasa yang lebih baru daripada tantangan dapat digunakan (dan saya juga sudah menyebutkan itu dalam tantangan saya ketika saya mempostingnya). Seperti yang saya katakan sebelumnya, jawaban yang bagus!
Kevin Cruijssen

4

Python 3, 264 Bytes

Saya tidak pandai kode golf jadi saya yakin ini bukan jawaban Python 3 terbaik. Ini menggunakan rekursi dan perintah dict dengan semua kata untuk setiap panjang.

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())))

Mengambil input dari stdin sebagai daftar, misalnya, mengujinya dengan daftar ini:

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

Akan menampilkan:

A
length
oneforthe
smallequal
stringsspecial
thatrulecontains

1
Jawaban bagus! Beberapa tips bermain golf: 1) Anda tidak perlu spasi di sekitar = tanda, atau == tanda. 2) Python dapat mendeteksi kata kunci jika tahu itu bukan nama variabel lain, seperti apa yang Anda lakukan dengan "import *" (mis. ") Untuk", "return" \ n ""). 3) Saya cukup yakin (tidak positif) bahwa Anda tidak perlu tanda kurung diurutkan (). Selamat coding!
Biru

Anda dapat menggunakan filter(str.isalnum, l)sebagai gantinya "".joinbagian
njzk2

4

Retina, 69 63 byte

[^ \ w¶] | _

{`\ b ((.) +) ¶ ((?.) +) \ b (? (2) (?!))
$ 1 $ 3
O $ `(.) +
$ # 1 $ *

Cobalah online!


Saya pikir Anda dapat mengubah baris pertama menjadi [^\w¶]|_. Meskipun saya masih tidak yakin itu optimal.
FryAmTheEggman

3

Oracle SQL 11.2, 346 byte

Garis-garis dalam string input dipisahkan oleh '¤'. Dengan begitu tidak perlu membuat tabel untuk digunakan sebagai input.

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         

Pertanyaan:

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

Tidak bermain golf

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)  

Anda dapat mengganti regex Anda dengan[\W_]
FliiFe

@FliiFe itu tidak menghapus ',' dan '.' dalam test case terakhir
Jeto

Aneh ... Tapi Anda masih bisa menggantinya 0-9dengan \d. Mungkin aturan regex berbeda dalam sql daripada di python / php / javascript? (js masih merupakan kasus khusus karena
kelihatan

2

Haskell, 129 byte

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

Menerima dan mencetak array string. Jika hasilnya dapat dikembalikan dari fungsi (berbeda dengan dicetak ke stdout), Anda dapat menghilangkan print.dan menyimpan 6 byte.

Cara kerjanya (perhatikan, saya menggunakan xuntuk parameter input yang tentu saja tidak muncul dalam versi pointfree di atas):

 (    )=<<(     )          -- (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, 184 180 byte

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)

Sebuah fungsi yang mengambil input, dengan argumen, sebagai daftar string dan mencetak hasilnya ke STDOUT. Eksekusi menimbulkan kesalahan (karena penggunaan operator + sebelum pernyataan cetak), tetapi tidak sebelum output telah dicetak.

Bagaimana itu bekerja

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

Cobalah di Ideone


2

J , 48 byte

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

Cobalah online!

ungolfed

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

penjelasan

  • (#~e.&AlphaNum_j_)&.> hapus non alphanum
  • (#&> ,&.>//. ]) menggabungkan item dengan panjang yang sama
  • ^:_ terus kombinasikan sampai berhenti berubah
  • (/: #&>) urutkan berdasarkan panjangnya

1

Javascript 198 188 186 179 byte

Ini adalah program javascript golf terpanjang kedua saya

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`
`

Mungkin bisa bermain golf lebih lanjut


Untuk apa Anda menggunakan tvariabel?
gcampbell

Ok jadi Anda bisa bermain golf dengan mendeklarasikan y = "split" dan kemudian alih-alih menggunakan .split()Anda bisa menggunakan[y]()
Bald Bantha

@ gcampbell Itu hanya sisa dari pengujian
Bálint

@BaldBantha Saya tidak berpikir itu akan membuatnya lebih pendek
Bálint

@BaldBantha Aku melakukan itu dengan panjang
Bálint


1

Jelly , 17 byte

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

Cobalah online!

Tidak yakin mengapa Ẏf¥€ØWṖ¤L€ĠịµÐLYtidak berhasil ...

Penjelasan:

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 byte

jlDusM.glkG@Ls++GrG1UT

Coba di sini.

Penjelasan:

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 byte

Kembali bermain golf!

Ada programnya:

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

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

Uji di sini!

Penjelasan

=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

Coba gunakan Rdan Lbukannyam
Leaky Nun

1

Java 8, 268 byte

Void lambda menerima yang bisa berubah List<String>(yaitu mengimplementasikan adddan remove; misalnya ArrayList). Output dicetak ke standar keluar, dibatasi oleh baris baru, dengan baris tambahan tambahan. Diputar ke 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);}}

Cobalah secara Online

Ini akhirnya menjadi jauh lebih lama dari yang saya harapkan. Seperti yang diamati Kevin, ini lebih rumit daripada yang terlihat pada pandangan pertama.

Lambda yang tidak tersentuh

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

Pertama, saya mengurangi input di tempat menjadi huruf dan angka. Saya kemudian memproses input dalam kelompok dengan panjang. Saya menambahkan item ke yang pertama dalam daftar sampai panjang berikutnya tercapai, menghapusnya saat saya pergi. Jika hanya elemen pertama yang digunakan, itu akan menjadi satu-satunya string dengan panjang itu, jadi itu dicetak. Jika tidak, string yang bergabung ditambahkan ke daftar untuk iterasi lain. Saya mengurutkan daftar berdasarkan panjang setiap iterasi sebelum digunakan.

Saya mulai dengan solusi yang bagus yang menggunakan antrian prioritas untuk melacak string menengah. Sayangnya, java.util.PriorityQueue<String>ini cukup panjang (dan menggunakan jenis mentah lebih lama), jadi harus pergi.


1

Japt v2.0a1 -h, 11 byte

Input & output sebagai array string.

£=mk\W üÊmq

Cobalah

£=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

Meskipun saya lupa menambahkan case uji untuk itu pada saat itu (akan menambahkan satu sekarang), digit juga harus disimpan dalam string (jadi [a-zA-Z0-9]alih-alih [a-zA-Z]).
Kevin Cruijssen

@KevinCruijssen, diperbaiki
Shaggy

1

JavaScript, 119 byte

Saya merasa seperti ini harusnya jauh lebih pendek ...

Termasuk 2 baris baru dalam output.

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)

Cobalah online


Berbagai karakter negatif tampaknya menganggap bendera global, sehingga Anda dapat drop guntuk 118
Jan


Maka harus rekursi, masih Anda dapat menjatuhkan bendera global
Jan


1

Perl 6 , 85 byte

{.&([o] {my@a;@a[+.comb]~=$_ for $_;@a.grep(~*)}xx$_).sort(+*.comb)}o*.map:{S:g/\W//}

Cobalah online!

Input dan output sebagai daftar string.


1

Pyth, 21 byte

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

Input adalah daftar string. Cobalah online di sini , atau verifikasi semua test case di sini .

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 byte

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

Masukan sebagai daftar string.

Cobalah secara online atau verifikasi semua kasus uji .

Bisa jadi 14 byte εžKÃ}Δé.γg}J}»jika Δakan bekerja dengan daftar string juga ..

Penjelasan:

ε   }            # 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 byte

Jadi masukan ...

$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
"@

dan kode ...

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

Itu mencakup input / output 1, bekerja pada 2 dan 3 ...


Selamat datang di PPCG! Kami biasanya tidak mengizinkan input dengan menetapkan variabel. Anda harus membuat fungsi yang mengambil argumen, atau mengambil input dari STDIN, argumen baris perintah, atau serupa.
Stephen

1
Selamat datang di PPCG! Selain apa yang dikatakan @StepHen, jawaban Anda saat ini gagal untuk kasus khusus. Ini hanya menyatukan semuanya dan mengurutkan sekali, tetapi tidak menggabungkan garis berukuran sama dan mengurutkan lagi. (Lihat uji kasus 2.)
Kevin Cruijssen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.