Dibagi menjadi tiga!


16

Diberikan string, Anda harus membaginya menjadi kelompok-kelompok tiga karakter (oleh padding _di akhir).

Terkait , tapi tetap saja berbeda.


Sampel I / O:

  • 'abcde' -> 'abc', 'de_'

  • '1234' -> '123', '4__'

  • '' -> [] or falsey value

  • 'Three spree!' -> 'Thr', 'ee ', 'spr', 'ee!'

  • 6 MB string

Ini adalah , sehingga byte paling sedikit akan menang!

Sunting: Akhirnya, output tidak dibatasi .


10
Mengapa case khusus string kosong? Bisakah kita memilih karakter mana yang akan digunakan untuk padding?
Shaggy

12
Jadi tugasnya sebenarnya: Diberikan string, kembalikan nilai falsey jika kosong, jika tidak pisahkan menjadi tiga kelompok, padding dengan garis bawah jika perlu ? Sepertinya pasangan ganjil dari dua tugas yang tidak terkait (memeriksa panjang string dan pemisahan).
Adám

14
Hal-hal yang harus dihindari: Kasus tepi luar biasa . Dalam hal ini, string kosong harus mengembalikan array kosong atau setara, bukan nilai falsey
Jo King

6
Banyak bahasa yang diketik secara statis tidak dapat mengembalikan lebih dari satu jenis dari suatu fungsi
Perwujudan Ketidaktahuan

4
@manassehkatz Ya, tetapi hanya dalam bahasa - bahasa itu. Dalam beberapa bahasa itu membuat solusi jauh lebih rumit, atau bahkan tidak mungkin (misalnya bahasa yang diketik secara statis).
Jo King

Jawaban:



8

Python 3, 58 47 34 byte

Saya yakin orang lain bisa berbuat lebih baik. Orang lain melakukannya dengan lebih baik. Terima kasih Jo King untuk -11 -24 bytes!

Output tidak dibatasi, selamat datang di tuple hell. Mengembalikan daftar kosong ( falsy ) pada input kosong

lambda x:[*zip(*[iter(x+"__")]*3)]

TIO



5

Perl 5 , 16 15 byte

"@_\__"=~/.../g

Cobalah online!


1
15 dengan "@_\__"=~/.../g. Ada 16 lainnya: (pop.__)=~/.../gatau map/.../g,pop.__.
Grimmy

1
Terima kasih kepada @Grimy untuk tipnya \. Ini mencukur 1 byte dan saya belajar sesuatu yang baru.
Kjetil S.

4

APL + WIN 36 24 22 byte

12 byte disimpan sebagai hasil dari output yang sekarang dibatasi dan menggunakan kode dalam komentar pertama @ Adm dimodifikasi untuk bekerja di APL + MENANG dan 2 selanjutnya dengan komentar kedua. Terima kasih.

(⌈(↑⍴s)÷3)3⍴(s←⎕),'__'

Meminta input string dan menampilkan hasilnya sebagai array nx3

Cobalah online! Atas perkenan Dyalog Classic


@ Adám. Melempar kesalahan domain di APL + MENANG di paling kanan ⍴
Graham

Gagal '', bukan? Saya pikir OP (untuk beberapa alasan aneh) membutuhkan hasilnya 0(dengan peringkat apa pun).
Adám

1
@ Adám Ini menghasilkan array 0 x 3. OP sekarang tampaknya menginginkan "falsey" untuk input nol. Dengan spek terus berubah saya akan menyerah pada titik ini dan meninggalkan jawaban saya sebagai teguh! Terima kasih atas peningkatan Anda.
Graham


3

Perl 6 , 19 byte

{$_~"__"~~m:g/.../}

Cobalah online!

Pads string dengan dua garis bawah kemudian membagi string menjadi potongan tiga karakter. Kembali sebagai array objek Match.


3

Japt , 8 byte

+1 byte untuk kasus khusus string kosong. Dapat menyimpan 2 jika kita dapat memilih karakter padding kami.

©ò3 ú'_3

Cobalah

©ò3 ú'_3     :Implicit input of string
©            :Logical AND with
 ò3          :Split into chunks of 3
    ú'_3     :Right pad each with "_" to length 3


2

CJam , 11 byte

q'_3*+3/);p

