Üçe bölün!


16

Bir dize verildiğinde, onu üç karakterlik gruplara ayırmanız gerekir ( _sonunda dolgu yaparak).

İlgili , ama yine de farklı.


Örnek G / Ç:

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

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

  • '' -> [] or falsey value

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

  • 6 MB dize

Bu bir , bu yüzden en az bayt kazanacak!

Düzenleme: Son olarak, çıktı sınırsızdır .


10
Neden boş dize özel durumda? Dolgu için hangi karakteri kullanacağımızı seçebilir miyiz?
Shaggy

12
Öyleyse görev aslında: Bir dize verildiğinde, boş bir falsey değeri döndürün, aksi takdirde üç gruba bölün, gerekirse alt çizgi ile doldurun ? İlişkisiz iki görevin garip bir çifti gibi görünüyor (dize uzunluğunu kontrol etme ve bölme).
Adám

15
Kaçınılması gerekenler: Olağanüstü uç durumlar . Bu durumda, boş bir dize, bir falsey değeri değil, boş bir dizi veya eşdeğeri döndürmelidir
Jo King

6
Statik olarak yazılmış birçok dil, bir işlevden birden fazla tür döndüremez
Cehalet

4
@manassehkatz Evet, ama sadece bu dillerde. Bazı dillerde çözümleri çok daha karmaşık, hatta imkansız hale getirir (örneğin statik olarak yazılmış diller).
Jo King

Yanıtlar:



8

Python 3, 58 47 34 bayt

Eminim başka biri daha iyisini yapabilir. İçin teşekkürler Jo Kral -11 -24 bayt!

Çıktı sınırsız, cehennemi tuple hoş geldiniz. Boş girdideki boş listeyi ( yanlış ) döndürür

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

TIO




4

APL + WIN 36 24 22 bayt

Çıktının kısıtlanması ve @ Adám'ın ilk yorumunda APL + WIN'de çalışmak üzere değiştirilen kod ve ikinci yorumuyla birlikte bir 2 kod daha kullanılması sonucu 12 bayt kaydedildi. Teşekkürler.

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

Dizenin girilmesini ister ve sonucu nx3 dizisi olarak verir

Çevrimiçi deneyin! Dyalog Classic'in izniyle


ADAM @. APL + WIN'de en sağda bir alan hatası atıyor
Graham

Başarısız '', değil mi? Bence OP (garip bir nedenden dolayı) sonucun 0(herhangi bir rütbeyle) olmasını gerektirir .
Adám

1
@ Adám 0 x 3 dizisi üretir. OP artık boş giriş için "falsey" istiyor gibi görünüyor. Spesifikasyon değişmeye devam ederken, bu noktada dışarı çıkacağım ve cevabımı standları olarak bırakacağım! İyileştirmeleriniz için teşekkürler.
Graham


3

Perl 6 , 19 bayt

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

Çevrimiçi deneyin!

Dizeyi iki alt çizgiyle doldurur ve ardından dizeyi üç karakterlik parçalara böler. Eşleşme nesneleri dizisi olarak döner.


3

Japt , 8 bayt

Boş dizeyi + 1 bayt. Dolgu karakterimizi seçebilirsek 2 kaydedebiliriz.

©ò3 ú'_3

Dene

©ò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 bayt

q'_3*+3/);p

Çevrimiçi deneyin!

Boş giriş için bu, boş olan boş bir dize verir.

Nasıl çalışır

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 bayt

$
__
!`...

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama:

$
__

_Son grubun doldurulması gerekiyorsa, iki saniye ekleyin .

!`...

