Anda mungkin tahu pertanyaan retoris tentang apakah gelas setengah penuh atau setengah kosong . Saya mulai bosan dengan kalimat itu, jadi saya memutuskan bahwa sudah waktunya untuk menghilangkan kebingungan tentang kepenuhan atau kekosongan gelas ini secara terprogram.
Tugas Anda adalah menulis sebuah program yang mengambil representasi seni ASCII dari kaca yang jelek dan menghasilkan seni ASCII dari gelas yang sesuai . Hal ini juga harus memutuskan apakah kaca adalah full
, mostly full
, mostly empty
atau empty
dan output ini juga (setiap 4 konstan, nilai output yang berbeda lakukan).
TL; DR
Input adalah seni ASCII dari gelas ( #
karakter) dan cairan ( a-z
) didistribusikan secara acak di dalam dan di luar kaca. Cairan di dalam gelas jatuh dan menumpuk di bagian bawahnya, cairan di luar itu akan dibuang. Keluarkan seni ASCII dari gelas setelah cairan mengendap di bagian bawah. Tentukan seberapa penuh gelas itu dan hasilkan juga.
Kacamata jelek dan bagus
Sebuah kaca pada umumnya adalah wadah yang terbuat dari #
karakter dengan bawah, dua dinding samping dan tidak ada atas.
- Kacamata yang valid tidak memiliki lubang di dalamnya. (Semua
#
karakter harus terhubung.) - Akan ada setidaknya dua
#
karakter di setiap baris input ASCII art, atau tidak ada. Tidak akan ada garis dengan tepat satu#
. - Baris teratas dari seni ASCII input akan selalu memiliki tepat dua
#
. - Kacamata yang valid memiliki tepat satu minimum lokal di dinding
#
karakter pembatasnya . Ini berarti cairan tidak bisa terjebak di suatu tempat. - Dinding pembatas gelas tidak akan memiliki maxima lokal.
- Tidak akan ada apapun di
#
bawah bagian bawah gelas. - Interior kaca akan selalu menjadi ruang yang terhubung .
- Mungkin ada spasi / baris terdepan dan baru pada input.
Contoh kacamata yang valid dan tidak valid:
VALID (possible input to your program):
# #
# #
####
# #
# #
# #
# #
# #
# #
##
# #
# #
### #
# #
####
# #
# #
# #
# #
# #
########
# #
# #
# ###
# ###
# ###
#####
INVALID (you won't get one of those as input to your program):
# #
# Has a hole.
####
# #
# # This is also considered a hole.
##
# #
# # Less than two # on a line.
#
## #
# # More than two # on the first line.
###
#
# # Less than two # on the first line.
###
# #
# # # More than one local minimum.
# # # # Liquid might get trapped.
### # #
###
# #
# #
#### Interior is not a connected space.
# #
# #
####
# #
# #######
# ### #
# ## # Has a local maximum.
# # #
# #
# #
######
# #
# #
# #
#####
# # <--- # below the bottom of the glass.
# #
# # # This is also a glass with a hole. The #'s aren't all connected.
# # #
# #
#######
Sebuah kaca jelek adalah kaca dengan cairan hanya melayang-layang di interior.
- Liquid diwakili oleh huruf kecil
a-z
. - Tidak akan ada cairan di atas
#
karakter baris pertama . Ini berarti bahwa itu tidak diperlukan untuk memungkinkan cairan jatuh ke gelas. - Mungkin ada cairan di luar gelas . Cairan ini akan dibuang ketika mengubah gelas jelek menjadi gelas yang bagus.
Contoh-contoh kacamata jelek :
# y b # i
x v#p q l# l
a # a zj # p g
g #ppcg c#
u # r n # r
##########
Discard Keep Discard
<-- There will never be liquid above the glass
# tz g#
#y abc # d
av z#ox s # l
c#y abth# b
#vg y rm# a
########
e a b c d <-- Discard this as well (not within interior)
Sebuah kaca bagus adalah kaca di mana semua cairan menumpuk di bagian bawah.
- Dari bawah ke atas, bagian dalam gelas yang bagus terdiri dari sejumlah garis yang sepenuhnya diisi dengan huruf, diikuti oleh paling banyak satu baris yang tidak sepenuhnya diisi dengan huruf, dan kemudian sejumlah garis yang kosong.
- Mungkin tidak ada cairan di luar bagian dalam gelas yang bagus.
Konversi gelas jelek menjadi gelas bagus
- Cairan di dalam gelas jatuh dan menumpuk di bagian bawah.
- Cairan di luar kaca akan dibuang.
- Saat mengubah gelas jelek menjadi gelas bagus, huruf-huruf yang tepat di dalamnya harus dilestarikan. Misalnya, jika kaca jelek memiliki tiga
a
di dalamnya, kaca yang bagus harus memiliki tigaa
juga. (Soda tidak tiba-tiba berubah menjadi air.) - Surat-surat di dalam gelas yang bagus tidak harus dipesan.
- Bentuk gelas harus dilestarikan. Tidak ada
#
karakter yang dapat ditambahkan atau dihapus. - Jumlah spasi spasial dan baris baru terkemuka / trailing diizinkan.
Menentukan kepenuhan gelas
- Gelas adalah
full
jika seluruh ruang interiornya diisi dengan huruf. - Itu
mostly full
jika 50% atau lebih dari ruang interior diisi. - Itu
mostly empty
jika kurang dari 50% dari ruang interior diisi. - Itu
empty
jika tidak ada huruf di gelas. - Mungkin ada sejumlah baris dan ruang tambahan baru antara kaca seni ASCII dan output kepenuhan.
- Program ini dapat menampilkan nilai yang berbeda (tetapi konstan!) Untuk 4 level kepenuhan gelas, tidak harus mencetak string yang tepat di atas. Silakan tentukan nilai mana yang mewakili tingkat kepenuhan mana.
Contoh I / O
Example 1 input:
# y b # i
x v#p q l# l
a # a zj # p g
g #ppcg c#
u # r n # r
##########
Example 1 output:
# #
# #
# #
#ppcglqb #
#yprazjnc#
##########
mostly empty
Example 2 input:
# tz g#
#y abc # d
av z#ox s # l
c#y abth# b
#vg y rm# a
########
e a b c d
Example 2 output:
# #
# bc #
#oxysa#
#ygabth#
#vgtyzrm#
########
mostly full
Example 3 input:
# #
# g # f
###ih # d
a c # # e
b ####
Example 3 output:
# #
# #
### g#
#hi#
####
mostly empty
Example 4 input:
#ab#
#cd#
####
Example 4 output:
#cb#
#da#
####
full
Example 5 input:
# # h
# #
a # # g
b# # f
c # #
# # e
d ##
Example 5 output:
# #
# #
# #
# #
# #
# #
##
empty
Example 6 input:
# b az#
#y s ###
###### t
l u
Example 6 output:
# z #
#ybsa###
######
mostly full
Example 7 input:
# # g
# b #f
# c###
#da ### i
# e###
##### h
Example 7 output:
# #
# #
# ###
#de ###
#abc###
#####
mostly empty
Lain-lain
- Ini adalah kode golf sehingga jawaban terpendek menang.
- Jika memungkinkan, harap berikan tautan ke juru bahasa online yang dapat digunakan untuk menjalankan program Anda pada contoh input yang disediakan, misalnya tio.run
sumber
Jawaban:
Retina , 56 byte
Cobalah online!
Pengkodean keluaran adalah
0\n0
untuk penuh,0\n1
untuk kosong,1\n0
untuk sebagian besar penuh dan1\n1
sebagian besar kosong (dengan kata lain, bit pertama menunjukkan "sebagian besar" dan bit kedua menunjukkan "kosong").Penjelasan
Kita mulai dengan mengubah semua ruang dan huruf di luar kaca menjadi
!
. Ini dilakukan dengan mencocokkan baris-awal hingga yang pertama#
atau dengan mencocokkan akhir-baris yang tidak mengandung a#
dan menerjemahkan semua spasi dan huruf dalam pertandingan tersebut.Sortir semua spasi dan huruf. Karena huruf memiliki titik kode yang lebih tinggi daripada spasi, ini mengurutkan semua huruf hingga akhir, yang berarti bagian bawah kaca. Ini juga terjadi untuk mengurutkan surat-surat di antara mereka sendiri, tetapi urutan surat-surat dalam hasilnya tidak relevan.
Dry run: cetak hasil penggantian semua
!
dengan spasi, tetapi tidak benar-benar menerapkan perubahan ini ke string yang berfungsi. Ini mencetak gelas yang bagus.Buang semua
#
,!
dan umpan garis, sehingga kita hanya memiliki spasi dan huruf di dalam gelas (masih diurutkan).Dry run: mencetak jumlah kecocokan ruang diikuti oleh huruf. Ini akan menemukan paling banyak satu kecocokan, dan hanya jika ada spasi dan huruf di dalam gelas, yaitu gelas sebagian besar (penuh / kosong).
Hapus ruang yang berulang kali diikuti oleh surat. Ini "membatalkan" huruf dan spasi, sehingga kita berakhir hanya dengan tipe karakter yang lebih sering muncul di dalam kaca.
Hitung jumlah korek api dari regex ini, yang memberi
1
jika ada ruang yang tersisa (mis. Gelas itu [sebagian besar] kosong) dan0
jika ada yang tidak tersisa (yaitu gelas itu tepat 50% atau lebih dan karenanya [kebanyakan] penuh ).sumber
C, 190 byte
Berkat @ l4m2 untuk menghemat 17 byte!
Output 0 untuk gelas kosong, 1 untuk sebagian besar kosong, 2 untuk sebagian besar penuh, dan 3 untuk penuh.
Pertama loop melalui string input menghitung ruang di dalam kaca, menandai huruf yang ada di dalam kaca, dan mengubah semua huruf menjadi spasi. Kemudian loop melalui string ke belakang menempatkan semua huruf yang ada di gelas di bagian bawah kaca.
Cobalah online!
Belum dibuka:
sumber
i
tampaknya, karena fungsi selalu meninggalkan nilainya pada 0 pada akhirnya.char l[strlen(g)]
jika C99 diperbolehkan, karena lebih pendek dan tidak membuat memori bocort = *p-35 ? t : !t
->t ^= *p==35
jika t selalu 0 atau 1&&(*p=32)
->?*p=32:0
char l[strlen(g)],*p=g
->char*p=g,l[strlen(g)]
Python 2 , 342 byte
Cobalah online!
sumber
Perl 5 , 197 byte
Cobalah online!
Output:
sumber