Bir sözcüğü bir alfabe ızgarasına sığdırma


55

Bugün daha önce gördüm bir meme esinlenerek .

Meydan açıklaması

Sonsuz bir alfabe ızgarası düşünün:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
...

Bir kelime alın ( CODEGOLFbu örnekte) ve kullanılmayan harfleri bir boşlukla değiştirerek ve sonsuz kılavuzun sonundaki harfleri tamamen kaldırarak kılavuzun bir sırasını yapın:

  C           O           
   DE G       O           
           L              
     F

Örnekler

STACKEXCHANGE

                  ST      
A C       K               
    E                  X  
  C    H                  
A            N            
      G                   
    E

ZYXWVUTSRQPONMLKJIHGFEDCBA

                         Z
                        Y 
                       X  
                      W   
                     V    
                    U     
                   T      
                  S       
                 R        
                Q         
               P          
              O           
             N            
            M             
           L              
          K               
         J                
        I                 
       H                  
      G                   
     F                    
    E                     
   D                      
  C                       
 B                        
A

F

     F

ANTIDISESTABLISHMENTARIANISM

A            N     T      
        I                 
   D    I         S       
    E             ST      
AB         L              
        I         S       
       H    M             
    E        N     T      
A                R        
        I                 
A            N            
        I         S       
            M

notlar

  • İzleyen boşluklara izin verilir.
  • Son satırları boşluklarla doldurmanıza gerek yoktur . Örneğin, giriş ise ABC, sadece ABC23 sondaki boşluk olmadan çıkış yapabilirsiniz.
  • Girişin [A-Z]+regex ile eşleşeceğini varsayabilirsiniz .
  • Alternatif olarak, küçük harfli alfabe kullanabilirsiniz; bu durumda çıktı eşleşir [a-z]+.
  • Satırları ayırmak için yeni bir satır kullanmanız gerekir ( \n, \r\nveya eşdeğeri); bu, dizelerin listesi uygun bir çıktı biçimi değildir.
  • Bu bir mücadelesi, bu yüzden kodunuzu mümkün olduğunca kısa tutun!

Öncü yeni hatlara izin veriliyor mu?
Outgolfer Erik

@EriktheOutgolfer Elbette, ızgara yapısını bozmadığı sürece.
shooqie

Ölümcül olmayan bir hata programı durdurursa sorun olur mu?
Zacharý

@ Zacharý Bunun bazı baytları nasıl kurtarabileceğini görebildiğim halde çirkin olduğunu ve istenmeyen, gereksiz çıktılar ürettiğini düşünüyorum. Yani hayır EDIT: Programınızı ölümcül olmayan bir şekilde bir çıkış kodundan veya istisna yığın izini veya stderr'e benzer bir şeyi basmayacak bir şeyden çıkış yapmazsanız.
shooqie

7
Önerilen test durumu: BALLOON(aynı olan iki bitişik karakter).
Kevin Cruijssen

Yanıtlar:


10

Kabuğu , 15 bayt

TṪS`?' €…"AZ"ġ>

Çevrimiçi deneyin!

açıklama

TṪS`?' €…"AZ"ġ>  Implicit input, e.g. "HELLO"
             ġ>  Split into strictly increasing substrings: x = ["H","EL","LO"]
        …"AZ"    The uppercase alphabet (technically, the string "AZ" rangified).
 Ṫ               Outer product of the alphabet and x
  S`?' €         using this function:
                   Arguments: character, say c = 'L', and string, say s = "EL".
       €           1-based index of c in s, or 0 if not found: 2
  S`?'             If this is truthy, then c, else a space: 'L'
                 This gives, for each letter c of the alphabet,
                 a string of the same length as x,
                 containing c for those substrings that contain c,
                 and a space for others.
T                Transpose, implicitly print separated by newlines.

7

Java 10, 161 159 152 bayt