Sayıdan ziyade maçların çıktısını almak için mümkün olduğunca üç grupla eşleştirin. (Retina 1'de Lbunun yerine !.)



2

Wolfram Dili (Mathematica) , 28 21 bayt

-7: Artık Falseboş girişte falsy ( ) değeri gerektirmiyor

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

Çevrimiçi deneyin!

Girdi olarak karakterlerin bir listesini alır. BlankS ( _) ile doldurulmuş karakterlerin 3 parçalı bir listesini döndürür .


34 27 bayt

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

Çevrimiçi deneyin!

String girişi, string çıktılarının listesi


1

Jöle , 9 bayt

s3o€“___”

Karakterlerin bir listesini veren (boş bir girdi boş çıktı verir) bir karakter listesini kabul eden monadic Link.

Çevrimiçi deneyin!

Nasıl?

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

Notlar: boş giriş kenarı talebini işlemek için gereklidir. Tam bir program bir iz bırakabilir , ancak burada tam bir programın yazdırma davranışı her şeyi bir araya getirdiği için bunu yapamayız.


Eşdeğer 9:

o3ÐƤ“___”

Dene


Alternatif 9:

;“___”s3Ṗ

Dene



1

Java 10, 116113 bayt

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

Çevrimiçi deneyin.

Veya 104 101 bayt boş bir dizi yerine eğer falseçıktı olarak verilir ..

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

Çevrimiçi deneyin.

Açıklama:

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

Artık boş bir diziye izin veriliyor
Benjamin Urquhart

1

Ruby, 73 42 bayt

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

Düzenleme: Falsey değeri gerekli olmadığı için:

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

1
Maksimum dolgu 2 karakterdir, bu yüzden '_'*2bir değişmezin '__'daha kısa olduğu yeterli olacaktır . Önceden dolgu eklerseniz Ama sonra basitçe adet kısa 3'ten karakter ile uyuşmaz, kısadır: puts"#{gets}__".scan /.../. (Açıkça kabul irbedilmediği kabul edilmez ruby.)
manatwork





1

Bash , 90 bayt

Bu, daha geleneksel Bourne kabuğu artı * nix komutlarının bir kombinasyonu yerine Bash özelliklerini kullanır (oluşturduğum bir sürüm 205 baytta sona erdi). Dize iki _ karakter ekleyerek dodge kullanarak hile.

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

Çevrimiçi deneyin!



1

GNU sed , 27 bayt

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

Çevrimiçi deneyin!

Sed'in bir falsy değerinin anlamı olmadığı için boş dize girişi ile ilgili biraz zorlaşır. Bu yüzden, bununla başa çıkmak için, sunumumu doğrulamak için size kuralların iki olası yorumunu sunuyorum:


C. Esasen girdi olarak hiçbir şey sağlamazsınız, sondaki satırsonu bile değil (bu 6 Mb dosyası dahil tüm örneklerde olduğu gibi).

Kullanımı:

echo -n ""|sed -f script

Çıktı: hiçbir şey yazdırılmaz, çünkü sed komut dosyasını girdi olmadan çalıştırmaz.


B. sed için benzersiz bir dize olarak falsy değeri olarak düşünülebilir, yani yalnızca girdi boş bir dize olduğunda döndürülebilir.

Kullanımı:

echo ""|sed -f script

Çıktı:

__

İlk yorumu daha çok tercih ediyorum, çünkü amaçlanan kurala en yakın olduğuna inanıyorum, ancak sonuncusu bu TIO bağlantısını kullanarak komut dosyasını çalıştırırsanız yardımcı olur.




0

Ataşe , 34 23 bayt

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

Çevrimiçi deneyin!

Açıklama (eski)

{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

Sadece sonuncusu yerine tüm elemanları doldurarak bir şey kaydeder misiniz ?
Shaggy

@Shaggy İyi bir nokta! Ben bakacağım
Conor O'Brien

0

Kömür , 10 bayt

E⪪S³…⁺ι__³

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

  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 bayt

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

Çevrimiçi deneyin!

açıklama

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

0

Befunge-93 , 30 29 bayt

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

Çevrimiçi deneyin!

Boş bir girdi için hiçbir şey çıktılamaz, aksi takdirde NUL karakterleriyle ayrılmış 3 uzunluktaki dizeleri çıktılar.

Açıklama:

~ Yığmak için giriş karakterini itin
 : 1+ Yinelenen giriş ve 1 ekleme
    % Modulo üst 2 yığın ve itme sonucu değerleri
                                Giriş -1 (akış sonu) ise, -1% 0 -> dur hesaplayın
                                Aksi takdirde% girişini (giriş + 1) -> girişi hesapla
     , Pop ve çıktı karakteri
      ~ Yığmak için giriş karakterini itin
       : 1+! Yinelenen giriş, 1 ekleyin ve mantıksal DEĞİL gerçekleştirin
           "` "* 96 ile çarp ('' 'için ASCII kodu)
                                NOT sonucuna bağlı olarak 96 veya 0 döndürür.
               + Yığındaki ilk 2 değeri ekleyin ve sonucu itin
                                Giriş -1 (akış sonu) ise, -1 + 96 = 95 veya ASCII kodunu '_' için iter
                                Aksi takdirde girişi + 0 iter
                , Pop ve çıktı karakteri
                 ~: 1 +! "` "* +, Üçüncü karakteri işlemek için aynı blok tekrar
                            , NUL karakteri çıktı (yığın boş, bu nedenle yığıntan haşhaş 0 döndürür)

Talimat işaretçisi sonunda tüm çizgiyi sararak etrafını sarar.
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.