Üçgenlik programını geçerli kılma


19

Üçlü ilişkinin-Triangulaer tarafından geliştirilen yeni bir esolang olan Sn Xcoder kod yapısı çok özel bir desen takip etmelidir:

  • nKod satırı için, 2n-1üzerinde programın tam olarak karakterleri olmalıdır . Bu, üçgen / piramit şekline neden olur; ilk satırın yalnızca bir karakteri vardır ve geri kalanı 2'lik artışlarla artar.
  • Her satır .sol ve sağda s ile doldurulmalıdır , böylece karakterler satırlarında ortalanır ve tüm satırlar aynı uzunlukta doldurulur. Eğer lprogram satır sayısı olarak tanımlanır, program, her bir satır içinde bir uzunluğa sahip olmalıdır2 * l - 1

Örneğin, soldaki program geçerli, ancak sağdaki program geçerli değil:

 Valid    |  Invalid  
          |
...A...   |  ABCDE
..BCD..   |  FGH
.EFGHI.   |  IJKLMN
JKLMNOP   |  OPQRS

Geçerli yapıda belirtildiğinde, ad açık hale gelir.

Görev

Göreviniz, Üçgenlik kodunu temsil eden ve yukarıda açıklandığı gibi geçerli koda dönüştürülen çıktı olarak tek bir satır dizesi almaktır.

I / O için özellikler:

  • Giriş yalnızca aralıktaki karakterleri içerecektir 0x20 - 0x7e
  • Girişin uzunluğu her zaman kare bir sayı olacaktır ve bu nedenle iyi bir şekilde doldurulabilir.
  • Çıkış dolgusu için noktalar kullanmalı, başka bir şey kullanmamalısınız.

Herhangi bir yoluyla giriş ve çıkış olabilir olarak kabul edilebilir bir yöntem. Bu bir yani bayt kısa kod kazanır!

Test senaryoları

input
----
output

g
----
g

PcSa
----
.P.
cSa

DfJ0vCq7G
----
..D..
.fJ0.
vCq7G

7xsB8a1Oqw5fhHX0
----
...7...
..xsB..
.8a1Oq.
w5fhHX0

QNYATbkX2sKZ6IuOmofwhgaef
----
....Q....
...NYA...
..TbkX2..
.sKZ6IuO.
mofwhgaef

ABCDEF"$%& G8"F@
----
...A...
..BCD..
.EF"$%.
& G8"F@

ab.c
----
.a.
b.c

Üçgenliği bilenler için, son test durumundan dizelerin ele alınması gerekmediğini fark edeceksiniz



13
Bunun muhtemelen nafile olduğunu anlıyorum, ama aşağı vekil oylarını açıklamak ister mi? Yine de yapabildiğim kadarıyla mücadeleyi geliştirmek isterim.
caird coinheringaahing

Baştaki veya sondaki yeni satırlar kabul edilebilir mi?
Arnauld

@ Arnauld Evet, önde gelen ve arkadaki boş alan mükemmel.
caird coinheringaahing

Bir satır listesi iyi mi?
Bay Xcoder

Yanıtlar:


19

Üçgenlik , 127 bayt

.......).......
......2)1......
...../)IL^.....
....f)rMD@_....
...)2)1/)IL^...
..f+`"'.'*"+E..
.DWReD)2s^)Its.
D+@sh+s+})10cJ.

Çevrimiçi deneyin!

açıklama

Doldurmayı oluşturan karakterleri kaldırarak, aşağıdaki programı alırız:

)2)1/)IL^f)rMD@_)2)1/)IL^f+`"'.'*"+EDWReD)2s^)ItsD+@sh+s+})10cJ

... Hangisi oldukça uzun, değil mi? Hadi parçalara ayıralım.

