Вызов Кода - Экологизация Данных Для Печати

  • Автор темы NATALIYAS
  • Обновлено
  • 20, Oct 2024
  • #1

Вдохновлено экофонт.

вызов кода - Экологизация данных для печати

Дана строка, содержащая

 
 
 
 
 
 
 
 
 
 
               ##############            

#####################         

#########################       

#############################     

#################################   

###################################  

##################################### 

####################################  

##################################     
################################        
#############################           
##########################              
#######################                 
######################                  
##########################              
#############################           
###############################         

##################################     

####################################  

##################################### 

###################################  

#################################   

#############################     

##########################      

#####################         

###############            
 
and , output it more eco-friendly by cutting out circles, while keeping it "recognizable" (defined later, in the Circles section). ##################### ####################### ####################### ######################### ######################### ########################### ############################ ############################# ############################## ############################### ################################ ################################# ################################## #################################### ################# ################ ################# ################# ################# ################ ################# ################# ################# ################ ################# ################# ################# ################# ################# ################# ################## ################# ################# ################# ################# ################# ################# ################# ################# ################# ################# ################# ################# ################# ################## ################# ################# ################## ################## ################# ################# ################# ################## ################# ################# ################# ################## ################# ################# ################## ################## ################## ################# ################# ############################################################### ################################################################ ################################################################# ################################################################### ################################################################### ##################################################################### ###################################################################### ###################################################################### ######################################################################## ######################################################################## ########################################################################## ################## ################### ################### ################## ################## ################### ################### ################## ################## ################### ################### ################## ################### ################### ################### ################## ################### ################### ################### ################### ################### ################### ################### ################## ################### ################### #################### ################### ################### ################### #################### ################### ################### ################### #################### ################### ################### ################### #################### ################### ################### ################### #################### ################### #################### ################### #################### ################### ################### ################### представляет черный цвет и представляет белый цвет. Эта программа должна делать что-то вроде этого:

Вход:

################################################## ################################################## ################################################## ################################################## ################################################## ################################################## ################################################## ################################################## ################################################## ################################################## ################################################## ################################################# ################################################# ################################################# ################################################# ################################################ ################################################ ################################################ ############################################### ############################################### ############################################## ############################################## ############################################## ############################################# ############################################ ############################################ ########################################### ########################################### ########################################## ######################################### ######################################### ######################################## ####################################### ###################################### ###################################### ##################################### #################################### ################################### ################################## ################################ ############################### ############################## ############################ ########################### ######################### ####################### ###################### ################### ################# ##############

Пример вывода (довольно плохая оценка):

#

Круги