s->{var x="";int p=0;for(var c:s)x+=p<(p=c)?c:";"+c;for(var y:x.split(";"))System.out.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ".replaceAll("[^"+y+"]"," "));}

@Nevay sayesinde -2 bayt .
-7 bir bayt döndürmek yerine doğrudan bayt yazdırmak ve Java 10'a çevirmek.

Açıklama: "

Burada dene.

s->{                      // Method with String parameter and no return-type
  var x="";               //  Temp-String
  int p=0;                //  Previous character (as integer), starting at 0
  for(var c:s)            //  Loop (1) over the characters of the input
    x+=p<(p=c)?           //   If the current character is later in the alphabet
                          //   (replace previous `p` with current `c` afterwards)
        c                 //    Append the current character to Temp-String `x`
       :                  //   Else:
        ";"+c;            //    Append a delimiter ";" + this character to Temp-String `x`
  for(var y:x.split(";")) //  Loop (2) over the String-parts
    System.out.println(   //   Print, with trailing new-line:
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                          //    Take the alphabet,
        .replaceAll("[^"+y+"]"," "));}
                          //    and replace all letters not in the String-part with a space

Yöntemin ilk kısmı, giriş kelimesini bir ayırıcıya sahip bölümlere ayırır.
Örneğin: CODEGOLFCO;DEGO;L;Fveya BALLOONB;AL;LO;O;N.

İkinci parça bu parçaların üzerinden geçer ve [^...]bir boşlukla eşleşmeyen her şeyin yerine regex'i kullanır .
Örneğin .replaceAll("[^CO]"," ")bırakır Cve Ove bir boşlukla her şeyi değiştirir.


1
Olmaz mıydı B;AL;LO;O;N?
NieDzejkob

1
-2 bayt: for(char c:s)x+=p<(p=c)?c:";"+c;.
Nevay




4

JavaScript (ES6), 79

Düzenle Baştaki yeni satır kabul edildiğinde 2 bayt tasarruf edebilirim

s=>eval("for(o='',v=i=0;c=s.charCodeAt(i);v%=27)o+=v++?c-63-v?' ':s[i++]:`\n`")

1 bayt daha fazlası için küçük harf veya büyük harf girişini kabul edebilirim:

s=>eval("for(o='',v=i=0;c=s[i];v%=27)o+=v++?parseInt(c,36)-8-v?' ':s[i++]:`\n`")

Daha az golf oynadı

s=>{
  var i,o,c,v
  for(o = '', v = 1, i = 0; c = s.charCodeAt(i); v %= 27)
    o += v++ ? c-63-v ? ' ' : s[i++] : '\n'
  return o
}  

Ölçek

f=s=>eval("for(o='',v=i=0;c=s.charCodeAt(i);v%=27)o+=v++?c-63-v?' ':s[i++]:`\n`")

function update() {
  var i=I.value
  i=i.replace(/[^A-Z]/gi,'').toUpperCase()
  O.textContent=f(i)
}

update()
<input id=I value='BALLOON' oninput='update()' >
<pre id=O></pre>


\n-1 bayt için backticks içindeki değişmez bir newline ile değiştirebilirsiniz .
Justin Mariner

@JustinMariner hayır yapamam, eval içindeki çift alıntı içinde değil
edc65

Ah doğru, bu utanç verici. Benim hatam.
Justin Mariner

4

MATL , 24 23 bayt

''jt8+t1)wdh26X\Ys(26e!

Küçük harf kullanır.

MATL Online'da deneyin !

açıklama

''     % Push empty string
jt     % Push input string. Duplicate
8+     % Add 8 to each char (ASCII code). This transforms 'a' 105,
       % 'b' into 106, which modulo 26 correspond to 1, 2 etc
t1)    % Duplicate. Get first entry
wd     % Swap. COnsecutive differences.
h      % Concatenate horizontally
26X\   % 1-based modulo 26. This gives a result from 1 to 26
Ys     % Cumulative sum
(      % Write values (converted into chars) at specified positions
       % of the initially empty string
26e    % Reshape into a 26-row char matrix, padding with char 0
!      % Transpose. Implicitly display. Char 0 is shown as space

4

Japt , 18 16 bayt

@Shaggy sayesinde -2 bayt

;ò¨ £B®kX ?S:Z
·

Sadece büyük harf girişi.

Çevrimiçi deneyin!

açıklama

;

BBüyük harf alfabe olan alternatif değişkenlere geçin .

ò¨

Giriş dizesini, birincinin ¨, ikinciye ( ) eşit veya daha büyük olduğu karakterler arasında bölün .

£

Her bölümü X, geçerli bölümün bulunduğu işlevle eşleyin.

ZGeçerli harfle, büyük harfli alfabedeki her karakteri aşağıdakine eşleyin .

kX

Geçerli bölümdeki tüm harfleri geçerli harften kaldırın. Geçerli harf geçerli bölümde bulunuyorsa, bu boş bir dizeyle sonuçlanır.

?S:Z

Bu truthy ise (boş bir dize değil), bir boşluk ( S) koyun , aksi takdirde geçerli harfi döndürün .

·

Önceki satırın sonucunu yeni satırlarla birleştirin ve sonucu yazdırın.


10 bayt r"[^{Z}]"Sbiraz saçma gibi görünüyor, ama ben de ... daha iyi yol bulamıyorum
ETHproductions



@Shaggy İyi düşün kX!
Justin Mariner

Aslında iki bayttan tasarruf kX ?S:Zetmek oX ªSiçin değişiklik yapabileceğinizi düşünüyorum
ETHproductions 5:17


3

Jöle , 19 bayt

<2\¬0;œṗfȯ⁶$¥€@€ØAY

Çevrimiçi deneyin!


OI<1®;-> >2\0;bir bayt kurtarmak için (aslında >2\0;œṗµØAf€ȯ€⁶µ€Yben de ayrıştırmayı daha kolay buluyorum, 18 de yaptım )
Jonathan Allan

@JonathanAllan Bunun bir BALLOONşey için başarısız olacağını düşünüyorum .
Outgolfer Erik,

Haklısın, evet - yani bunun gibi bir şeyden başka bir bayt gerektirecekti <2\1;¬; Oh iyi.
Jonathan Allan

@JonathanAllan Her neyse, fikrimi cevabımda uygulayacağım ... bitti.
Outgolfer Erik,


3

Mathematica, 101 bayt

StringRiffle[
  Alphabet[]/.#->" "&/@
   (Except[#|##,_String]&@@@
     Split[Characters@#,#==1&@*Order]),"
",""]&

Splitbitişik harflerle karşılaştırarak kesinlikle artan harf dizileri içine girdi Order. Eğer Order[x,y] == 1, o zaman alfabede xönce gelir yve böylece aynı satırda görünebilir.

Her harf sırası Exceptiçin, bu harflerin dizeleriyle eşleşecek bir desen oluşturun ; #|##için bir steno Alternatives. Desenle Alphabeteşleşen harflerin yerine boşluk koyun.


Ara adımların gösterimi:

"codegolf";
Split[Characters@#,#==1&@*Order]  &@%
Except[#|##,_String]&@@@         #&@%
Alphabet[]/.#->" "&/@               %
{{"c", "o"}, {"d", "e", "g", "o"}, {"l"}, {"f"}}

{Except["c" | "c" | "o", _String], 
 Except["d" | "d" | "e" | "g" | "o", _String], 
 Except["l" | "l", _String],
 Except["f" | "f", _String]}

{{" "," ","c"," "," "," "," "," "," "," "," "," "," "," ","o"," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," ","d","e"," ","g"," "," "," "," "," "," "," ","o"," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," "," "," "," "," "," "," "," "," ","l"," "," "," "," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," "," "," ","f"," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "}}

2

Golfscript, 22 21 bayt

Çevrimiçi deneyin!

-1 nyerleşik byte dikkatli bir şekilde yeniden tanımlanması sayesinde byte .

{.n>{}{'
'\}if:n}%:n;

Açıklama (biraz farklı sürümde):

{.n>{}{"\n"\}if:n}%:n; # Full program
{                }%    # Go through every character in the string
 .n>         if        # If ASCII code is greater than previous...
                       # (n means newline by default, so 1st char guaranteed to fit)
    {}                 # Do nothing
      {"\n"\}          # Else, put newline before character
               :n      # Redefine n as the last used character
                   :n; # The stack contents are printed at end of execution
                       # Literally followed by the variable n, usually newline
                       # So because n is by now an ASCII code...
                       # ...redefine n as the new string, and empty the stack

2

Retina , 80 bayt

^
;¶
{`;.*
¶;ABCDEFGHIJKLMNOPQRSTUVWXYZ
¶¶
¶
)+`;(.*)(.)(.*¶)\2
$.1$* $2;$3
;.*

Çevrimiçi deneyin!

Her zaman tam olarak bir tane yeni satır var. Kod, bir parça gizlice alfabetik harfle birlikte bir işaretleyiciyle (noktalı virgül) hazırlar. Daha sonra işaretleyiciyi kelimenin ilk harfine kadar hareket ettirirken diğer tüm harfleri boşluklara aktarır. Ayrıca kelimenin ilk harfini kaldırır. Bu, kelimenin ilk harfi artık işaretleyiciden sonra gelinceye kadar tekrar eder. Sonra bu işaretleyiciyi ve alfabenin geri kalanını temizler ve onu yeni bir satırla ve alfabeyi tekrar bir işaretleyiciyle değiştirir. Bu, giriş kelimesi boşalana kadar tekrar etmeye devam eder, ardından son alfabeyi ve işaretleyiciyi temizleyerek istenen çıkışı bırakır.


2

05AB1E , 18 bayt

ćIgµ¶?AvDyÊið?ë¼?ć

Çevrimiçi deneyin!

ćSon öğe çıktıktan sonra yığında boş bir dize / liste bırakarak 05AB1E (özü 1) ile sorun oluştu . Bu çözüm olmasaydı 1-2 bayt daha kısa olurdu.

ćIgµ¶?AvDyÊið?ë¼?ć  Implicit input 
ć                   Extract the 1st char from the string
 Igµ                While counter != length of the string
    ¶?              Print a newline
      Av            For each letter of the lowercased alphabet
        DyÊ         Is the examined character different from the current letter?
           ið?      If true, then print a space

              ë¼?ć  Else increment the counter, print the letter and push
                    the next character of the string on the stack

Aslında, ð,"boşluk ve yeni satır yazdır" anlamına gelir.
Outgolfer Erik

Haklısın. Yeni bir satır yazdırmak için kod düzeltildi.
scottinet

2

Retina , 130 126 bayt

$
¶A
{-2=`
$'
}T`RL`_o`.$
+`(?<=(.)*)((.).*¶(?<-1>.)*(?(1)(?!)).+\3.*$)
 $2
(?<=(.)*)((.).*¶(?<-1>.)*(?<-1>\3.*$))
¶$2
}`¶.*$

Çevrimiçi deneyin! Düzenleme: @ MartinEnder's alfabe jeneratörü kullanarak 4 bayt kurtardı. Açıklama:

$
¶A
{-2=`
$'
}T`RL`_o`.$

Alfabeyi ekleyin.

+`(?<=(.)*)((.).*¶(?<-1>.)*(?(1)(?!)).+\3.*$)
 $2

Alfabedeki konumlarıyla mümkün olduğunca çok sayıda harfi hizalayın.

(?<=(.)*)((.).*¶(?<-1>.)*(?<-1>\3.*$))
¶$2

Hizalanamayan ilk harften önce yeni bir satır başlatın.

}`¶.*$

Alfabeyi silin, ancak yanlış hizalanmış harf bulunmayana kadar her şeyi tekrar yapın.


Bu, sonraki satırlarda harfleri hizalamak yerine yalnızca bir satır yazdırıyor gibi görünüyor.
Justin Mariner

@JustinMariner Kötü, benim son golf bir yazım hatası yaptım ve düzgün kontrol etmedim.
Neil

2

q / kdb + , 48 45 bayt

Çözüm:

-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:;

Çevrimiçi deneyin!

Not: Bağlantı, q / kdb + için TIO olmadığı için bu çözümün K (oK) bağlantı noktasına yapılır.

Örnekler:

q)-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:"STACKEXCHANGE";
                  ST
A C       K
    E                  X
  C    H
A            N
      G
    E

q)-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:"BALLOON";
 B
A          L
           L  O
              O
             N

Açıklama:

Q, sağdan sola doğru yorumlanır. Çözelti iki bölüme ayrılmıştır. İlk önce, sonraki karakterin akıma eşit veya daha küçük olduğu dizgeyi bölün:

"STACKEXCHANGE" -> "ST","ACK","EX","CH","AN","G","E"

Ardından 26 boşluktan oluşan bir dizge alın ve girişi alfabe içinde göründüğü endekslerde uygulayın ve stdout'a yazdırın.

"__________________________" -> __________________ST______

Yıkmak:

-1{@[26#" ";.Q.A?x;:;x]}each(0,where (<=':)x) cut x:; / ungolfed solution
-1                                                  ; / print to stdout, swallow return value
                                                  x:  / store input as variable x
                                              cut     / cut slices x at these indices
                            (               )         / do this together
                                     (<=':)x          / is current char less-or-equal (<=) than each previous (':)?
                               where                  / indices where this is true
                             0,                       / prepended with 0
                        each                          / take each item and apply function to it
  {                    }                              / lambda function with x as implicit input
   @[      ;      ; ; ]                               / apply[variable;indices;function;arguments]
     26#" "                                           / 26 take " " is "      "...
            .Q.A?x                                    / lookup x in the uppercase alphabet, returns indice(s)
                   :                                  / assignment
                     x                                / the input to apply to these indices

Notlar:

  • -3 byte değiştirilerek prev by K4 versiyonu

2

Powershell, 70 63 bayt

-7 bayt teşekkürler @Veskah

$args|%{if($_-le$p){$x;rv x}
$x=("$x"|% *ht($_-65))+($p=$_)}
$x

Çevrimiçi deneyin!

Açıklama:

Sıçrayan argümandaki her karakter için:

  • Geçerli karakterin bir kodu önceki karakterin bir koduna göre daha az veya eşdeğeri ( ) ise, çıktı dizesi $xve net $xdeğer ( Remove-Variablerv için diğer addır ) -le.
  • Boşlukları ve geçerli karakteri ekleyerek $xsaklayın $x. Ayrıca önceki bir karakter değerini yeniler.

Son çıktı $x.


1
Sıçrama kullanarak 63 Bayt . |% *htBazı baytları kurtarmak için kullanmaya çalıştım, ancak kırıldı gibi görünüyor.
Veskah



1

JavaScript (ES6), 87 bayt

f=([...s])=>s[0]?(g=i=>i>35?`
`+f(s):(i-parseInt(s[0],36)?" ":s.shift())+g(i+1))(10):""

Büyük harf veya küçük harf girişini kabul eder. Çıkış, giriş durumu ile eşleşir.

Testler


1

Haskell, 81 74 73 bayt

q@(w:y)!(x:z)|w==x=x:y!z|1<2=min ' 'x:q!z
x!_=x
a=['A'..'Z']++'\n':a
(!a)

Laikoni sayesinde 1 bayt kaydedildi !

Çevrimiçi deneyin.

Haskell Hugs optimizasyonları

  1. Hugs yorumlayıcısı(!cycle$['A'..'Z']++"\n") yerine şunu yaparak bir bayt daha tasarruf etmeme izin veriyor : (!cycle(['A'..'Z']++"\n"))ancak GHC öncekileri sevmiyor . (Bu artık modası geçmiş; Laikoni zaten bu satırı 1 byte tasarruf edecek şekilde yeniden yazdı.)

  2. Görünüşe göre, Sarılmak da liste desen eşleştirici parantez gerektirmez, bu yüzden giden iki bayt kurtarabilecek: q@(w:y)!(x:z)için q@(w:y)!x:z.


İle bir bayt kaydedebilirsiniz a=['A'..'Z']++'\n':a;(!a). Hugs'in şu anda biraz daha gevşek kurallara sahip olduğu görülüyor.
Laikoni

@Laikoni Şimdilik Haskell'e bakıyorum ve aylardır beni şaşırtmıyor. Numarayı seviyorum a=...:a. Teşekkürler!
Cristian Lupascu

Farkında mısın bilmiyorum ama bahsetmeye değer olduğunu düşünüyorum. Hugs'un burada farklı olmasının nedeni, kullanıcı tanımlı operatörler için operatör önceliğinin ghc'den daha düşük olmasıdır.
Buğday Sihirbazı

@WheatWizard Farkında değildim. GHC'ye girdiğim hatayı verdiğimde, bu mantıklı geliyor.
Cristian Lupascu



1

Kömür , 15 bayt

Fθ«J⌕αι⁺ⅉ‹⌕αιⅈι

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

 θ              Input string
F «             Loop over characters
     α     α    Uppercase letters predefined variable
      ι     ι   Current character
    ⌕     ⌕     Find index
             ⅈ  Current X co-ordinate
         ‹      Compare
        ⅉ       Current Y co-ordinate
       ⁺        Sum
   J            Jump to aboslute position
              ι Print current character


1

K (NGN / k) , 29 28 bayt

{{x@x?`c$65+!26}'(&~>':x)_x}

Çevrimiçi deneyin!

{ } argümanlı fonksiyon x

>':x Her karakter için, önceki karakterden daha mı büyük?

~ reddetmek

& nerede (hangi endekslerde) doğruyuz

( )_xxbu indeksleri kesmek , dizelerin listesini döndürmek

{ }' bu dizelerin her biri için

`c$65+!26

ingiliz alfabesi

x?her harfin ilk geçtiği dizinini bulmak xkullanımı, 0Nbulunmazsa eğer (özel bir "boş" değeri)

x@xbununla indeks ; 0Ndönüşleri ile indeksleme " ", böylece bizden gelen harfleri xalfabetik konumlarında ve her şeyde boşluk olan bir uzunluk-26 dizge alırız.


1

R , 129 117 bayt

function(s){z={}
y=diff(x<-utf8ToInt(s)-64)
z[diffinv(y+26*(y<0))+x[1]]=LETTERS[x]
z[is.na(z)]=" "
write(z,1,26,,"")}

Çevrimiçi deneyin!

Açıklama (asılsız):

function(s){
 z <- c()                  # initialize an empty vector
 x <- utf8ToInt(s)-64      # map to char code, map to range 1:26
 y <- diff(x)              # successive differences of x
 idx <- cumsum(c(          # indices into z: cumulative sum of:
    x[1],                  # first element of x
    ifelse(y<=0,y+26,y)))  # vectorized if: maps non-positive values to themselves + 26, positives to themselves
 z[idx] <- LETTERS[x]      # put letters at indices
 z[is.na(z)] <- " "        # replace NA with space
 write(z,"",26,,"")        # write z as a matrix to STDOUT ("") with 26 columns and empty separator.

1

R , 95 bayt

Harfle kelimenin karşısındaki konumda bir harfle karşılaşırsanız, aksi halde bir boşluk bırakıyorsanız, bir sayaç 1 ile ilerlerken sadece üst harf alfabesini tekrar tekrar çalıştırın.

function(s)while(F>""){for(l in LETTERS)cat("if"((F=substr(s,T,T))==l,{T=T+1;l}," "));cat("
")}

Çevrimiçi deneyin!


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.