Cobalah online!

Untuk input kosong ini menghasilkan string kosong, yang palsu.

Bagaimana itu bekerja

q     e# Read input as a string
'_    e# Push char '_'
3*    e# String formed by that char repeated 3 times
+     e# Concatenate to input string
3/    e# Split in groups of 3, the last of which may be shorter. Gives array of strings
);    e# Detach last string from the array and delete it
p     e# Print string representation of the array

2

Retina 0.8.2 , 10 byte

$
__
!`...

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

$
__

Tambahkan dua _s, jika kelompok terakhir perlu diisi.

!`...

Cocokkan sebanyak mungkin kelompok yang terdiri dari tiga orang, mengeluarkan pertandingan itu sendiri dan bukan menghitungnya. (Dalam Retina 1 ini akan menjadi Lbukan !.)



2

Bahasa Wolfram (Mathematica) , 28 21 byte

-7: Tidak lagi membutuhkan nilai falsy ( False) pada input kosong

Partition[#,3,1,1,_]&

Cobalah online!

Mengambil daftar karakter sebagai input. Mengembalikan daftar 3-tupel karakter yang diisi dengan Blanks ( _).


34 27 byte

StringPartition[#<>"__",3]&

Cobalah online!

Input string, daftar output string


1

Jelly , 9 byte

s3o€“___”

Tautan monadik yang menerima daftar karakter yang menghasilkan daftar daftar karakter (input kosong menghasilkan output kosong).

Cobalah online!

Bagaimana?

s3o€“___” - Link: list of characters
s3        - split into chunks of three
   €      - for each chunk:
  o       -   OR (vectorises):
    “___” -     list of characters = ['_', '_', '_']

Catatan:
Ini hanya diperlukan untuk menangani kasus tepi input kosong.
Program lengkap dapat menghilangkan jejak , tetapi di sini kita tidak dapat melakukan itu karena perilaku pencetakan dari program lengkap menghancurkan semuanya bersama-sama.


Setara 9:

o3ÐƤ“___”

Cobalah


Alternatif 9:

;“___”s3Ṗ

Cobalah



1

Java 10, 116 113 byte

s->{s+="__";int l=s.length()/3,i=l;var r=new String[l];for(;i-->0;)r[i]=s.substring(i*3,i*3+3);return l<1?0>1:r;}

Cobalah online.

Atau 104 101 byte jika array kosong bukan falsedibolehkan sebagai output ..

s->{s+="__";int l=s.length()/3;var r=new String[l];for(;l-->0;)r[l]=s.substring(l*3,l*3+3);return r;}

Cobalah online.

Penjelasan:

s->{                             // Method with String as both parameter and return-type
  s+="__";                       //  Append two "_" to the input-String
  int l=s.length()/3;            //  Get the length, integer-divided by 3
  var r=new String[l];           //  Create a string-array with that many parts
  for(;l-->0;)                   //  Loop `l` in the range (l, 0]:
    r[l]=                        //   Set the `l`'th value of the array to:
         s.substring(l*3,l*3+3); //   Get the substring of size 3 from index `l*3` from `s`
  return r;}                     //  Return the array

Array kosong sekarang diizinkan
Benjamin Urquhart

1

Ruby, 73 42 byte

a=gets
a.length!=0?a.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}:'falsey value'

Sunting: Karena nilai falsey sepertinya tidak diperlukan:

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}

1
Padding maksimum adalah 2 karakter, jadi '_'*2akan cukup, untuk yang literal '__'lebih pendek. Tapi jika Anda menambahkan padding di muka maka cukup tidak cocok dengan potongan yang lebih pendek dari 3 karakter, lebih pendek: puts"#{gets}__".scan /.../. (Perhatikan bahwa tanpa pencetakan eksplisit yang dianggap irbtidak ruby.)
manatwork



1

C (gcc) , 55 byte

i;f(char*s){for(;i%4|*s;)putchar(++i%4?*s?*s++:95:10);}

Cobalah online!


Menggunakan 9 ( \t) bukannya 10 ( \n) seharusnya baik-baik saja, tapi itu bukan poin utama
l4m2


1

Bash , 90 byte