Tamsayılar oluşturma [0… √len (giriş))

)2)1/)IL^f)r – Subprogram #1.
)            – Creates a new stack entry, equal to 0. This must precede any integer
               literal, because each character in '0123456789' isn't parsed on its
               own as a literal, but rather they are commands which multiply the ToS
               by 10 and add the value of their digit equivalent. 
 2           – ToS * 10 + 2 = 2.           || STACK: [2]
  )1         – The literal 1.              || STACK: [2, 1]
    /        – Division.                   || STACK: [1 / 2] = [0.5]
     )I      – Get the input at index 0.   || STACK: [0.5, input]
       L     – Length.                     || STACK: [0.5, len(input)]
        ^    – Exponentiation.             || STACK: [len(input) ** 0.5]
         f   – Trim decimals.              || STACK: [int(len(input) ** 0.5)] 
          )r – Create the list [0 .. ToS). || STACK: [[0 ... int(len(input) ** 0.5))]

Nokta oluşturma

MD@_)2)1/)IL^f+`"'.'*"+E – Subprogram #2.
MD                       – For each integer in the range, run some code on a separate
                           stack, preinitialised to two copies of the argument.
  @_                     – Increment and negate the ToS.
    )2)1/)IL^f           – The square root of the length of the input, again.
              +          – Add the two.
               `         – And cast the integer given to a string.
                "'.'*"+  – Prepends the literal "'.'*" to the string representation.
                       E – Evaluate as a Python expression (basically string repetition).

Öndeki karakterleri kırpma

DWReD)2s^)It – Subprogram #3.
D            – Duplicate the result of the expression above.
 W           – Wrap the whole intermediate stack to an array.
  Re         – Reverse the stack and dump the contents separately onto the stack.
    D        – Duplicate the result.
     )2      – Push the literal 2.
       s^    – Swap and perform exponentiation.
         )It – Push the input and trim the characters before that index.

Sondaki karakterleri kırpma

sD+@sh+s+ – Subprogram #4.
s         – Swap the top two elements on the stack.
 D+       – Double. Push twice and add.
   @      – Increment.
    sh    – Swap the top two elements and trim the characters after that index.
      +   – Append the first set of dots.
       s+ – And prepend the second set of dots.

Döngüyü sonlandırma ve güzel baskı

})10cJ – Subprogram #5.
}      – End the loop.
 )10   – Push the literal 10.
    c  – Convert from code-point to character (yields '\n').
     J – And join the result by newlines.

"." dilin kendileri tarafından zorunlu kılınmışsa?
JDL

@JDL Evet, program onlarsız düzgün çalışamaz, bu yüzden onları bayt sayısına dahil etmeliyim :-)
Bay Xcoder

Giriş uzunluğunun kare olacağından emin olarak "ondalık sayıları kırpmanız" gerekiyor mu? Ayrıca Jsonunda çubuk almak ve bir dizi satır çıktı gerekir. Bununla birlikte, bunun sizi bir şeyden kurtaracak mı bilmiyorum, son satırın sonuna .kalan alanı doldurmak için doldurulması gerekiyorsa .
Shaggy

1
@Shaggy 1) Evet, faralık float argümanlarını (hatta ile .0) kabul edemediği için gereklidir J.
Bay Xcoder

8

Japt , 15 14 10 bayt

Bir dizi satır çıkarır.

ò@°T¬v1Ãû.

Deneyin | Tüm test senaryolarını kontrol edin


explantion

ò@     Ã       :Partition at characters where the following function returns true
  °T           :  Increment T (initially 0)
    ¬          :  Square root
     v1        :  Divisible by 1?
               :(Or, in other words, split after every character with a 1-based index that's a perfect square)
        û.     :Centre pad each element with .s to the length of the longest element

Orijinal Çözüm

ʬÆsTT±X+°XÃû.

Dene

Ê                  :Length of input
 ¬                 :Square root
  Æ        à       :Range [0,ʬ) and pass each X through a function
   s               :  Slice input
    T              :    from index T, initially 0
     T±X+°X        :    to index T incremented by X plus X incremented
            û.     :Centre pad each element with .s to the length of the longest element

7

Kabuk , 15 bayt

Ṡzö`JR2tR'.ṡCİ1

Çevrimiçi deneyin!

açıklama

Ṡzö`JR2tR'.ṡCİ1  Implicit input, say s = "DfJ0vCq7G".
             İ1  List of odd positive integers: [1,3,5,7,..
            C    Cut s to those lengths: x = ["D","fJ0","vCq7G"]
           ṡ     Reversed indices of x: y = [3,2,1]
Ṡz               Zip x and y using this function:
                  Arguments are a string and a number, e.g. r = "fJ0" and n = 2.
        R'.       n copies of '.': ".."
       t          Drop first element: "."
     R2           Two copies of this: [".","."]
  ö`J             Join by r: ".fJ0."
                 Result is ["..D..",".fJ0.","vCq7G"]; implicitly print on separate lines.

7

05AB1E , 20 19 18 bayt

Magic Octopus Urn sayesinde bayt kurtardı

ā·<£õKRvy'.N×.ø}r»

Çevrimiçi deneyin!

açıklama

ā                    # push the list [1 ... len(input)]
 ·<                  # multiply each by 2 and decrement each, making a list of odd numbers
   £                 # split the input into chunks of these sizes
    õK               # remove empty strings
      R              # reverse list
       vy      }     # for each y in the list
             .ø      # surround it with
         '.N×        # "." (dot) repeated N times, where N is the current iteration index
                r    # reverse the stack
                 »   # join stack by newlines

ÅÉoranlar yardımcı olabilir mi?
Sihirli Ahtapot Urn

Gibi bir şey g;ÅÉ£Rvy'.N×.ø}r»? Ama bu doğru değil çünkü bu doğru değil lol.
Sihirli Ahtapot Urn

@MagicOctopusUrn: ÅÉalt satırın uzunluğunu 2 baytta bulabilirsek kesinlikle yardımcı olur. Yine de yapabilir miyiz bilmiyorum. Onu dahil etmenin başka bir yolu da olabilir.
Emigna

@MagicOctopusUrn: Kullandığım dışında daha önce bu aynı çözümü vardı )Ryerine r/: Hangi herhangi bayt tasarruf etmedi
Emigna

Ben sadece gerçekleştiği gibi yazdırmak için "döngü ters" bir yol bulmaya çalışıyordum, bu konuda hiçbir fikir olsa.
Sihirli Ahtapot Urn


5

Jöle ,  22  19 bayt

J²‘Ṭœṗ⁸Ṛz”.Zµṙ"JC$Ṛ

Karakter listelerinin (satırların) listesini döndüren monadik bir bağlantı

Çevrimiçi deneyin!

Nasıl?

J²‘Ṭœṗ⁸Ṛz”.Zµṙ"JC$Ṛ - Link: list of characters e.g. "DfJ0vCq7G"
J                   - range of length               [1,2,3,4,5,6,7,8,9]
 ²                  - square (vectorises)           [1,4,9,16,25,36,49,64,81]
  ‘                 - increment                     [2,5,10,17,26,37,50,65,82]
   Ṭ                - untruth (1s at those indices) [0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,...]
      ⁸             - chain's left argument         "DfJ0vCq7G"
    œṗ              - partition at indexes          ["D","fJ0","vCq7G"]
       Ṛ            - reverse                       ["vCq7G","fJ0","D"]
         ”.         - literal '.'                   '.'
        z           - transpose with filler         ["vfD","CJ.","q0.","7..","G.."]
           Z        - transpose                     ["vCq7G","fJ0..","D...."]
            µ       - start a new monadic chain
                 $  - last two links as a monad:
               J    -   range of length             [1,2,3]
                C   -   complement (vectorises)     [0,-1,-2]
              "     - zip with:
             ṙ      -   rotate left by              ["vCq7G",".fJ0.","..D.."]
                  Ṛ - reverse                       ["..D..",".fJ0.","vCq7G"]

5

JavaScript (ES7), 82 78 bayt

f=(s,k=1-s.length**.5*2,p='')=>s&&f(s.slice(0,k),k+2,p+'.')+`
`+p+s.slice(k)+p

Test senaryoları

Yorumlananlar

f = (                       // f = recursive function taking:
  s,                        //   s = input string
  k = 1 - s.length**.5 * 2, //   k = additive inverse of the length of the base
  p = ''                    //   p = padding string
) =>                        //
  s &&                      // if s is not empty:
    f(                      //   do a recursive call with:
      s.slice(0, k),        //     s without the last -k characters
      k + 2,                //     the updated base length (2 less characters)
      p + '.'               //     the updated padding string
    ) +                     //   end of recursive call()
    `\n` +                  //   append a line feed
    p +                     //   append the left padding string
    s.slice(k) +            //   append the last -k characters of s
    p                       //   append the right padding string

[minör] '/ n' sembolü üstündeki kod bloğu gerçek bir satır sonu oldu - :) netlik için onu kaçan düşünün
G0BLiN

@ G0BLiN Bu tam tersi: Bu , golf kodunda gerçek bir satır sonu, netlik için ungolfed sürümünde kaçan bir satır sonu ile değiştirildi. :)
Arnauld

Ha, şaka benim üzerimde, o zaman ... :-)
G0BLiN


2

MATL , 21 bayt

tnX^eRP&1ZvGyg(46y~(!

Çevrimiçi deneyin!

açıklama

Girişi 'DfJ0vCq7G'örnek olarak ele alalım. Yığın içeriği, üst öğe son olacak şekilde virgülle ayrılmış olarak gösterilir. 2B dizideki satırlar ayırıcı olarak noktalı virgül kullanır.

t      % Implicit input: string. Duplicate
       % STACK: 'DfJ0vCq7G',
                'DfJ0vCq7G'
nX^    % Number of elements. Square root
       % STACK: 'DfJ0vCq7G',
                3
e      % Reshape with that many rows (in column major order)
       % STACK: ['D0q';
                 'fv7';
                 'JCG']
R      % Upper triangular part: set elements below diagonal to char(0)
       % (displayed as space)
       % STACK: ['D0q';
                 ' v7';
                 '  G']
P      % Flip vertically
       % STACK: ['  G';
                 ' v7';
                 'D0q']
&1Zv   % Reflect vertically
       % STACK: ['  G';
                 ' v7';
                 'D0q';
                 ' v7';
                 '  G']
G      % Push input again
       % STACK: ['  G';
                 ' v7';
                 'D0q';
                 ' v7';
                 '  G'],
                'DfJ0vCq7G'
yg     % Duplicate from below and convert to logical. This gives true for
       % for nonzero chars (the entries where input chars will be written)
       % STACK: ['  G';
                 ' v7';
                 'D0q';
                 ' v7';
                 '  G'],
                'DfJ0vCq7G',
                [0 0 1;
                 0 1 1;
                 1 1 1;
                 0 1 1;
                 0 0 1]
(      % Assignment indexing: write values at those positions
       % STACK: ['  v';
                 ' fC';
                 'DJq';
                 ' 07';
                 '  G']
46     % Push 46, which is ASCII for '.'
       % STACK: ['  v';
                 ' fC';
                 'DJq';
                 ' 07';
                 '  G'],
                 46
y~     % Duplicate from below and apply logical negate. This gives true
       % for char(0) (the entries where '.' will be written)
       % STACK: ['  G';
                 ' v7';
                 'D0q';
                 ' v7';
                 '  G'],
                46
                [1 1 0;
                 1 0 0;
                 0 0 0;
                 1 0 0;
                 1 1 0]
(      % Assignment indexing: write value at those positions
       % STACK: ['..G';
                 '.v7';
                 'D0q';
                 '.v7';
                 '..G'],
!      % Transpose. Implicit display
       % STACK: ['..D..';
                 '.fJ0.';
                 'vCq7G']

2

Temiz , 107 94 89 88 bayt

import StdEnv
@s _[]=s
@s n r= @([['.':l]++['.']\\l<-s]++[take n r])(n+2)(drop n r)

@[]1

Çevrimiçi deneyin! Örnek kullanımı: @[]1 ['ABCDEF"$%& G8"F@'].



1

Perl, 56 52 bayt

içerir +3için-p

#!/usr/bin/perl -p
$_=("."x y///c**.5)=~s%.%$'@{[$&x/$`$`./g]}$'
%rg

STDIN'de girdi verin (prensip olarak son satırsonu olmadan, ancak bu yalnızca boş girdi için önemlidir)


1
PCG kurallarına göre -psadece 1 bayt
mik

@mik Yalnızca kod içermiyorsa '. Ancak bu kod yapar, bu nedenle normal #!satıra kıyasla 3 ekstra karakter gerektiren bir dosyaya (veya komut satırından kaçmaya) koyulması gerekir . Bu durumda o yüzden +3(normal kodu için ben gerçekten sadece saymak göreceksiniz +için p)
Ton Hospel

1

Kırmızı , 227203 bayt

f: func[s][l: to-integer(length? s)** 0.5
n: 0 foreach m parse s[collect[(r: []repeat i l[append r reduce['keep i * 2 - 1
charset[not{Я}]]])r]][v: copy""insert/dup v"."l - n: n + 1 print rejoin[v m v]]]

Çevrimiçi deneyin!

Ungolfed:

f: func[s][
l: to-integer (length? s) ** 0.5
n: 0
foreach m parse s [ 
    collect [
        (r: []
        repeat i l [ append r reduce [
            'keep i * 2 - 1 charset [ not{Я} ]]])
    r ]] 
    [v: copy ""
    insert/dup v "." l - n: n + 1
    print rejoin [v m v]]
]

1

Retina , 88 72 71 bayt

S1`
+m`^(.)+¶(?>(?<-1>.)+)..(?!¶)
$&¶
P^'.m`^.(?=(..)*)(?<-1>.)*
P'.`.+

Çevrimiçi deneyin! Düzenleme: @MartinEnder sayesinde 12 bayt kaydedildi. Açıklama:

S1`

Topu yuvarlamak için ilk karakteri kendi çizgisine ayırın.

+m`^(.)+¶(?>(?<-1>.)+)..(?!¶)
$&¶

Her satırı bir öncekinden iki karakter daha uzun kesin.

P^'.m`^.(?=(..)*)(?<-1>.)*

Her çizginin ilk yarısını etkili bir şekilde ortalayarak sol tarafa doldurun.

P'.`.+

Tüm çizgileri sağa doğru doldurun.


1

Kömür , 21 19 bayt

UB.F₂Lθ«P✂θXι²X⊕ι²↙

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Düzenleme: Kaydederek 2 bayt kaydetti SquareRoot. Açıklama:

UB.                 Set the background fill to `.`
      θ             (First) input
     L              Length
    ₂               Square root
   F   «            Loop over implicit range
            ι   ι   Current value
               ⊕    Incremented
             ²   ²  Literal 2
           X  X     Power
         ✂θ         Slice the (first) input string
        P           Print without moving the cursor
                  ↙ Move down left

: / Bu neredeyse çalışıyor ama Kömür biraz arabası gibi görünüyor. Sanırım bu işe yarıyor mu?
Yalnızca ASCII

@ Sadece ASCII ... bu kara büyü nedir?
Neil

Dolgu temel olarak boş baytları (yani hiçbir şeyin çizilmediği alan için kullanılan karakter) denetler, böylece boş baytlarla bir çokgen çizebilirsiniz (eğer doğru çalışıyorsa> _>) ve bunu doldurun. Açıkçası bu tam olarak tasarlanmamıştır, çünkü aslında herhangi bir nedenden dolayı
ASCII-sadece

Bu sonraki çekme düzgün çalışması gerekir
sadece ASCII sadece



0

Yakut , 73 66 bayt

->s{(1..z=s.size**0.5).map{|q|s[q*q-2*q+1...q*q].center 2*z-1,?.}}

Çevrimiçi deneyin!

-5 bayt: Dizeleri yazdırmak yerine döndürür

-2 bayt: zvaktinden önce yerinde beyan

Ungolfed:

->s{
  (1..z=s.size**0.5).map{|q|   # Map the range [1,sqrt(s.size)]
    s[q*q-2*q+1...q*q]         # To the relevant portion of s,
      .center 2*z-1, ?.        #   padded left and right with . characters
  }
}

Bir değişkeni bildirmek, r=q-1böylece s[r*r...q*q]tam olarak sıfır bayt kaydeder.

.centerElle doldurmak yerine kullanmak da sıfır bayt kazandırır, ancak daha iyi seviyorum.


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.