Это единственные допустимые круги ( #### # ### #### # ## ## ## # #### ### # #### ## ##### s indicating characters that would be cut out):

######## ######## ######## ######## ######## ######## ######## ########

Каждый вырезанный круг должен иметь одинаковый радиус. Под «узнаваемым» я подразумеваю, что между каждым кругом, а также каждым кругом и краем формы (за пределами фигуры) должен быть зазор не менее одного пикселя/точки. # # region):

Снова, # ##### ##### ####### # ##### ##### ##### ##### # ####### ##### ##### # indicates characters that would be cut out, not characters that would be left behind

# # ##### ##### ##### ##### ############## ##### ##### ##### ##### # #

Недействительно, но:

#

Действует. Обратите внимание, что углы считаются соприкасающимися. То есть в

#

два «пикселя» считаются соприкасающимися, поэтому круги не могут соприкасаться таким образом.

Кроме того, просто чтобы еще раз сформулировать это, если у нас есть форма вроде:

# ### ##### ### # # ##### ##### ####### ##### ##### #

Вырезание кругов таким образом недопустимо (они оба касаются края фигуры):

#

Подсчет очков

Ваш результат – это общее количество #################### #### ############### ## ############# ## #### ######## # # ###### ## ## ###### ## # ##### #### #### ###### ######### ###### ########### ######## #################### s left from the specified inputs. Lowest score wins.

Ввод №1:

#################### #################### #################### #################### #################### #################### #################### #################### #################### #################### ####################

Ввод №2:

#

Ввод №3:

#

Примечание: Пошив специально по образцам не допускается.

#вызов кода #упаковка

NATALIYAS


Рег
30 May, 2013

Тем
71

Постов
175

Баллов
530
  • 26, Oct 2024
  • #2

PHP

**ВНИМАНИЕ: впереди английский спагетти и код спагетти **

Хорошо, не уверен, что я все понял, но вот моя попытка.

  • Так что же сделано?
  • Преобразование текстового ввода в изображение. " " = белый пиксель, "#" = красный пиксель. Пример :
  • Нарисуйте дыры внутри изображения, проверяя, чтобы они не пересекались с предыдущим. Пример :

Преобразовать обратное изображение в текст

 
 
 
 
 
 
 
 
               ##############            

##### ##### #########         

######   ###   #### #####       

### ###     #     ##   ######     

####   ###   ###   ##     #######   

####     ### ## ## ####   #########  

### ##   ######   #### ## ########### 

##   ## ## ###     ##   ############  

##     ###   ###   ##     ########     
####   ###     ### ####   ######        
##### ## ##   ## ####### ####           
#######   ## ##   ########              
### ##     ###     ####                 
##   ##   ## ##   ####                  
#     ## ##   ## ## ######              
##   #####     ###   ########           
### ## ####   ###     ## ######         

####   #### ## ##   ##   #########     

##     #####   ## ##     ## ########  

###   #####     #####   ##   ######## 

### #######   ## #### ##     ######  

########### ##   #######   ######   

###########     ####### #####     

##########   #############      

######### ###########         

###############  
 

(не уверен насчет этой красной точки в правом нижнем углу, но он, йоло)

Потратил много времени, потому что не знал, что не могу просто скопировать ресурс GD, выполняя $a = $b.. (он создает ссылку)

Пример :

514 # of 748 remaining

Вход :

1766 # of 2955 remaining

Выход :

Надеюсь, это поразило цель. Очевидно, что мы можем сделать это лучше и правильнее, но, возможно, это поможет другим понять, в чем суть этой проблемы с кодом.

Счет

Вход 1:
До: 2030 "#"
После: 1575 "#"

455 удалено

Вход 2:
До: 2955 "#"
После: 2370 "#"

585 удалено

Вход 3:
До: 748 "#"
После: 618 "#"

130 удалено

Общий :
Ввод «#»: 5733
"#" осталось: 4563 (~80%)

"#" удалено: 1170 (~20%)

;_;

ОКОНЧАТЕЛЬНЫЙ СЧЕТ: 4563

 

Нед


Рег
16 Jun, 2011

Тем
78

Постов
203

Баллов
643
  • 26, Oct 2024
  • #3

Питон 2.7

1102 # of 2030 remaining

Ожидает, что входной файл будет передан через командную строку, например. 5 я реализовал

  • 2 варианта запуска:
  • Использование маленькой формы
  • Использование большой формы
  • Чередование маленькой и большой формы.
  • Случайное чередование маленькой и большой формы.

Совершенно случайно

Я просто сканирую ввод, начиная с левого верхнего угла, и фигура вырезается как можно скорее.

import sys,random,copy def char2val(c): if (c=='#'): return 1 # this is the shape itself elif (c=='o'): return 2 # this is the boundary, for collision detection else: return 0 def val2char(v): if (v==0): return ' ' else: return '#' # convert string to array for processing def str2arr(s): arr = [] for line in s.split('\n'): arr.append( [ char2val(c) for c in line ] ) return arr # convert array to string for output purposes def arr2str(arr): s="" for i in range(len(arr)): for j in range(len(arr[i])): s+=val2char(arr[i][j]) s+="\n" return s # check if a cut we want to make is a valid one def validate_cut(arr,shape,r,c): valid = True for i in range(len(shape)): for j in range(len(shape[i])): if shape[i][j] == 1: #hard cut here valid = ( 0 < i+r < len(arr)-1 ) and ( 0 < j+c < len(arr[i+r])-1) # bounds check valid = valid and ( arr[i+r][j+c]==1) # site must be cut-able elif shape[i][j]==2: #edge of shape valid = ( 0 <= i+r <= len(arr)-1 ) and ( 0 <= j+c <= len(arr[i+r])-1) # bounds check, edge allowed to lie on border valid = valid and arr[i+r][j+c]!=0 # edge cannot go into cut/empty space if not valid: return False return valid def cut(arr,shape,r,c): # cut shape from arr, @ position r,c for i in range(len(shape)): for j in range(len(shape[i])): if (shape[i][j] > 0): arr[i+r][j+c] -= shape[i][j] def run(inarr,opt=0): arr = copy.deepcopy(inarr) for r in range(len(arr)): for c in range(len(arr[r])): if (opt==0): shape = c1arr elif (opt==1): shape = c2arr else: raise Exception("run option not supported!") if validate_cut(arr,shape,r,c): cut(arr,shape,r,c) return arr # global variables for the shapes,... # \# are the shapes themselves # o is the boundary used for collision detection c1 = \ "\ ooo \n\ oo#oo \n\ oo###oo\n\ o#####o\n\ oo###oo\n\ oo#oo \n\ ooo \ " c2 = \ "\ ooo \n\ ooo#ooo \n\ o#####o \n\ oo#####oo\n\ o#######o\n\ oo#####oo\n\ o#####o \n\ ooo#ooo \n\ ooo \ " c1arr = str2arr(c1) c2arr = str2arr(c2) def main(): #input processing random.seed('117') f = file(sys.argv[1],"r") inp = f.read().rstrip('\n') #input string inarr = str2arr(inp) #convert string to array #run the algorithm arr0 = run(inarr,opt=0) arr1 = run(inarr,opt=1) minarr = arr0 if arr2str(arr0).count('#') < arr2str(arr1).count('#') else arr1 #output print arr2str(minarr) print " %d # of %d remaining " % (arr2str(minarr).count('#'),inp.count('#')) main()

Сами формы можно довольно легко изменить.

Результаты

python thisscript.py input1.txt

Вход1

############## ##################### ########## ###### ####### ########### #### ######## ######## ### ## ######### ######## ### #### ########### ######## ### ###### ############# ##### ### ######################## ##### ### ###################### ##### ######## ############# ###### ######## ######### ####### ######## ##### ############# ### ### ############ ### ### ###### #### ########## ##### #### ############## #### #### ###### ########## #### ########### ############# #### ########### #### ########## ########## ###### #### ########## ######## ###### #### ######## ###### ########### ######## ##### ############# ####### #### ##################### ##################### ###############

Вход2

############## ##################### ######################### ############################# ################################# ################################### ##################################### #################################### ################################## ################################ ############################# ########################## ####################### ###################### ########################## ############################# ############################### ################################## #################################### ##################################### ################################### ################################# ############################# ########################## ##################### ###############

Вход3

<?php /* Check collision between white pixels in 2 images. */ function checkCollision ($img1, $img2, $width, $height, $circle_x, $circle_y, $circle_size) { $start_x = $circle_x - round($circle_size / 2); if ($start_x < 0) return false; $stop_x = $circle_x + round($circle_size / 2); if ($stop_x > ($width - 1)) return false; $start_y = $circle_y - round($circle_size / 2); if ($start_y < 0) return false; $stop_y = $circle_y + round($circle_size / 2); if ($stop_y > ($height - 1)) return false; $color_white = array("red" => 255, "green" => 255, "blue" => 255, "alpha" => 0 ); for ($y = $start_y; $y < $stop_y - 1; $y++) for ($x = $start_x; $x < $stop_x - 1; $x++) { $pixel_img1 = imagecolorsforindex($img1, imagecolorat($img1, $x, $y)); $pixel_img2 = imagecolorsforindex($img2, imagecolorat($img2, $x, $y)); if ($pixel_img1 == $pixel_img2 && $pixel_img1 == $color_white) return false; } return true; } $input = file_get_contents("input.txt"); $lines = explode("\n", $input); $image_width = strlen($lines[0]); $image_height = count($lines); $circle_size = 5; /* Creating an image matching dimensions and some colors. */ $img = imagecreatetruecolor($image_width, $image_height); $color_red = imagecolorallocate($img, 255, 0, 0); $color_white = imagecolorallocate($img, 255, 255, 255); /* Filling the freshly created image. '#' is replaced by a red pixel, ' ' by a white one. */ for ($y = 0; $y < $image_height; $y++) { $line = $lines[$y]; for ($x = 0; $x < strlen($line); $x++) if ($line[$x] == '#') imagesetpixel($img, $x, $y, $color_red); else imagesetpixel($img, $x, $y, $color_white); } /*Try to draw a circle on any red pixel then check if it not collides with any other white space before commiting */ for ($y = 0; $y < $image_height; $y++) for ($x = 0; $x < $image_width; $x++) { $img_tmp = imagecreatetruecolor($image_width, $image_height); imagecopy($img_tmp, $img, 0, 0, 0, 0, $image_width, $image_height); imagefilledellipse($img_tmp, $x, $y, ($circle_size + 2), ($circle_size + 2), $color_white); if (checkCollision ($img, $img_tmp, $image_width, $image_height, $x, $y, ($circle_size + 2))) imagefilledellipse($img, $x, $y, $circle_size, $circle_size, $color_white); } /* Convert image to text */ $output = ""; $color_white = array("red" => 255, "green" => 255, "blue" => 255, "alpha" => 0 ); for ($y = 0; $y < $image_height; $y++) { for ($x = 0; $x < $image_width; $x++) { $pixel_img = imagecolorsforindex($img, imagecolorat($img, $x, $y)); if ($pixel_img == $color_white) $output = $output . " "; else $output = $output . "#"; } $output = $output . "\n"; } file_put_contents("output.txt", $output) ?>

Полный вывод для input3:

 

Ole_tver


Рег
14 Mar, 2011

Тем
68

Постов
184

Баллов
544
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно