Masukkan sebuah kata ke dalam kotak alfabet


55

Terinspirasi oleh meme yang saya lihat sebelumnya hari ini.

Deskripsi tantangan

Pertimbangkan kotak alfabet tak terbatas:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
...

Ambil satu kata ( CODEGOLFdalam contoh ini) dan jadikan itu sebagai kisi-kisi, ganti huruf yang tidak terpakai dengan spasi dan hilangkan huruf di ujung kisi yang tak terbatas sama sekali:

  C           O           
   DE G       O           
           L              
     F

Contohnya

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

Catatan

  • Ruang putih trailing diperbolehkan.
  • Anda tidak perlu mengisi baris terakhir dengan spasi. Misalnya, jika inputnya adalah ABC, Anda dapat menghasilkan hanya ABCtanpa 23 spasi tambahan.
  • Anda mungkin menganggap input akan cocok dengan [A-Z]+regex.
  • Atau, Anda dapat menggunakan huruf kecil, di mana output kasus akan cocok [a-z]+.
  • Anda harus menggunakan baris baru ( \n, \r\natau setara) untuk memisahkan baris, yaitu daftar string bukan format output yang tepat.
  • Ini adalah tantangan , jadi buat kode Anda sesingkat mungkin!

Apakah baris baru terkemuka diizinkan?
Erik the Outgolfer

@EriktheOutgolfer Tentu, asalkan tidak mengacaukan struktur grid.
shooqie

Apakah tidak apa-apa jika kesalahan tidak fatal menghentikan program?
Zacharý

@ Zacharý Walaupun saya bisa melihat bagaimana itu bisa menghemat beberapa byte, saya pikir itu jelek dan menghasilkan output yang berlebihan dan tidak diinginkan. Jadi tidak. EDIT: Kecuali jika Anda dapat membuat program Anda non-fatal keluar melalui kode keluar atau sesuatu yang tidak akan mencetak jejak stack pengecualian atau sesuatu yang mirip dengan stderr.
shooqie

7
Kasing uji yang disarankan: BALLOON(dua karakter yang berdekatan yang sama).
Kevin Cruijssen

Jawaban:


10

Sekam , 15 byte

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

Cobalah online!

Penjelasan

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 byte

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+"]"," "));}

-2 byte berkat @Nevay .
-7 byte mencetak langsung alih-alih mengembalikan sebuah String, dan mengkonversi ke Java 10.

Penjelasan: "

Coba di sini.

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

Bagian pertama dari metode ini membagi kata input menjadi beberapa bagian dengan pembatas.
Misalnya: CODEGOLFCO;DEGO;L;Fatau BALLOONB;AL;LO;O;N.

Bagian kedua loop atas bagian-bagian ini, dan menggunakan regex [^...]untuk mengganti semua yang tidak cocok dengan spasi.
Misalnya .replaceAll("[^CO]"," ")meninggalkan C, dan O, dan mengganti yang lainnya dengan spasi.


1
Bukan B;AL;LO;O;N?
NieDzejkob

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




4

JavaScript (ES6), 79

Sunting Ketika baris baru diterima, saya dapat menyimpan 2 byte

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

Untuk 1 byte lebih, saya dapat menerima input huruf kecil atau besar:

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

Kurang golf

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
}  

Uji

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>


Anda dapat mengganti \ndengan baris baru literal di dalam backticks untuk -1 byte.
Justin Mariner

@JustinMariner tidak, saya tidak bisa, tidak di dalam kutipan ganda di eval
edc65

Oh benar, itu memalukan. Salahku.
Justin Mariner

4

MATL , 24 23 byte

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

Menggunakan huruf kecil.

Cobalah di MATL Online!

Penjelasan

''     % 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 byte

-2 byte terima kasih kepada @Shaggy

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

Input huruf besar saja.

Cobalah online!

Penjelasan

;

Beralih ke variabel alternatif, di mana Balfabet huruf besar.

ò¨

Pisahkan string input antara karakter di mana yang pertama lebih besar atau sama dengan ( ¨) yang kedua.

£

Memetakan setiap partisi berdasarkan fungsi, di mana Xpartisi saat ini.

Petakan setiap karakter dalam alfabet huruf besar dengan yang berikut, dengan Zmenjadi huruf saat ini.

kX

Hapus semua huruf di partisi saat ini dari surat saat ini. Jika huruf saat ini terkandung dalam partisi saat ini, ini menghasilkan string kosong.

?S:Z

Jika itu benar (bukan string kosong), kembalikan spasi ( S), jika tidak kembalikan surat saat ini.

·

Gabungkan hasil dari baris sebelumnya dengan baris baru dan cetak hasilnya.


10 byte r"[^{Z}]"Ssepertinya agak konyol, tapi aku juga tidak bisa menemukan cara yang lebih baik ...
ETHproduksi



@Shaggy Pemikiran yang bagus kX!
Justin Mariner

Sebenarnya saya pikir Anda dapat mengubah kX ?S:Zuntuk oX ªSmenyelamatkan dua byte
ETHproductions


3

Jelly , 19 byte

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

Cobalah online!


OI<1®;-> >2\0;untuk menyimpan satu byte (sebenarnya saya lakukan >2\0;œṗµØAf€ȯ€⁶µ€Yuntuk 18 juga, yang menurut saya lebih mudah diurai)
Jonathan Allan

@ Jonathan Allan Saya pikir itu akan gagal BALLOONatau sesuatu.
Erik the Outgolfer

Anda benar, ya - jadi diperlukan byte lain dengan sesuatu seperti <2\1;¬; Baiklah.
Jonathan Allan

@ JonathanAllan Anyways, saya akan menerapkan ide Anda dalam jawaban saya ... selesai.
Erik the Outgolfer

3

C (gcc), 91 63 byte

-28 Terima kasih hanya untuk ASCII

_;f(char*s){for(_=64;*s;)putchar(++_>90?_=64,10:*s^_?32:*s++);}

Cobalah online!


Sebelumnya:

i,j;f(char*s){while(s[i]){for(j=65;j<91;j++)s[i]==j?putchar(s[i++]):printf(" ");puts("");}}

Ya, ada solusi yang lebih pendek, tetapi saya perhatikan setelah saya menulis yang ini ... Cobalah online!


82 byte , 80 jika memimpin baris baru diizinkan
ASCII-hanya



3

Mathematica, 101 byte

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

Splitmasukan ke dalam urutan surat yang meningkat secara ketat, membandingkan huruf yang berdekatan dengan Order. Jika Order[x,y] == 1, maka xmendahului ydalam alfabet dan dengan demikian dapat muncul pada baris yang sama.

Untuk setiap urutan huruf, buat pola yang cocok dengan string Exceptuntuk huruf-huruf itu; #|##adalah singkatan untuk Alternatives. Ganti surat dariAlphabet yang cocok dengan pola dengan spasi.


Ilustrasi langkah menengah:

"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 byte

Cobalah online!

-1 byte berkat redefining akhir yang cermat dari nbuilt-in.

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

Penjelasan (dengan versi yang sedikit berbeda):