Ini menggunakan fitur Bash daripada kombinasi perintah Bourne shell plus * nix yang lebih tradisional (yang satu versi saya buat berakhir pada 205 byte). Saya curang dengan menggunakan dodge untuk menambahkan dua karakter _ ke string.

c=;read a;a=${a}__;while (($(echo ${#a})>2));do b=${a:0:3};c=$c\ $b;a=${a#$b};done;echo $c

Cobalah online!



1

GNU sed , 27 byte

s:$:__:
s:...:& :g
s: _*$::

Cobalah online!

Ia mendapat sedikit rumit mengenai input string kosong, karena sed tidak memiliki arti nilai palsu. Jadi untuk mengatasi ini, saya memberi Anda dua kemungkinan interpretasi aturan untuk memvalidasi kiriman saya:


A. Anda pada dasarnya tidak memberikan apa-apa sebagai input, bahkan baris baru (seperti halnya semua contoh, termasuk file 6 Mb).

Pemakaian:

echo -n ""|sed -f script

Output: tidak ada yang dicetak, karena sed bahkan tidak menjalankan skrip tanpa input.


B. Seseorang dapat menganggap nilai palsu untuk sed sebagai string unik, yaitu, dikembalikan hanya ketika inputnya adalah string kosong.

Pemakaian:

echo ""|sed -f script

Keluaran:

__

Saya lebih suka interpretasi pertama jauh lebih banyak, karena saya percaya itu yang paling dekat dengan aturan yang dimaksud, tetapi yang terakhir membantu jika Anda menjalankan skrip menggunakan tautan TIO itu.




0

Attache , 34 23 byte

PadRight&"_"&3=>@Chop&3

Cobalah online!

Penjelasan (kedaluwarsa)

{On[#_-1,PadRight&"_"&3,_]}@Chop&3
                           @Chop&3    chop the input string into groups of 3s
{On[#_-1               ,_]}           on the last group
        ,PadRight                         pad it
                     &3                   to length three
                 &"_"                     with underscores

Apakah Anda menyimpan sesuatu dengan menambahkan semua elemen, bukan hanya yang terakhir?
Shaggy

@Shaggy Poin bagus! Saya akan memeriksanya
Conor O'Brien

0

Arang , 10 byte

E⪪S³…⁺ι__³

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  S         Input string
 ⪪ ³        Split into groups of up to 3 characters
E           Map over each group
      ι     Current group
     ⁺      Concatenated with
       __   Literal `__`
    …    ³  Moulded to length 3
            Each group implicitly printed on its own line

0

Scala , 31 byte

(s+"___").grouped(3).toSeq.init

Cobalah online!

Penjelasan

(s+"___")       // add "___"
  .grouped(3)   // make groups of 3
  .toSeq        // change to Seq
  .init         // take all but last

0

Befunge-93 , 30 29 byte

~:1+%,~:1+!"`"*+,~:1+!"`"*+,,

Cobalah online!

Tidak menghasilkan apa-apa untuk input kosong, jika tidak menghasilkan string dengan panjang 3 dipisahkan oleh karakter NUL.

Penjelasan:

~ Mendorong karakter input ke stack
 : 1+ Input duplikat dan tambahkan 1
    % Modulo nilai atas 2 hasil stack dan push
                                Jika input -1 (ujung aliran), hitung -1% 0 -> berhenti
                                Kalau tidak, hitung input% (input + 1) -> input
     , Pop dan karakter keluaran
      ~ Mendorong karakter input ke stack
       : 1+! Input duplikat, tambahkan 1 dan lakukan TIDAK logis
           "` "* Kalikan dengan 96 (kode ASCII untuk '`')
                                Ini mengembalikan 96 atau 0 tergantung pada hasil TIDAK
               + Tambahkan 2 nilai teratas dari tumpukan dan dorong hasilnya
                                Jika inputnya -1 (ujung aliran), tekan -1 + 96 = 95, atau kode ASCII untuk '_'
                                Jika tidak, tekan input + 0
                , Pop dan karakter keluaran
                 ~: 1 +! "` "* +, Blok yang sama lagi untuk menangani karakter ketiga
                            , Keluarkan karakter NUL (tumpukan kosong, jadi muncul dari tumpukan hanya mengembalikan 0)

Penunjuk instruksi membungkus di akhir, melingkari seluruh baris.
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.