Kelimelerini tart!


10

Meydan okuma

Yazdırılabilir ASCII karakterlerinden (kodlar) oluşan her biri 30'a kadar uzunluktaki iki dize verilir [32,126]), bunları en az bayt kodda bir denge ölçeğine koyun! Bu, aşağıdaki adımlardan oluşur:

  1. Dizelerin ağırlıklarını hesaplayın ve karşılaştırın
  2. Uygun eğimli ASCII-art ölçeğini seçin
  3. İki dizgiyi teraziye yerleştirin

Dizeler bir dizi, iki bağımsız değişken veya başka herhangi bir makul yöntem olarak geçirilebilir.


Bir dize ağırlığı dize 'Karakterlerin ağırlıkları toplamı olarak tanımlanır:

  • Boşlukların ağırlığı 0 ( )
  • Küçük harflerin ağırlığı 2'dir ( abcdefghijklmnopqrstuvwxyz)
  • Büyük harflerin ağırlığı 4 ( ABCDEFGHIJKLMNOPQRSTUVWXYZ)
  • Diğer tüm sembollerin ağırlığı 3 ( !"#$%&'()*+,-./0123456789:;<=>?@[\]^_`{|}~)

Ölçekler şöyle görünür:

          . _
          | _- * / \
          | - * / \
       _- * | / \
    _- * | / \
   / \ | * ------ *
  / \ |
 / \ |
/ \ |
* ------ * |
    ______ | ______
    _.
   / \ * -_ |
  / \ * - |
 / \ | * -_ 
/ \ | * -_
* ------ * | / \
          | / \
          | / \
          | / \
          | * ------ *
    ______ | ______
          .
          |
    ______ | ______
   / \ | / \
  / \ | / \
 / \ | / \
/ \ | / \
* ------ * | * ------ *
          |
          |
    ______ | ______

İlk dize daha ağırsa, ilk çizimi çıktınızın tabanı olarak kullanın; ikinci dize daha ağırsa, ikinci çizimi kullanın; Eğer teller eşit ağırlığa sahipse, üçüncüyü kullanın. Sondaki boşluklara izin verilir.


Aşağıdaki örneklerin tümü için temel olarak üçüncü çizimin bir bölümünü kullanacağım.

İlk dize sol pan üzerine, ikinci dize sağ pan üzerine yerleştirilmelidir.

Boşluk olmayan karakterlerini, #burada s ile işaretlendiği gibi, tire işaretlerinin hemen üzerindeki 6x5 alanına yerleştirerek bir tavaya bir dize yerleştirin (sonunda denge ölçeğinin üzerine yazabilirsiniz - bu iyidir):

 ###### _
 ######
 ######
 ######
/ ###### \
* ------ *

Bu karakterlerin tümü "yerleşmiş" olmalıdır. bir -karakterin üstünde veya dizeden başka bir karakterde:

  YANLIŞ YANLIŞ DOĞRU
    ____________
 f / \ / \ / \
  l \ / \ / \
 / \ / hov \ / s \
/ oating \ / eri ng \ / ettled \
* ------ * * ------ * * ------ *

Ek olarak, tüm yığın mümkün olduğunca düz olmalıdır, yani altı 1 geniş sütunun, en uzun yüksekliğinin ve en kısa yüksekliğinin 1'den fazla olmaması gerekir:

    YANLIŞ YANLIŞ DOĞRU DOĞRU
[en yüksek: 5] [en yüksek: 4] [en yüksek: 5] [en yüksek: 2]
[en kısa: 0] [en kısa: 2] [en kısa: 4] [en kısa: 2]
      5__5_ ____ 5_5__ ____
     45445 ve / \ 445454 / \
     45445 $% & $ @ 445454 / \
    / 45445 &% @% $ & 445454% & $ @% &
   / 45445 \ / & $ @ $ &% \ / 445454 \ / $ @ $% $$ \
   * ------ * * ------ * * ------ * * ------ *

Karakterlerin tam sırası / düzeni önemli değildir. Aşağıdakiler "Kelimelerinizi tartın!" Dizesi için geçerli tüm düzenlemelerdir:

    ____ ____ ____ ____
   / \ / \ / \ / \
 DS! \ / owd oe \ u! Wd \
 ourwor Wihuos Instagram Hesabındaki Resim ve Videoları yoiwgr eghioo
/ Tartım \ / egyrr! \ / Wrhd! S \ / rrsuwy \
* ------ * * ------ * * ------ * * ------ *

Test senaryoları

GİRİŞ: "CODE GOLF", "kodlama zorlukları"
AĞIRLIKLAR: 32, 32
ÖRNEK ÇIKTI:
          . 
          |
    ______ | ______
   / \ | / \
  / \ | NGE \ s
 / OO \ | challe
/ CFGLED \ | / \ Kodlama
* ------ * | * ------ *
          |
          |
    ______ | ______ 
GİRİŞ: "", "$"
AĞIRLIKLAR: 0, 3
ÖRNEK ÇIKTI:
    _.
   / \ * -_ |
  / \ * - |
 / \ | * -_ 
/ \ | * -_
* ------ * | / \
          | / \
          | / \
          | / $ \
          | * ------ *
    ______ | ______
GİRİŞ: "NE DEDİĞİNİ BİLİYORSUN!", "There_always_a_relevant_xkcd"
AĞIRLIKLAR: 75, 65
ÖRNEK ÇIKTI:
          . tr_a_s
          | _hekx_y
          | - * elcdta
       _- * | revanw
    _- * | / E's_al \
  T / \ | * ------ *
 AUYOHY |
 A! HWYK |
/ OTSMEW \ |
* ------ * |
    ______ | ______

1
Sondaki boşluk kabul edilebilir mi?
Hiatsu

@ Hiatsu Yep, sorun değil.
negatif yedi

2
Bu meydan okumayı seviyorum, gerçekten seviyorum. Ancak bunu vermemi engelleyen 2 nokta var +1. Birincisi: boşluklar herhangi bir şeyi "tartmaz" ve sanat eserine dahil edilmezse, neden onları hiç dahil ettiniz? İlk önce onları filtrelemek gereksizdir. İkincisi: Bu bana bir "2'si 1 arada" / bukalemun meydan okuması gibi geliyor - Zorluk 1: Hangi ipin "daha ağır" olduğunu belirleyin, Zorluk 2: Bazı ASCII sanatı oluşturun.
Shaggy

@Shaggy Bence bu adil bir değerlendirme. Bunu göndermek bana sadece işleri basit tutmayı öğretti.
negatif yedi

Yanıtlar:


7

Kömür , 110 bayt

UMθ⪫⪪ι ω≔⁰ηFθ≦⁻ΣEι⁻⁺³№ακ№βκηP-×⁷_↑χ.¶¶≔³ζ¿η«≔∨›⁰η⁵ζM±⁶±²_F⁴⁺¶*-§_|_ι¿›⁰η‖»P-⁺|×⁶_J±⁴±ζFθ«←⁶↑*↗⁴↓↘⁴←↖*←⪪ι⁶J⁹⁻ζ⁶

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Girişi iki dizeden oluşan bir dizi olarak alır. Açıklama:

UMθ⪫⪪ι ω

Her iki dizeden boşlukları kaldırın.

≔⁰η

Ağırlık dengesini varsayalım.

Fθ

Her iki dizgenin üzerinden geçin.

≦⁻ΣEι⁻⁺³№ακ№βκη

Çalışma farkını dizenin ağırlığından çıkarın.

P-×⁷_↑χ.¶¶

Denge ölçeğinin tabanını yazdırın.

≔³ζ

Her iki kabın da yerden 3 tane olduğunu varsayın.

¿η«

Ağırlıklar dengelenmezse ...

≔∨›⁰η⁵ζ

... sol kabın yüksekliğini hesapla ...

M±⁶±²_F⁴⁺¶*-§_|_ι

... dengeyi sağa yaslanarak çizin ...

¿›⁰η‖»

... ve sol kabın daha ağır olup olmadığını düşünün.

P-⁺|×⁶_

Aksi takdirde bir seviye dengesi çizin.

J±⁴±ζ

İlk ölçek bölümüne atlayın.

Fθ«

Girişlerin üzerinden dönün.

←⁶↑*↗⁴↓↘⁴←↖*

Ölçek tavasını çizin.

←⪪ι⁶

Girişi 6 uzunluktaki alt dizelere dilimleyin ve tepsiyi yukarı doğru dolduracak şekilde baş aşağı yazdırın.

J⁹⁻ζ⁶

İkinci ölçek tepsisine atlayın.


6

Python 2 , 1101 1071 855 837 bayt

Dize sıkıştırmalı -216 bayt

Tekrarlamayı azaltarak -18 bayt

from zlib import decompress as Z
from base64 import b64decode as D
r=range(6)
j="".join
w=lambda a:0if not a else(2+2*(a[0]<'[')if a[0].isalpha()else 3)+w(a[1:])
t=Z(D('eJxT0FKIV1BQ0AWT8SAIJsAcXTCppQAGumBSSx8MYsBAC0kCAiCySAIKEJW4ZHGpxA8AejMemQ=='))
p=lambda k,l,m:j(map(j,[(t[2*l+m::6][:30-len(k)]+k)[i::6]for i in r]))
def A(a,b):
 e=cmp(w(j(a.split())),w(j(b.split())))+1;return Z(D('eJxVUUGuhTAI3HOKWTdBW/U2SHoQ4O6ftvrMb0hLZJgZAYABFZB5KxD4zrZtNJOJMaHWIIoa0D6Ao+jrWRiHEI7kMcQg9VLBCo9O3dCbdanepOvZQztF9rRH2xUlwISehIZ96HltLFqu1IMF2p1QH/S+1Ge7CT5blIVOxqUWFudjqHPSwhitjPbzf7uZ1HaIaG2hShFTfU7Eca6J7MBr1K+3/YbRVLd2VlE5oilp7EG/gV7+DPQuSAsZPm7PZE9HBY2G+ctS/QzR+whSGlPAGz4mkkl5Sf18SMvkyL9iF6aLd2WLUm/KDVzvJu93k2tLZXlwetgLmFH4MzcKCaJnqX1Fz3iOf4//Pi7EwP4BHmyJpg=='))[e::3].format(*map(lambda c:[p(j(([a,b]*3)[c].split()),e,c)[i::5]for i in r],r))

Çevrimiçi deneyin!

Farklı çalıştır A(string_one, string_two.

w dizenin ağırlığını özyineli olarak hesaplar.

t çok iyi sıkıştırılan altı olası ölçeğin hepsinin sıkıştırılmış ve taramalı metnidir.

p dizeyi (boşluklar kaldırılmış olarak), dizenin ağırlığını ve dizenin açık olduğu dengenin yanını alır ve 5x6 karakterlik bir blok oluşturur.

Adizeleri alır ve bloklarını ile oluşturur p. Alttaki dev dize, titreşimli ve sıkıştırılmış üç biçim dizesidir.


3

JavaScript (ES6),  340  337 bayt

Girdiyi 2 karakter dizisi olarak alır. Çıktı karakterini karakter çizer.

S=>(s=Math.sign(~(g=i=>(S[i]=S[i].filter(c=>c>' '?i+=/[a-z]/gi.test(c)?c>{}?2:4:3:0),i))(0)+g(1))+1,g=x=>y>10?'':(X=(r=x>9)?20-x:x,Y=(r?2-s:s)*2+y,S[+r][X>0&&X<7&&47-Y*6+X]||`. /\\|-_*
`[~X?x-10?y>9?X>3?6:1:[x+y*3-17,2*y-4,x+~y*3][s]/2|X<4?Y<5|Y>8?Y-9|X>7?1:X%7?5:7:~X+Y?X+Y-8?1:2^r:3^r:[7-x%3,6,5+x%3][s]:y&&4:8])+g(x<21?x+1:!++y))(y=0)

Çevrimiçi deneyin!

Nasıl?

Giriş dizesindeki boşlukları kaldıran bir ilk yardımcı işlev tanımlarız S[i] ve ağırlığını döndürür:

g = i => (                   // i = string index
  S[i] = S[i].filter(c =>    // for each character c in S[i]:
    c > ' ' ?                //   if c is not a space:
      i +=                   //     update i:
        /[a-z]/gi.test(c) ?  //       if c is a letter:
          c > {} ?           //         if c is in lower case:
            2                //           add 2 to i
          :                  //         else:
            4                //           add 4 to i
        :                    //       else (not a letter):
          3                  //         add 3 to i
    :                        //   else (a space):
      0                      //     remove c from S[i]
  ), i                       // end of filter(); return i
)                            //

Not: Çünkü tekrar kullanıyoruz i ağırlığı hesaplamak için S[1].

Biz hesaplıyoruz seşittir 0 Eğer S[0] daha ağır, 2 Eğer S[1] daha ağır veya 1 eğer her iki tel de aynı ağırlığa sahipse:

s = Math.sign(~g(0) + g(1)) + 1

Şimdi çıktıyı çizmek için ikinci yardımcı fonksiyonunu çağırıyoruz:

g = x =>                     // given x:
  y > 10 ?                   //   if we've reached the last row:
    ''                       //     stop recursion
  :                          //   else:
    ( X = (r = x > 9) ?      //     r = true if we're on the right side
        20 - x               //       X = 20 - x on the right side
      :                      //     or:
        x,                   //       X = x on the left side
      Y = (r ? 2 - s : s)    //     Y is the position of the scale tray
          * 2 + y,           //     according to s and the current side
      S[+r][                 //     we try to extract a character from S[0] or S[1]:
        X > 0 && X < 7 &&    //       provided that we're located above the tray
        47 - Y * 6 + X       //       and using an index based on (X, Y)
      ] ||                   //     if this character doesn't exist,
      `. /\\|-_*\n`[INDEX]   //     we need to draw the balance instead
    ) +                      //     (see the next part)
    g(x < 21 ? x + 1 : !++y) //     append the result of a recursive call

INDEXAşağıdaki gibi nerede hesaplanır:

~X ?                         // if this is not the last character of the current row:
  x - 10 ?                   //   if this is not the central column:
    y > 9 ?                  //     if this is the last row:
      X > 3 ? 6 : 1          //       draw the base ('_' or a space)
    :                        //     else:
      [ x + y * 3 - 17,      //       attempt to draw the beam:
        2 * y - 4,           //         using an equation depending on s
        x + ~y * 3           //         whose result must be -1, 0 or 1
      ][s] / 2 | X < 4 ?     //       if it's invalid or X is less than 4:
        Y < 5 | Y > 8 ?      //         if we're not over the chains:
          Y - 9 | X > 7 ?    //           if we're not over the pan:
            1                //             draw a space
          :                  //           else:
            X % 7 ? 5 : 7    //             draw the pan ('-' or '*')
        :                    //         else:
          ~X + Y ?           //           if this is not an interior chain:
            X + Y - 8 ?      //             if this is not an exterior chain:
              1              //               draw a space
            :                //             else:
              2 ^ r          //               draw the exterior chain ('/' or '\')
          :                  //           else:
            3 ^ r            //             draw the interior chain ('/' or '\')
      :                      //       else:
        [ 7 - x % 3,         //         draw the beam, using either '_' -> '-' -> '*'
          6,                 //         or just '_'
          5 + x % 3          //         or '*' -> '-' -> '_'
        ][s]                 //         depending on s
  :                          //   else:
    y && 4                   //     draw the central pillar ('|' or '.')
:                            // else:
  8                          //   append a line feed

1

Java 10, 1043 993 988 983 bayt

(a,b)->{var r=new char[11][21];for(var A:r)java.util.Arrays.fill(A,' ');a=a.replace(" ","");b=b.replace(" ","");int A=s(a),B=s(b),j,c,i=3;for(;++i<17;r[3][i]=A==B?'_':32)r[10][i]=95;for(i=11;i-->1;)r[i][10]=i>0?'|':46;if(A==B){r[8][0]=r[8][7]=r[8][13]=r[8][20]=42;for(i=0;++i<20;)if(i<8|i>13)r[8][i]=45;for(i=8;i-->4;r[i][7-i]=r[i][20-i]=47)r[i][i]=r[i][i+13]=92;A=B=8;}else{r[5][i=A<B?0:13]=r[5][i+7]=r[9][13-i]=r[9][20-i]=42;for(i=5;i-->1;r[i][A>B?18-i*3:2+i*3]=42)r[i][A>B?17-i*3:3+i*3]=45;for(i=0;++i<20;)r[i>13?A>B?5:9:A>B?9:5][i>13|i<7?i:1]=45;for(i=9;i-->1;r[i][i>4?A>B?8-i:21-i:A>B?17-i:4-i]=47)r[i][i>4?A>B?i-1:i+12:A>B?i+16:i+3]=92;A=(A>B?r[i=0][16]=r[1][13]=r[3][7]=r[4][4]=95:(r[0][i=4]=r[1][7]=r[3][13]=r[4][16]=95));A=9-i;B=5+i;}c(r,a,A,7);c(r,b,B,20);return r;};int s(String s){int r=0;for(int i:s.getBytes())r+=i>64&i<91?4:i>96&i<123?2:3;return r;}void c(char[][]r,String s,int p,int q){for(int c=0,i=p,j;i-->p-5;)for(j=q;j-->q-6&c<s.length();)r[i][j]=s.charAt(c++);}

@Ceilingcat sayesinde -5 bayt .

Girdi, sonuç olarak bir karakter matrisine neden olacak iki Dize'dir.

Çevrimiçi deneyin.

Açıklama:

// Method with two String parameters and character-matrix return-type:
(a,b)->{
  // Result matrix, with 11 rows and 21 columns:
  var r=new char[11][21];
  // Initially fill the entire matrix with spaces:
  for(var A:r)java.util.Arrays.fill(A,' ');
  // Remove all spaces from the input-Strings:          
  a=a.replace(" ","");b=b.replace(" ","");
  // Call a separated method to calculate the scores of both input-Strings:
  int A=s(a),B=s(b),

  // Fill the cells for the base with '_',
  // and also fill the cells for the balance-bar with '_' when the scores are equal:
  j,c,i=3;for(;++i<17;r[3][i]=A==B?'_':32)r[10][i]=95;
  // Fill the cells for the stand with '|':
  for(i=11;i-->1;)r[i][10]=i>0?'|'
  // And the top of it with '.':
  :46;

  // If the scores are equal:
  if(A==B){
    // Fill the four appropriate cells for the sides of the scales with '*':
    r[8][0]=r[8][7]=r[8][13]=r[8][20]=42;
    // Fill the appropriate cells for the scales themselves with '-':
    for(i=0;++i<20;)if(i<8|i>13)r[8][i]=45;
    // Fill the appropriate cells of the robes with '/' and '\':
    for(i=8;i-->4;r[i][7-i]=r[i][20-i]=47)r[i][i]=r[i][i+13]=92;
    // Set A and B both to 8 to use later on:
    A=B=8;}
  // If the scores aren't equal:
  else{
    // Fill the four appropriate cells for the sides of the scales with '*':
    r[5][i=A<B?0:13]=r[5][i+7]=r[9][13-i]=r[9][20-i]=42;
    // Fill the appropriate four cells of the balance-bar with '-':
    for(i=5;i-->1;r[i][A>B?18-i*3:2+i*3]=42)r[i][A>B?17-i*3:3+i*3]=45;
    // Fill the appropriate cells of the scales with '-':
    for(i=0;++i<20;)r[i>13?A>B?5:9:A>B?9:5][i>13|i<7?i:1]=45;
    // Fill the appropriate cells of the robes with '/' and '\':
    for(i=9;i-->1;r[i][i>4?A>B?8-i:21-i:A>B?17-i:4-i]=47)r[i][i>4?A>B?i-1:i+12:A>B?i+16:i+3]=92;
    // Fill the four appropriate cells of the balance-bar with '_',
    // and set A and B to 9 and 5 depending on which score is higher:
    A=(A>B?r[i=0][16]=r[1][13]=r[3][7]=r[4][4]=95:(r[0][i=4]=r[1][7]=r[3][13]=r[4][16]=95));A=9-i;B=5+i;}
  // Call a separated method to fill the cells above the scales with the input-characters:
  c(r,a,A,7);c(r,b,B,20);
  // And finally return the resulting character-matrix:
  return r;};

// Separated method to calculate the score of the given String:
int s(String s){
  // Initially start the score-sum at 0:
  int r=0;
  // Loop over the characters of the given String:
  for(int i:s.getBytes())
    // Increase the sum by:
    r+=
      // 4 for uppercase letters:
      i>64&i<91?4
      // 2 for lowercase letters:
      :i>96&i<123?2
      // 3 for any other character:
      :3;
  // And return the resulting sum:
  return r;}

// Separated method to draw the strings on top of the scales:
void c(char[][]r,String s,int p,int q){
  // Keep a counter so we know when we're done drawing the given String:
  for(int c=0,
  // Loop over the appropriate rows bottom to top:
  i=p,j;i-->p-5;)
    // Inner loop over the appropriate cells of this row left to right,
    for(j=q;j-->q-6
    // as long as we're not done yet with the input-String:
        &c<s.length();)
      // And fill that appropriate cell with the next character in line of the given String:
      r[i][j]=s.charAt(c++);}
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.