{.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 byte

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

Cobalah online!

Selalu ada persis satu baris baru terkemuka. Kode agak kikuk menambahkan kata dengan alfabet bersama dengan penanda (titik koma). Kemudian memindahkan penanda ke huruf pertama dari kata itu, sambil mengubah semua huruf lainnya masuk ke spasi. Itu juga menghapus huruf pertama dari kata itu. Itu mengulangi ini sampai huruf pertama kata tidak lagi setelah penanda. Kemudian menghapus penanda itu dan sisa alfabet, dan menggantinya dengan baris baru dan alfabet dengan penanda lagi. Itu terus mengulangi ini sampai kata input kosong, lalu itu membersihkan alfabet dan penanda terakhir, meninggalkan output yang diinginkan.


2

05AB1E , 18 byte

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

Cobalah online!

Mendapat masalah dengan 05AB1E ć(ekstrak 1) meninggalkan string / daftar kosong di tumpukan setelah elemen terakhir diekstraksi. Solusi ini akan lebih pendek 1-2 byte jika bukan karena itu.

ć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

Sebenarnya, ð,berarti "cetak spasi dan baris baru".
Erik the Outgolfer

Kamu benar. Memperbaiki kode untuk benar-benar mencetak baris baru.
scottinet

2

Retina , 130 126 byte

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

Cobalah online! Sunting: Disimpan 4 byte dengan menggunakan alfabet generator @ MartinEnder. Penjelasan:

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

Tambahkan alfabet.

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

Sejajarkan huruf sebanyak mungkin dengan posisinya di alfabet.

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

Mulai baris baru sebelum huruf pertama yang tidak dapat disejajarkan.

}`¶.*$

Hapus alfabet, tetapi lakukan semuanya lagi sampai tidak ada huruf yang tidak selaras.


Ini tampaknya hanya mencetak satu baris, bukan menyelaraskan huruf pada baris berikutnya.
Justin Mariner

@JustinMariner Saya salah, saya membuat kesalahan ketik di golf terakhir saya dan gagal memeriksanya dengan benar.
Neil

2

q / kdb + , 48 45 bytes

Larutan:

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

Cobalah online!

Catatan: Tautan ke port K (oK) dari solusi ini karena tidak ada TIO untuk q / kdb +.

Contoh:

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

Penjelasan:

Q ditafsirkan dari kanan ke kiri. Solusinya dibagi menjadi dua bagian. Pertama-tama pisahkan string di mana karakter berikutnya kurang dari atau sama dengan saat ini:

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

Kemudian ambil 26 string kosong, dan terapkan input itu pada indeks di mana input muncul dalam alfabet, dan cetak ke stdout.

"__________________________" -> __________________ST______

Kerusakan:

-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

Catatan:

  • -3 byte dengan mengganti prev dengan versi K4

2

Powershell, 70 63 byte

-7 byte terima kasih @Veskah

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

Cobalah online!

Penjelasan:

Untuk setiap karakter dalam argumen splatted:

  • Keluaran string $xdan $xnilai yang jelas ( rvalias untuk Remove-Variable ), jika kode karakter saat ini kurang atau setara ( -le) ke kode karakter sebelumnya.
  • Tambahkan spasi dan karakter saat ini ke $x, simpan ke $x. Juga menyegarkan nilai karakter sebelumnya.

Output terakhir $x.


1
63 Bytes menggunakan splatting . Mencoba menggunakan |% *htuntuk menyimpan beberapa byte tetapi sepertinya itu impas.
Veskah



1

JavaScript (ES6), 87 byte

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

Menerima input huruf besar atau kecil. Output cocok dengan kasus input.

Tes


1

Haskell, 81 74 73 byte

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

Disimpan 1 byte berkat Laikoni !

Cobalah online.

Optimalisasi Haskell Hugs

  1. Interpreter Hugs memungkinkan saya untuk menyimpan satu byte lagi dengan melakukan (!cycle$['A'..'Z']++"\n")alih - alih :,(!cycle(['A'..'Z']++"\n")) tetapi GHC tidak menyukai yang pertama . (Ini sekarang sudah usang; Laikoni sudah menulis ulang baris itu dengan cara yang menghemat 1 byte.)

  2. Rupanya, Hugs juga tidak memerlukan tanda kurung di sekitar pencocokan pola daftar, jadi saya bisa menghemat dua byte lagi dari: q@(w:y)!(x:z)ke q@(w:y)!x:z.


Anda dapat menyimpan byte dengan a=['A'..'Z']++'\n':a;(!a). Menarik untuk sekarang bahwa Pelukan tampaknya memiliki aturan yang agak longgar.
Laikoni

@Laikoni Saya melihat Haskell selama berbulan-bulan sekarang dan itu tidak berhenti membuat saya takjub. Saya suka a=...:atriknya. Terima kasih!
Cristian Lupascu

Saya tidak tahu apakah Anda mengetahui hal ini tetapi saya pikir ini layak disebut. Alasan Hugs berbeda di sini adalah bahwa ada prioritas operator yang lebih rendah untuk operator yang ditentukan pengguna daripada di ghc.
Wheat Wizard

@WheatWizard saya tidak sadar. Ini masuk akal, mengingat kesalahan yang saya dapatkan di GHC.
Cristian Lupascu



1

Arang , 15 byte

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

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

 θ              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 byte

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

Cobalah online!

{ } berfungsi dengan argumen x

>':x untuk setiap karakter, apakah ini lebih besar dari karakter sebelumnya?

~ meniadakan

& di mana (di mana indeks) kita benar

( )_xpotong xpada indeks tersebut, kembalikan daftar string

{ }' untuk masing-masing string tersebut

`c$65+!26

alfabet bahasa Inggris

x?cari indeks kemunculan pertama setiap huruf dalam x, gunakan 0N(nilai "null" khusus) jika tidak ditemukan

x@indeks xdengan itu; pengindeksan dengan 0Npengembalian " ", jadi kami mendapatkan string panjang-26 di mana huruf-huruf dari xberada pada posisi alfabet dan yang lainnya adalah spasi


1

R , 129 117 byte

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,,"")}

Cobalah online!

Penjelasan (ungolfed):

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 byte

Jalankan alfabet huruf besar berulang kali sambil memajukan penghitung dengan 1 jika Anda menjumpai huruf di posisi berlawanan kata dan mencetak huruf, spasi sebaliknya.

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

Cobalah online!


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.